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

如何利用S3存储桶中的训练数据训练YOLOv8?

基于S3在YOLOv8中训练的实现方法

方法一:挂载S3到本地(最简单直接)

直接把S3桶里的数据集挂载或同步到本地,就能像用本地数据集一样写data.yml:

  • 安装依赖:pip install s3fs
  • 挂载S3为本地虚拟目录:
    import s3fs
    # 初始化S3文件系统(需提前配置AWS凭证,比如~/.aws/credentials或环境变量)
    fs = s3fs.S3FileSystem(anon=False)
    # 将S3数据集路径挂载到本地/mnt/s3-dataset
    fs.mount('s3://your-bucket/dataset/', '/mnt/s3-dataset')
    
  • 编写data.yml:
    train: /mnt/s3-dataset/train
    val: /mnt/s3-dataset/val
    nc: 你的类别数量
    names: ['类别1', '类别2', ...]
    
  • 正常启动训练:model.train(data='data.yml', epochs=50)

方法二:自定义Dataset类直接读取S3(无需本地挂载)

如果不想挂载,可扩展YOLOv8的Dataset类实现S3直接读取:

  • 安装依赖:pip install boto3 pillow
  • 自定义数据集类:
    from ultralytics.data.dataset import YOLODataset
    from ultralytics.data.utils import img2label_paths
    import boto3
    from PIL import Image
    import io
    
    class S3YOLODataset(YOLODataset):
        def __init__(self, *args, s3_bucket=None, **kwargs):
            super().__init__(*args, **kwargs)
            self.s3 = boto3.client('s3')
            self.bucket = s3_bucket
    
        # 重写图片加载逻辑,从S3读
        def load_image(self, i, rect_mode=False):
            img_path = self.im_files[i]
            bucket, key = img_path.replace('s3://', '').split('/', 1)
            response = self.s3.get_object(Bucket=bucket, Key=key)
            img = Image.open(io.BytesIO(response['Body'].read())).convert('RGB')
            if rect_mode:
                img = self.rect_image(img)
            return img, img_path
    
        # 重写标签加载逻辑,从S3读
        def get_labels(self):
            label_paths = img2label_paths(self.im_files)
            labels = []
            for path in label_paths:
                bucket, key = path.replace('s3://', '').split('/', 1)
                response = self.s3.get_object(Bucket=bucket, Key=key)
                label_content = response['Body'].read().decode('utf-8')
                labels.append(self.parse_label(label_content, path))
            return labels
    
  • 启动训练:
    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    # 初始化训练/验证数据集
    train_dataset = S3YOLODataset(
        s3_bucket='your-bucket',
        img_path='s3://your-bucket/train/images',
        label_path='s3://your-bucket/train/labels',
        augment=True
    )
    val_dataset = S3YOLODataset(
        s3_bucket='your-bucket',
        img_path='s3://your-bucket/val/images',
        label_path='s3://your-bucket/val/labels',
        augment=False
    )
    # 开始训练
    model.train(dataset=train_dataset, val=val_dataset, epochs=50)
    

注意事项

  • 提前配置AWS凭证:可通过~/.aws/credentials文件,或设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量。
  • 大规模数据集建议用挂载方法,或开启YOLOv8的cache='ram'/cache='disk'(本地有足够空间时),减少S3请求次数。
  • 自定义Dataset时,确保S3路径格式为s3://bucket/xxx,避免路径解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:19:54