RPC数据集整理与 Scalabel 标注说明
1. RPC 数据集简介
RPC(Retail Product Checkout Dataset )是一个面向自动结算(ACO, Automatic Checkout)场景的大规模零售商品数据集,核心目标是从结算台图像中自动识别商品并生成购物清单。
RPC 的特点在于:它同时包含受控环境下的单商品图像 与真实结算场景下的多商品图像,因此既适合做商品分类,也适合做检测、计数、检索与结算场景理解。
1.1 数据集关键特征
根据 RPC 官方项目页与论文:
- 共包含 200 个 SKU(细粒度商品类别)
- 这 200 个 SKU 被组织为 17 个 meta-categories(元类别)
- 同时提供:
- 训练集(Exemplar images):单商品图
- 验证集(Checkout images):多商品结算图
- 测试集(Checkout images):多商品结算图
- Checkout 图像提供了多层级标注,可用于检测、定位、分类和自动结算任务
1.2 官方划分规模
RPC 官方项目页给出的数据规模如下:
| Split | 图像数 | 目标数 | 平均每图目标数 | 平均每图类别数 |
|---|---|---|---|---|
| Training set (Exemplar images) | 53,739 | 53,739 | 1.00 | 1.00 |
| Validation set (Checkout images) | 6,000 | 73,602 | 12.27 | 6.33 |
| Test set (Checkout images) | 24,000 | 294,333 | 12.26 | 6.31 |
另外,验证集与测试集按 clutter level(拥挤程度)还可分为:
| Clutter mode | 图像数 | 目标数 | 平均每图目标数 | 平均每图类别数 |
|---|---|---|---|---|
| Easy | 10,000 | 71,496 | 7.15 | 3.81 |
| Medium | 10,000 | 122,961 | 12.30 | 6.27 |
| Hard | 10,000 | 173,478 | 17.35 | 8.87 |
2. RPC 的类别体系
RPC 共有 200 个 SKU,官方论文将其划分为 17 个元类别(meta-categories):
- puffed food
- dried fruit
- dried food
- instant drink
- instant noodles
- dessert
- drink
- alcohol
- milk
- canned food
- chocolate
- gum
- candy
- seasoner
- personal hygiene
- tissue
- stationery
你当前提供的 instances_val2019.json 中也能看到这一结构:
categories 中保存了 id / name / supercategory,例如:
{"id": 1, "name": "1_puffed_food", "supercategory": "puffed_food"}{"id": 79, "name": "79_alcohol", "supercategory": "alcohol"}{"id": 200, "name": "200_stationery", "supercategory": "stationery"}
此外,这个 JSON 里还额外带有 __raw_Chinese_name_df,其中包含:
category_idsku_namesku_classname(中文商品名)clas(中文大类名)knowncodeshelfnum
这对于后续把 RPC 转成中文目录名分类集、做可视化、或者生成 Scalabel 的类别显示名称都很有帮助。
3. RPC 原始标注结构(COCO 风格)
RPC 的常见标注文件如:
instances_train2019.jsoninstances_val2019.jsoninstances_test2019.json
整体上是 COCO 风格 JSON,核心字段包括:
json
{
"info": {...},
"licenses": [...],
"categories": [...],
"images": [...],
"annotations": [...]
}
3.1 images
每张图像通常包含:
json
{
"id": 123,
"file_name": "xxx.jpg",
"width": 800,
"height": 800
}
3.2 annotations
每个实例通常包含:
json
{
"id": 456,
"image_id": 123,
"category_id": 79,
"bbox": [x, y, w, h],
"area": 12345.6,
"iscrowd": 0
}
其中:
image_id:关联到images[*].idcategory_id:关联到categories[*].idbbox = [x, y, w, h]:左上角坐标 + 宽高area:目标面积iscrowd:是否为 crowd 实例
3.3 训练 / 验证 / 测试图像语义
- train2019:单商品图像(exemplar images),通常每张图对应一个商品类别
- val2019/test2019:结算场景图像(checkout images),每张图有多个商品实例框
因此在工程上常见两种转换方向:
-
RPC -> YOLO 检测集
使用
val/test/train中的bbox生成检测标签 -
RPC -> YOLO 分类集
train2019直接作为单商品分类样本val/test通过bbox crop裁成单商品 patch 作为分类验证/测试样本
4. Scalabel 简介
Scalabel 是一个开源、可扩展的视觉标注平台,支持 2D/3D 标注、目标检测框、实例分割、多边形、轨迹等多种标注形式。
其文档说明中,Scalabel 的数据格式本质上由 frame 列表 组成,每个 frame 可以包含图像信息和该图像上的多个 labels。
对于 2D 目标检测最关键的字段是:
frame.nameframe.urlframe.labelslabel.idlabel.categorylabel.box2d = {x1, y1, x2, y2}
如果只做 RPC 商品框标注,通常只需要使用 2D Bounding Box 子集即可。
5. Scalabel 标注格式(适配 RPC 的最小必要字段)
一个最小可用的 Scalabel 2D 检测标注文件,通常可以写成一个 frame 数组:
json
[
{
"name": "20180827-10-42-32-575.jpg",
"url": "images/20180827-10-42-32-575.jpg",
"videoName": "",
"frameIndex": 0,
"labels": [
{
"id": "ann_50196",
"category": "187_tissue",
"attributes": {},
"manualShape": true,
"manualAttributes": true,
"box2d": {
"x1": 120.0,
"y1": 80.0,
"x2": 240.0,
"y2": 300.0
}
}
]
}
]
其中:
5.1 Frame 级字段
name:图像文件名url:图像相对路径或绝对路径videoName:图像任务一般可为空frameIndex:图像任务可用索引占位labels:该图像上全部标注对象
5.2 Label 级字段
id:实例 ID,可直接用 RPC 的annotation.idcategory:类别名,可用:categories[*].name(英文 SKU 名)- 或
__raw_Chinese_name_df.name(中文商品名)
manualShape:是否人工绘制框manualAttributes:是否人工标注属性attributes:扩展属性,可为空字典box2d:检测框,要求是(x1, y1, x2, y2)而不是 COCO 的(x, y, w, h)
6. RPC COCO -> Scalabel 的字段映射
RPC 原始标注是 COCO 风格,而 Scalabel 检测标注更接近 frame-label 结构。
二者转换关系可整理如下:
| RPC 字段 | 含义 | Scalabel 字段 | 说明 |
|---|---|---|---|
images[i].file_name |
图像文件名 | frame.name |
建议保留原文件名 |
| 图像相对路径 | 图像路径 | frame.url |
可填相对路径 |
images[i].id |
图像 ID | - | 作为中间关联键 |
annotations[j].id |
实例 ID | label.id |
建议转为字符串 |
annotations[j].category_id |
类别 ID | label.category |
需查 categories 或中文名映射 |
annotations[j].bbox[0] |
x | box2d.x1 |
左上角 x |
annotations[j].bbox[1] |
y | box2d.y1 |
左上角 y |
annotations[j].bbox[0]+bbox[2] |
x+w | box2d.x2 |
右下角 x |
annotations[j].bbox[1]+bbox[3] |
y+h | box2d.y2 |
右下角 y |
annotations[j].iscrowd |
crowd 标记 | attributes.iscrowd |
可选扩展属性 |
categories[k].name |
英文类名 | label.category |
最常用 |
__raw_Chinese_name_df.name |
中文商品名 | label.attributes.cn_name 或 label.category |
适合中文项目 |
7. 推荐的 RPC -> Scalabel 组织方式
如果目标是把 RPC 转为 Scalabel 标注项目,建议目录组织如下:
text
rpc_scalabel_project/
├── images/
│ ├── val2019/
│ ├── test2019/
│ └── train2019/
├── annotations/
│ ├── rpc_val_scalabel.json
│ ├── rpc_test_scalabel.json
│ └── rpc_train_scalabel.json
└── meta/
├── classes.txt
├── class_id_map.csv
└── class_id_map.json
其中:
images/:存原图annotations/*.json:Scalabel 读取的 frame-label 标注文件meta/:额外保存 RPC 的类别映射、中文名映射等
8. RPC 转 Scalabel 的实现要点
8.1 COCO bbox 转换为 Scalabel box2d
RPC COCO:
python
x, y, w, h = ann["bbox"]
Scalabel:
python
box2d = {
"x1": float(x),
"y1": float(y),
"x2": float(x + w),
"y2": float(y + h),
}
8.2 类别名选择策略
推荐三种模式:
-
英文 SKU 名
- 直接用
categories[*].name - 如:
187_tissue
- 直接用
-
中文商品名
- 从
__raw_Chinese_name_df根据category_id查找name - 如:
维他低糖原味豆奶250ml
- 从
-
双语模式
label.category = 英文名label.attributes.cn_name = 中文名- 最适合工具链兼容与人工核查兼顾
8.3 可选属性扩展
Scalabel 的 attributes 可扩展,因此在 RPC 场景中可以加入:
json
{
"attributes": {
"category_id": 103,
"supercategory": "milk",
"cn_name": "维他低糖原味豆奶250ml",
"cn_class": "奶制品",
"known": true,
"code": "4891028707851"
}
}
这样可以让 Scalabel 项目同时承担"可视化标注浏览器"和"零售商品元数据查看器"的角色。
9. Scalabel 标注文件示例(适配 RPC)
下面给出一个更完整的 RPC -> Scalabel 示例:
json
[
{
"name": "20180827-10-42-32-575.jpg",
"url": "images/val2019/20180827-10-42-32-575.jpg",
"videoName": "",
"frameIndex": 0,
"labels": [
{
"id": "50196",
"category": "187_tissue",
"attributes": {
"category_id": 187,
"supercategory": "tissue",
"cn_name": "某纸巾商品中文名",
"cn_class": "纸品"
},
"manualShape": true,
"manualAttributes": true,
"box2d": {
"x1": 120.0,
"y1": 80.0,
"x2": 240.0,
"y2": 300.0
}
},
{
"id": "50197",
"category": "79_alcohol",
"attributes": {
"category_id": 79,
"supercategory": "alcohol",
"cn_name": "喜力啤酒500ml",
"cn_class": "酒"
},
"manualShape": true,
"manualAttributes": true,
"box2d": {
"x1": 260.0,
"y1": 90.0,
"x2": 330.0,
"y2": 310.0
}
}
]
}
]
10. RPC 数据整理建议
10.1 如果目标是目标检测
建议保留:
images/instances_*.jsonclass_id_map- COCO -> YOLO / COCO -> Scalabel 的转换脚本
10.2 如果目标是商品分类
建议整理为:
train/类名/*.jpgval/类名/*.jpgtest/类名/*.jpg
其中 val/test 可由 checkout 图按 bbox 裁剪得到。
10.3 如果目标是可视化审阅
建议优先转成 Scalabel,因为它更适合:
- 浏览每张图的所有商品框
- 用英文/中文类名审阅
- 扩展属性字段
- 后续人工修订标注
11. 小结
RPC 是一个非常适合零售商品检测、分类与自动结算研究的数据集。
它的标注原生是 COCO 风格,因此非常适合做检测训练;同时由于训练集为单商品图,RPC 也非常适合作为细粒度商品分类数据源。
若希望将 RPC 用于可视化标注管理、人工复核和后续二次修订,那么将其转换为 Scalabel 2D box 标注格式 是一个很自然的选择。
核心转换工作并不复杂,重点只有两点:
- 将 COCO 的
bbox = [x, y, w, h]转为 Scalabel 的box2d = {x1, y1, x2, y2} - 用
category_id关联categories与__raw_Chinese_name_df,生成更友好的类别显示名称与属性信息
12. 参考资料
- RPC 官方项目页:RPC: A Large-Scale and Fine-Grained Retail Product Checkout Dataset
- RPC 论文:arXiv:1901.07249
- Scalabel 官方文档:Scalabel Format / Quick Start
- RPC提供的
instances_val2019.json,其中包含:categoriesimagesannotations__raw_Chinese_name_df