如何使用Python和FiftyOne API将文件上传至S3
FiftyOne 数据集自动同步S3流水线实现方案
FiftyOne 官方Zoo数据集加载逻辑默认会将文件缓存到本地,没有内置直接上传S3的接口,不需要修改源码,用临时缓存+流式上传的方案即可实现需求,稳定性和开发成本最优。
方案1:最小改动实现(适合中小批量数据场景)
你现有代码加载得到的dataset对象中,每个样本的filepath字段已经存储了下载后文件的本地绝对路径,直接遍历上传即可,无需手动查找默认缓存目录。
- 先安装依赖:
pip install fiftyone boto3 - 完整实现代码:
import os import boto3 import fiftyone as fo import fiftyone.zoo as foz # 初始化S3客户端,提前通过环境变量/~/.aws/credentials配置访问密钥 s3_client = boto3.client("s3") TARGET_BUCKET = "替换为你的S3桶名" S3_STORAGE_PREFIX = "datasets/open-images-pets/" # 原有数据集加载逻辑保持不变 dataset = foz.load_zoo_dataset( "open-images-v6", split="validation", classes=["Cat", "Dog"], max_samples=100, label_types=["detections"], seed=51, dataset_name="open-images-pets" ) # 遍历样本上传至S3 for sample in dataset: local_file_path = sample.filepath file_name = os.path.basename(local_file_path) s3_object_key = os.path.join(S3_STORAGE_PREFIX, file_name) # 执行上传 s3_client.upload_file(local_file_path, TARGET_BUCKET, s3_object_key) # 无需保留本地文件的话,上传完成直接删除释放磁盘空间 os.remove(local_file_path) # 可选:将S3路径写回样本元数据,后续可直接从S3加载数据集 sample["s3_uri"] = f"s3://{TARGET_BUCKET}/{s3_object_key}" sample.save() # 可选:导出标注文件一并上传到S3 temp_anno_path = "./temp_annotations" dataset.export( export_dir=temp_anno_path, dataset_type=fo.types.COCODetectionDataset, ) # 遍历标注目录上传所有文件 for root, _, files in os.walk(temp_anno_path): for file in files: local_p = os.path.join(root, file) rel_p = os.path.relpath(local_p, temp_anno_path) s3_k = os.path.join(S3_STORAGE_PREFIX, "annotations", rel_p) s3_client.upload_file(local_p, TARGET_BUCKET, s3_k)
方案2:零本地磁盘占用实现(适合大批量数据场景)
如果单次拉取的数据量很大,不想占用本地磁盘空间,可以在加载数据集时指定dataset_dir为内存文件系统路径,其余上传逻辑和方案1完全一致:
- Linux系统直接用
/dev/shm/fiftyone_cache作为缓存目录,文件存在内存中,读写速度更快,设备重启后自动清空,不需要手动删除缓存 - macOS系统可以挂载自定义RAM磁盘,Windows系统可开启ImDisk虚拟内存盘
优化提示
- 不需要强行修改FiftyOne源码实现“直传”,Zoo数据集本身的加载逻辑就是先拉取原始媒体文件再解析标注,硬改源码会带来版本兼容问题,临时缓存的性能损耗可以忽略。
- 如果需要做完全自动化的流水线,可以将上传逻辑封装为FiftyOne的数据集新增样本钩子,每次向数据集追加样本时自动触发上传,不需要手动执行遍历脚本。
- FiftyOne原生支持直接读取S3路径的媒体文件,后续使用时只要将样本的filepath字段替换为对应的S3 URI,配置好S3访问权限即可直接加载,不需要重复下载到本地。
内容的提问来源于stack exchange,提问作者Amdbi
相关产品推荐
相关产品推荐

