使用 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 小目标规则

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

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

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

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 格式,都会更稳定、更容易排错。

相关推荐
kyriewen1 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
冬奇Lab1 小时前
Code Agent 解剖(03):各家 LLM 格式不一样,agent 怎么统一对接?
人工智能·开源
lifallen1 小时前
模型不是函数:claude-cookbooks/misc 十四篇的公共底层
人工智能·学习·ai·ai编程
冬奇Lab1 小时前
开源项目第189期:DeepTutor — Agent 原生的终身个性化学习工作台,三层记忆+多引擎RAG+Partners
人工智能·开源·资讯
小柯南敲键盘2 小时前
电商图片翻译工具推荐,批量处理主图视频字幕,免费试用
大数据·人工智能·python·音视频
一次旅行2 小时前
2026.08.16 AI产业深度解读|国产大模型全面突围,算力硬件/智能安全/人形机器人四大趋势附落地方案
人工智能·安全·机器人
观远数据2 小时前
零售连锁BI选型清单:什么样的场景适合ChatBI,什么样的场景不适合
大数据·人工智能·零售
IT_陈寒2 小时前
Vue的双向绑定把我坑惨了,原来这个场景不能用
前端·人工智能·后端
阿甘编程点滴3 小时前
多角色对话AI配音工具技术解析与功能实测汇总
人工智能