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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:51:24