RPC数据集整理与 Scalabel 标注说明

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):

  1. puffed food
  2. dried fruit
  3. dried food
  4. instant drink
  5. instant noodles
  6. dessert
  7. drink
  8. alcohol
  9. milk
  10. canned food
  11. chocolate
  12. gum
  13. candy
  14. seasoner
  15. personal hygiene
  16. tissue
  17. 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_id
  • sku_name
  • sku_class
  • name(中文商品名)
  • clas(中文大类名)
  • known
  • code
  • shelf
  • num

这对于后续把 RPC 转成中文目录名分类集、做可视化、或者生成 Scalabel 的类别显示名称都很有帮助。

3. RPC 原始标注结构(COCO 风格)

RPC 的常见标注文件如:

  • instances_train2019.json
  • instances_val2019.json
  • instances_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[*].id
  • category_id:关联到 categories[*].id
  • bbox = [x, y, w, h]:左上角坐标 + 宽高
  • area:目标面积
  • iscrowd:是否为 crowd 实例

3.3 训练 / 验证 / 测试图像语义

  • train2019:单商品图像(exemplar images),通常每张图对应一个商品类别
  • val2019/test2019:结算场景图像(checkout images),每张图有多个商品实例框

因此在工程上常见两种转换方向:

  1. RPC -> YOLO 检测集

    使用 val/test/train 中的 bbox 生成检测标签

  2. RPC -> YOLO 分类集

    • train2019 直接作为单商品分类样本
    • val/test 通过 bbox crop 裁成单商品 patch 作为分类验证/测试样本

4. Scalabel 简介

Scalabel 是一个开源、可扩展的视觉标注平台,支持 2D/3D 标注、目标检测框、实例分割、多边形、轨迹等多种标注形式。

其文档说明中,Scalabel 的数据格式本质上由 frame 列表 组成,每个 frame 可以包含图像信息和该图像上的多个 labels。

对于 2D 目标检测最关键的字段是:

  • frame.name
  • frame.url
  • frame.labels
  • label.id
  • label.category
  • label.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.id
  • category:类别名,可用:
    • 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_namelabel.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 类别名选择策略

推荐三种模式:

  1. 英文 SKU 名

    • 直接用 categories[*].name
    • 如:187_tissue
  2. 中文商品名

    • __raw_Chinese_name_df 根据 category_id 查找 name
    • 如:维他低糖原味豆奶250ml
  3. 双语模式

    • 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_*.json
  • class_id_map
  • COCO -> YOLO / COCO -> Scalabel 的转换脚本

10.2 如果目标是商品分类

建议整理为:

  • train/类名/*.jpg
  • val/类名/*.jpg
  • test/类名/*.jpg

其中 val/test 可由 checkout 图按 bbox 裁剪得到。

10.3 如果目标是可视化审阅

建议优先转成 Scalabel,因为它更适合:

  • 浏览每张图的所有商品框
  • 用英文/中文类名审阅
  • 扩展属性字段
  • 后续人工修订标注

11. 小结

RPC 是一个非常适合零售商品检测、分类与自动结算研究的数据集。

它的标注原生是 COCO 风格,因此非常适合做检测训练;同时由于训练集为单商品图,RPC 也非常适合作为细粒度商品分类数据源。

若希望将 RPC 用于可视化标注管理、人工复核和后续二次修订,那么将其转换为 Scalabel 2D box 标注格式 是一个很自然的选择。

核心转换工作并不复杂,重点只有两点:

  1. 将 COCO 的 bbox = [x, y, w, h] 转为 Scalabel 的 box2d = {x1, y1, x2, y2}
  2. category_id 关联 categories__raw_Chinese_name_df,生成更友好的类别显示名称与属性信息

12. 参考资料

  1. RPC 官方项目页:RPC: A Large-Scale and Fine-Grained Retail Product Checkout Dataset
  2. RPC 论文:arXiv:1901.07249
  3. Scalabel 官方文档:Scalabel Format / Quick Start
  4. RPC提供的 instances_val2019.json,其中包含:
    • categories
    • images
    • annotations
    • __raw_Chinese_name_df
相关推荐
白杆杆红伞伞3 小时前
Qt Lock&Semaphore
qt·线程同步
专注VB编程开发20年3 小时前
WPS 2024 Windows版UI用QT5和自研DirectUI-vba,jsa
qt·vba·wps·jsa·directui
fzb5QsS1p1 天前
告别重复造轮子,Qt 快速开发脚手架
开发语言·qt·php
森G1 天前
58、最佳实践与注意事项---------多线程、竟态条件和同步
c++·qt
阿捏利1 天前
详解网络协议(十六)UDP协议
网络·网络协议·udp
taxunjishu1 天前
AGV 与伺服协同控制Profinet 转 Modbus TCP塔讯智能网关仓储场景应用实践
网络·网络协议
小樱花的樱花1 天前
1 项目概述
开发语言·c++·qt·ui
情绪雪1 天前
IP 协议基本原理
网络·网络协议·tcp/ip
Lucas_coding1 天前
【语音相关ASR】OpenAI 兼容 Qwen_ASR 接口调用实战:SDK 与 HTTP 方式详解
网络·网络协议·http