如何利用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
相关产品推荐
相关产品推荐

