使用 Labelme 标注遥感目标检测数据集:从类别表、矩形框到 group_id 完整流程

本文记录一次使用 Labelme 标注遥感目标检测数据集的完整流程,包含标注规范、类别表、Labelme JSON 结构、group_id 填写方法,以及漏标、错标、类别识别不确定时的处理经验。适合作为 CSDN 博客发布,也可以作为团队标注规范文档使用。

1. 任务背景

本次数据集是遥感影像目标检测任务,图片中包含飞机、舰船、发射车等目标。标注工具使用 Labelme,标注形状采用矩形框,最终每张图片对应一个 .json 标注文件。

处理后的数据集要求如下:

  • 每张图片保留原始 .jpg。
  • 每张图片对应一个同名 .json。
  • 每个目标使用 rectangle 矩形框标注。
  • label 必须填写类别名称。
  • group_id 必须填写类别 ID。
  • 漏标目标需要补框。
  • 错误类别需要更正。
  • 不允许保留 UNKNOWN、空标签或缺失 group_id 的框。

最终处理结果统计如下:

text 复制代码
图片/JSON数量: 746
总框数: 5623
空标注图片: 0
UNKNOWN框数: 0
缺失group_id框数: 0

标签分布:
A16_FA-18: 3769
FSC: 1549
MS: 207
QHS: 80
LQS: 13
HM: 5

2. Labelme 简介

Labelme 是一个常用的图像标注工具,适合做目标检测、语义分割、实例分割等任务。对于 YOLO、Detectron、MMDetection 等目标检测任务,常见流程是:

  1. 使用 Labelme 标注图片。
  2. 保存为 .json 文件。
  3. 将 .json 转换为 YOLO、COCO 或其他训练格式。

在目标检测任务中,最常用的是矩形框标注:

text 复制代码
Create Rectangle

保存后,Labelme 会生成类似下面的 JSON 结构:

json 复制代码
{
  "version": "5.1.1",
  "flags": {},
  "shapes": [
    {
      "label": "A16_FA-18",
      "points": [
        [128.0, 143.0],
        [243.0, 244.0]
      ],
      "group_id": 19,
      "shape_type": "rectangle",
      "flags": {}
    }
  ],
  "imagePath": "004329-MAR20_2688.jpg",
  "imageHeight": 800,
  "imageWidth": 800
}

其中最关键的是:

  • label:类别名称。
  • points:矩形框左上角和右下角坐标。
  • group_id:类别编号。
  • shape_type:这里固定为 rectangle。

3. 类别表与 group_id 映射

本次数据集共有 25 类,group_id 必须与类别表中的 ID 一一对应。

ID label 中文类别
0 HM 航母
1 LQS 两栖舰
2 QHS 驱护舰
3 MS 民船
4 A1_SU-35 Su-35 多用途战斗机
5 A2_C-130 C-130 运输机
6 A3_C-17 C-17 战略运输机
7 A4_C-5 C-5 战略运输机
8 A5_F-16 F-16 战斗机
9 A6_TU-160 Tu-160 战略轰炸机
10 A7_E-3 E-3 空中预警机
11 A8_B-52 B-52 战略轰炸机
12 A9_P-3C P-3C 海上巡逻机
13 A10_B-1B B-1B 战略轰炸机
14 A11_E-8 E-8 地面监视与指挥机
15 A12_TU-22 Tu-22 轰炸机
16 A13_F-15 F-15 战斗机
17 A14_KC-135 KC-135 空中加油机
18 A15_F-22 F-22 战斗机
19 A16_FA-18 F/A-18 战斗/攻击机
20 A17_TU-95 Tu-95 战略轰炸机
21 A18_KC-10 KC-10 空中加油/运输机
22 A19_SU-34 Su-34 战斗轰炸机
23 A20_SU-24 Su-24 前线轰炸/攻击机
24 FSC 发射车

因此,如果一个框的类别是:

text 复制代码
A16_FA-18

那么它的 group_id 应该填写:

text 复制代码
19

如果一个框的类别是:

text 复制代码
FSC

那么它的 group_id 应该填写:

text 复制代码
24

4. 标注基本流程

4.1 打开 Labelme

可以通过桌面快捷方式打开 Labelme,例如:

text 复制代码
Labelme - 快捷方式.lnk

进入 Labelme 后,常用操作流程如下:

  1. 选择 Open Dir 打开图片文件夹。
  2. 选择 Create Rectangle。
  3. 框选目标。
  4. 输入类别名称,例如 A16_FA-18。
  5. 在 JSON 中补充或检查 group_id。
  6. 保存 .json。
  7. 切换到下一张图片继续标注。

4.2 图片和 JSON 一一对应

推荐保持如下结构:

text 复制代码
dataset/
├── 004329-MAR20_2688.jpg
├── 004329-MAR20_2688.json
├── 004478-fsc_HMS-N26.20-E127.66-lv20-yandex_crop0001.jpg
└── 004478-fsc_HMS-N26.20-E127.66-lv20-yandex_crop0001.json

