本文记录一次使用 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 等目标检测任务,常见流程是:

- 使用 Labelme 标注图片。
- 保存为
.json文件。 - 将
.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 后,常用操作流程如下:
- 选择
Open Dir打开图片文件夹。 - 选择
Create Rectangle。 - 框选目标。
- 输入类别名称,例如
A16_FA-18。 - 在 JSON 中补充或检查
group_id。 - 保存
.json。 - 切换到下一张图片继续标注。
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 标注目标检测数据集时,最重要的不是"把框画出来"这么简单,而是保证标注数据可以稳定用于训练。
本次流程中,关键经验如下:
- 类别名称必须统一,不能混写。
- 每个目标必须单独画框。
- 框要贴合目标边缘,不能过大或过小。
- 能看清的小目标也要标注。
- 模糊、过暗、过曝、无法判断类别的目标不要强行标。
- 漏标图片要单独整理复查。
- 错标类别要及时更正。
- 最终不能保留
UNKNOWN。 group_id必须与类别 ID 表一致。- 交付前要检查图片数、JSON 数、空标注、UNKNOWN 和 group_id。
最终交付标准可以概括为:
text
图片和JSON一一对应
所有目标均有矩形框
所有框都有合法label
所有框都有正确group_id
无空标注
无UNKNOWN
漏标和错标图片已单独整理
这样整理出来的数据集,后续无论是转换成 YOLO 格式,还是转成 COCO 格式,都会更稳定、更容易排错。