You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从AWS S3读取图像到SageMaker Jupyter实例及技术咨询

解决方案:在SageMaker中访问S3图像数据集并构建CNN

嘿,作为过来人,我刚接触SageMaker时也在S3数据访问上踩过坑,针对你的三个问题,给你一步步梳理:

1. 如何从SageMaker Jupyter实例简单访问S3存储桶中的图像数据集

首先要确保你的SageMaker实例的IAM角色有访问目标S3桶的权限:

  • 打开IAM控制台,找到你创建的那个SageMaker角色(比如AmazonSageMaker-ExecutionRole-xxxx)
  • 给它添加一个自定义权限策略,只允许访问你的Iphone_Classifier桶(比全量S3权限更安全):
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::Iphone_Classifier",
                    "arn:aws:s3:::Iphone_Classifier/*"
                ]
            }
        ]
    }
    

权限搞定后,有几种简单的访问方式:

  • 直接用boto3读取图像到内存
  • 用s3fs把S3桶挂载成实例上的本地目录(像操作本地文件一样)
  • 用SageMaker内置工具批量下载文件到实例

2. 访问S3图像的参考代码

以下是适配你的conda_tensorflow2_p36环境的实用代码示例:

方式1:用boto3 + Pillow直接读取单张图像到内存

import boto3
from PIL import Image
import io

# SageMaker实例会自动用IAM角色认证,无需手动配置密钥
s3 = boto3.client('s3')

# 读取一张Yes类的训练图
bucket_name = "Iphone_Classifier"
file_key = "Train/Yes_iphone_images/sample_iphone.jpg"

# 获取文件对象并转为PIL图像
response = s3.get_object(Bucket=bucket_name, Key=file_key)
image_data = response['Body'].read()
image = Image.open(io.BytesIO(image_data))

# 验证图像读取成功
print(f"图像尺寸:{image.size},图像模式:{image.mode}")

方式2:用s3fs挂载S3桶到本地目录

先安装依赖(在Notebook单元格中执行):

!pip install s3fs

然后挂载并遍历图像:

import s3fs
from PIL import Image

# 挂载S3桶
fs = s3fs.S3FileSystem(anon=False)
bucket_root = "s3://Iphone_Classifier"

# 遍历Train/Yes_iphone_images下的前5张图
yes_train_files = fs.glob(f"{bucket_root}/Train/Yes_iphone_images/*.jpg")[:5]
for img_path in yes_train_files:
    with fs.open(img_path, 'rb') as f:
        img = Image.open(f)
        print(f"路径:{img_path.split('/')[-1]},尺寸:{img.size}")

方式3:用SageMaker工具批量下载到实例本地

from sagemaker.s3 import S3Downloader
import os
from PIL import Image

# 下载整个Train文件夹到实例的本地data目录
local_train_dir = "./data/Train"
S3Downloader.download(
    s3_uri="s3://Iphone_Classifier/Train",
    local_path=local_train_dir
)

# 之后就可以像读取本地文件一样操作
yes_local_path = f"{local_train_dir}/Yes_iphone_images"
for img_name in os.listdir(yes_local_path)[:5]:
    img = Image.open(os.path.join(yes_local_path, img_name))
    print(f"本地图像:{img_name},尺寸:{img.size}")

3. 将数据复制到Notebook还是直接从S3操作更优?

这取决于你的数据集规模和训练需求:

  • 优先复制到实例本地(适合你的当前场景):
    • 你的数据集总共2230张图,体积不大,复制到实例后训练时的IO速度更快,避免S3网络延迟
    • 操作更符合本地开发习惯,不需要额外处理S3路径逻辑
    • 注意:SageMaker实例的存储是临时的,停止实例后数据会丢失,训练完成后记得把模型、结果等重要文件上传回S3
  • 直接从S3操作(适合大数据集):
    • 如果数据集超过实例存储容量(比如几十万张图),或者需要分布式训练,直接从S3读取更合适
    • 可以用TensorFlow的tf.data.Dataset配合S3路径,或者SageMaker的管道模式(Pipe Mode)高效读取数据
    • 优点是节省实例存储成本,数据始终保存在S3,不会丢失

总结:你现在的数据集规模很小,复制到实例本地是更高效的选择,训练完记得把模型和评估结果同步回S3就行。

内容的提问来源于stack exchange,提问作者Joker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:12:55