Labelme 会根据图片旁边的同名 .json 自动加载标注框。

5. 标注规则

结合标注文档和实际数据处理经验,建议遵守以下规则。

5.1 标签必须统一

同一类目标的 label 必须完全一致。

例如 F/A-18 统一写:

text 复制代码
A16_FA-18

不要混写成:

text 复制代码
FA18
F/A-18
A16
fa-18

否则后续转换训练集时容易被识别为多个不同类别。

5.2 每个目标单独标注

一张图中有多个目标时,每个目标都要单独画框。

错误做法:

text 复制代码
多个飞机只画一个大框

正确做法:

text 复制代码
每架飞机单独一个矩形框

舰船、车辆、发射车同理。

5.3 框要贴合目标边缘

矩形框应尽量贴合目标外接边缘:

  • 不要框太大,包含大量背景。
  • 不要框太小,截掉机翼、舰首、舰尾等目标部分。
  • 框线不能越出图像边界。

对于飞机类目标,一般应包含:

  • 机头
  • 机尾
  • 双翼
  • 可见的整体机身轮廓

对于舰船类目标,一般应包含:

  • 舰首
  • 舰尾
  • 船体整体
  • 明显可见的甲板区域

5.4 遮挡目标也要标注

如果目标被部分遮挡,但人眼仍然能够判断目标完整位置,应根据可见部分和目标形状补全外接框。

例如:

  • 飞机有一部分被云遮挡,但仍能判断整体轮廓,可以标。
  • 舰船停靠在码头边,部分被建筑遮挡,但船体可辨,可以标。

但如果目标模糊到无法判断类别或边界,则不建议强行标注。

5.5 小目标规则

文档中提到,小目标只要人眼能分辨就应该标注。

但是过小的目标,例如低于 10x10 或 20x20 像素,可能对训练帮助有限,也容易引入噪声。实际处理时建议:

  • 能看清类别和边界:标。
  • 只能看到一个亮点或黑点:不标。
  • 类别无法确认:暂不标或放入复核清单。

5.6 模糊、过暗、过曝目标不标

以下情况建议不标:

  • 图像严重模糊。
  • 目标边界无法判断。
  • 目标过暗或过曝。
  • 人眼无法确认类别。
  • 框出来只会引入错误样本。

6. 漏标和错标如何处理

实际标注中常见问题有三类。

6.1 漏标

漏标是指图片里本来有目标,但没有框出来。

本次处理中,漏标较多的是 A16_FA-18。有些图片中原始框线很浅,或者框线颜色接近背景,自动提取时容易漏掉。最终对这些图进行了补框处理。

例如单独整理出的补框图片中包含:

text 复制代码
003880-MAR20_927.jpg, 5 个框, A16_FA-18
003893-MAR20_947.jpg, 7 个框, A16_FA-18
004212-MAR20_1494.jpg, 18 个框, A16_FA-18
004248-MAR20_178.jpg, 1 个框, A16_FA-18
004316-MAR20_2532.jpg, 10 个框, A16_FA-18
004329-MAR20_2688.jpg, 25 个框, A16_FA-18
004361-MAR20_3106.jpg, 5 个框, A16_FA-18
004478-fsc_HMS-N26.20-E127.66-lv20-yandex_crop0001.jpg, 1 个框, FSC

这类图片建议单独放入一个文件夹,方便人工复查:

text 复制代码
06-闫桦溥_我补框的图片/
├── 003880-MAR20_927.jpg
├── 003880-MAR20_927.json
├── ...
└── 我补框的图片清单.csv

6.2 错标

错标是指框的位置是对的,但类别写错。

例如:

text 复制代码
蓝色框里的民船被误识别为 UNKNOWN

应该改为:

text 复制代码
label: MS
group_id: 3

又如:

text 复制代码
黄色框里的驱护舰被误识别为 UNKNOWN

应该改为:

text 复制代码
label: QHS
group_id: 2

6.3 UNKNOWN 的处理

在中间处理过程中,如果类别无法自动可靠识别,可以临时标为:

text 复制代码
UNKNOWN

但最终数据集不应保留 UNKNOWN。

本次处理中,曾经出现过 UNKNOWN,原因不是图片看不清,而是自动 OCR 对小字识别不稳定。后来通过放大裁剪和边框颜色判断,将其全部修正为合法类别:

text 复制代码
黄色框 -> QHS -> group_id 2
绿色框 -> LQS -> group_id 1
蓝色框 -> MS -> group_id 3
红/粉色框 -> HM -> group_id 0

最终结果:

text 复制代码
UNKNOWN框数: 0

7. group_id 为什么重要

很多人使用 Labelme 时只填写 label,忽略 group_id。但如果项目要求类别 ID 与类别名称绑定,group_id 就必须填写。

例如:

json 复制代码
{
  "label": "A16_FA-18",
  "points": [[128.0, 143.0], [243.0, 244.0]],
  "group_id": 19,
  "shape_type": "rectangle",
  "flags": {}
}

