Label Studio 导入 Roboflow COCO 数据集(S3 存储)最佳实践

Label Studio 导入 Roboflow COCO 数据集(S3 存储)最佳实践
xu756Label Studio 导入 Roboflow COCO 数据集(S3 存储)最佳实践
本文档总结了一套已验证有效的流程,用于将 Roboflow Universe 导出的 COCO 格式数据集导入 Label Studio,并利用 S3 存储提供图片访问。
✅ 适用场景
-
数据集来源:Roboflow Universe 导出的 COCO JSON 格式(含
_annotations.coco.json和图片) -
存储方式:Amazon S3(或其他兼容 S3 协议的对象存储)
-
Label Studio 版本:社区版(已验证,支持
label-studio-converter和 S3 源存储)
📋 前提条件
-
已安装
label-studio-sdk(包含label-studio-converter工具):1
pip install label-studio-sdk
或直接安装转换器:
1
pip install label-studio-converter
-
具备 AWS S3 访问权限:
- 有读写(或至少读取)权限的
Access Key ID和Secret Access Key - 知道桶所在区域(Region)
- 有读写(或至少读取)权限的
-
Label Studio 实例已正确配置 S3 存储(参考下文步骤四)
🚀 完整操作步骤
步骤一:从 Roboflow 下载数据集
-
在 Roboflow Universe 数据集页面,点击 Download Dataset。
-
在导出格式中选择 COCO JSON(
COCO选项),下载.zip压缩包。 -
解压后,你会得到:
- 图片文件夹(如
train/、valid/、test/) - 标注文件
_annotations.coco.json
- 图片文件夹(如
步骤二:上传数据到 S3
推荐将整个解压后的文件夹内容上传到 S3 桶的某个目录下,保持相对结构不变。例如,假设你的桶名为 google,目标路径为:
1 | s3://google/0801/potato-detect.v1i.coco/ |
注意:
_annotations.coco.json与train/等目录同级,即都在0801/potato-detect.v1i.coco/下。
步骤三:转换 COCO JSON 为 Label Studio 任务格式
使用 label-studio-converter 将标准 COCO 格式转换为 Label Studio 可直接导入的 JSON 文件。
⚠️ 关键:--image-root-url 参数决定了任务中 data.image 的值。我们推荐使用绝对 S3 URL(已验证有效),这样 Label Studio 可以直接通过这些 URL 访问图片,无需依赖存储配置中的 Prefix 和预签名 URL。
1 | label-studio-converter import coco \ |
参数说明:
-
-i:输入的 COCO JSON 文件路径 -
-o:输出的 Label Studio 任务 JSON 文件名 -
--image-root-url:图片的根 URL,这里使用 S3 绝对路径。末尾必须包含/,因为 COCO 中的file_name只有文件名,拼接后形成完整对象键。
执行成功后会生成:
-
label_studio_tasks.json:任务列表 -
label_studio_tasks.label_config.xml:对应的标签配置(可选)
步骤四:在 Label Studio 中配置 S3 源存储
尽管我们使用了绝对 S3 URL,仍需在 Label Studio 项目中添加 S3 源存储,以便系统能够访问这些文件(例如生成预签名 URL 或通过代理)。配置如下:
-
进入项目 → Settings → Cloud Storage → Add Source Storage
-
选择 Amazon S3,填写:
- Bucket Name:
google - Region Name:你的桶所在区域(如
us-east-1) - Access Key ID / Secret Access Key:有读取权限的密钥
- Bucket Prefix:留空(因为
data.image已包含完整路径) - Import Method:
Tasks(我们手动导入 JSON) - Use pre-signed URLs:不建议勾选(因为我们使用绝对 URL,不再需要额外签名;若勾选可能干扰)
- Bucket Name:
-
点击 Add Storage 保存。
若使用相对路径(如
--image-root-url train/),则需:
Bucket Prefix设为0801/potato-detect.v1i.coco(不含/train)- 勾选
Use pre-signed URLs- 并配置 CORS 和时间同步(见附录)
步骤五:导入转换后的 JSON 文件
-
在 Label Studio 项目页面,进入 Data Manager。
-
点击 Import 按钮。
-
选择本地生成的
label_studio_tasks.json文件上传。 -
等待导入完成,你会看到所有任务显示在列表中。
步骤六:验证
-
点击任意任务,图片应正常加载(直接从 S3 读取)。
-
如果有预标注框(来自 Roboflow 的原始标注),它们会以 预标注(Predictions) 形式显示在图片上,方便你直接审查或修正。
🧩 故障排除指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| SignatureDoesNotMatch | ① 密钥/区域错误 ② 服务器时间偏差大 ③ 使用了临时 STS 凭证 |
① 检查密钥和区域是否完全匹配桶属性 ② 同步服务器时间(NTP) ③ 使用长期 IAM 密钥 |
| 图片无法加载(403) | 桶未公开,且未使用预签名 URL | ① 如果使用绝对 URL,确保桶已设置 CORS 允许你的 Label Studio 域名 ② 或在 S3 存储配置中启用预签名 URL,并改用相对路径 |
转换后 JSON 中 data.image 路径不对 |
--image-root-url 末尾缺少 / 或路径层级错误 |
确保 URL 以 / 结尾,且正确指向 train 目录 |
| 导入后任务数为 0 | JSON 格式不符或空 | 检查 _annotations.coco.json 是否有 images 和 annotations 数据;运行转换时查看日志中的图片和标注数量 |
| 预标注不显示 | 转换时未指定 --out-type predictions(默认生成 annotations) |
若希望作为预标注,添加 --out-type predictions 参数 |
📦 一键式脚本(供后续复用)
将以下命令保存为 convert.sh,替换 _annotations.coco.json 路径和 S3 根 URL 即可:
1 |
|
然后:
-
在 Label Studio 中配置相同的 S3 存储(Bucket Prefix 留空)。
-
导入生成的
label_studio_tasks.json。
📚 参考链接
🎉 总结
通过绝对 S3 URL 方式,我们绕过了复杂的预签名 URL 和时间同步问题,使导入过程稳定且可重复。记住关键点:
-
转换时
--image-root-url必须写完整的 S3 对象前缀(以/结尾) -
Label Studio 的 S3 存储中
Bucket Prefix留空,且不启用预签名 URL -
确保 S3 桶的 CORS 策略允许你的 Label Studio 域名访问(详见附录)
按照此文档操作,即可快速将 Roboflow 数据集无缝导入 Label Studio 进行标注或复审。
附录:S3 CORS 策略示例(允许 Label Studio 域名)
1 | [ |
如有其他问题,欢迎查阅官方文档或提交 Issue。Happy Labeling! 🚀