如果 group_id 缺失,可能导致后续转换脚本无法正确生成训练标签。

建议在最终检查时确认:

text 复制代码
缺失group_id框数: 0

8. 数据集最终检查清单

标注完成后,不要马上交付,建议做一次完整检查。

8.1 文件数量检查

确认图片和 JSON 数量一致:

text 复制代码
图片数量 = JSON数量

本次结果:

text 复制代码
图片/JSON数量: 746

8.2 空标注检查

检查是否存在没有任何框的 JSON:

text 复制代码
空标注图片: 0

如果存在空标注,要判断:

  • 图片中是否确实没有目标。
  • 是否因为框线颜色太淡导致漏检。
  • 是否需要人工补框。

8.3 UNKNOWN 检查

最终数据中不建议保留 UNKNOWN:

text 复制代码
UNKNOWN框数: 0

如果还有 UNKNOWN,需要人工打开图片确认类别。

8.4 group_id 检查

确认每个框都有 group_id:

text 复制代码
缺失group_id框数: 0

并确认 group_id 与类别表一致。

8.5 抽样可视化检查

建议随机抽查若干图片:

  • 多目标图片。
  • 小目标图片。
  • 遮挡图片。
  • 曾经漏标的图片。
  • 曾经错标的图片。

重点检查:

  • 框是否贴边。
  • 是否漏框。
  • 是否多框。
  • 类别是否正确。
  • group_id 是否正确。

9. 常见问题

9.1 JSON 是什么?

.json 是 Labelme 保存标注信息的文件。

一张图片通常对应一个同名 JSON:

text 复制代码
004248-MAR20_178.jpg
004248-MAR20_178.json

图片是原始数据,JSON 是标注数据。Labelme 打开图片时,会读取旁边同名 JSON,并显示标注框。

9.2 脚本文件需要提交吗?

如果只是提交数据集,一般只需要:

text 复制代码
.jpg 图片
.json 标注

类似下面的脚本文件只是处理过程备份,不是数据集必需文件:

text 复制代码
_extract_labelme_from_overlay.py
_fill_group_id.py
_fix_unknown_by_box_color.py

这些脚本可以保留用于追溯,也可以不随数据集提交。

9.3 为什么要把补框图片单独放出来?

因为补框图片属于人工或半自动重点修正对象,建议单独保存,方便复核。

例如:

text 复制代码
06-闫桦溥_我补框的图片/

这样老师、队友或审核人员可以快速查看:

  • 哪些图片原来漏标。
  • 后来补了几个框。
  • 补框类别是什么。
  • 对应 JSON 是否正确。

10. 总结

使用 Labelme 标注目标检测数据集时,最重要的不是"把框画出来"这么简单,而是保证标注数据可以稳定用于训练。

本次流程中,关键经验如下:

  1. 类别名称必须统一,不能混写。
  2. 每个目标必须单独画框。
  3. 框要贴合目标边缘,不能过大或过小。
  4. 能看清的小目标也要标注。
  5. 模糊、过暗、过曝、无法判断类别的目标不要强行标。
  6. 漏标图片要单独整理复查。
  7. 错标类别要及时更正。
  8. 最终不能保留 UNKNOWN。
  9. group_id 必须与类别 ID 表一致。
  10. 交付前要检查图片数、JSON 数、空标注、UNKNOWN 和 group_id。

最终交付标准可以概括为:

text 复制代码
图片和JSON一一对应
所有目标均有矩形框
所有框都有合法label
所有框都有正确group_id
无空标注
无UNKNOWN
漏标和错标图片已单独整理

这样整理出来的数据集,后续无论是转换成 YOLO 格式,还是转成 COCO 格式,都会更稳定、更容易排错。

相关推荐
lovingsoft9 小时前
AI 开发的软件质量如何保证?一套可落地的 LLM 应用质量工程体系(QA 视角)
人工智能
小易测试笔记10 小时前
如何选择适合的半导体静电放电测试设备,易捷测试 Hanwa中国区代理提供哪些支持?
人工智能
益莱储中国10 小时前
益莱储任命 Vincent Kwa为亚太区副总裁兼总经理
大数据·人工智能
鬼手点金10 小时前
上下文:Agent 的眼睛
java·前端·人工智能·git·深度学习
具身AGI10 小时前
一块远程显卡服务一队机器人,瓶颈不在模型
人工智能·机器人
hzxxxz10 小时前
AI任务分流链路:从3层可验证路由到判断力留痕
人工智能
我有酒两杯10 小时前
从一条样本看懂 Kev:数据、模型、训练与推理
人工智能·深度学习·机器学习·lora·大语言模型
EterNity_TiMe_10 小时前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
晨间晓10 小时前
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
人工智能·opencv·华为云
科创致远10 小时前
科创致远 ESD 静电监控全景落地指南
人工智能·信息可视化·制造·精益工程