第4章:目标检测标注实战(矩形框)

目标检测标注,说白了就是给图片里的物体画框框、贴标签。你想想看,模型要认识一只猫、一辆车,总得有人先告诉它「喏,这个框里是猫,那个框里是车」。今天我就带你手把手搞定 LabelImg 这个工具。

核心要点:矩形框标注看似简单,但坑不少。框的位置偏一点、类别写错一个字,模型训练出来可能就认错东西。我见过太多项目因为标注不规范,最后模型精度死活上不去。

4.1 LabelImg 安装与启动

LabelImg 是个开源工具,GitHub 上就能下。我个人习惯用 Python 直接装,干净利落。

# 安装
pip install labelImg

# 启动
labelImg

嗯,这里要注意:如果你用的是 Python 3.10 以上版本,可能会遇到 PyQt5 的兼容问题。我建议用 conda 创建一个 Python 3.8 的环境,稳得很。

小技巧:启动后按 Ctrl+R 可以切换标注格式。默认是 PascalVOC(XML),按一下变成 YOLO(TXT)。我个人建议初学者先用 PascalVOC,因为 XML 里信息更全,方便后面理解。

4.2 绘制矩形框:手稳心细

画框的操作很简单:点击左侧的「Create RectBox」按钮,或者直接按快捷键 W。然后在图片上按住鼠标左键,从物体的左上角拖到右下角。

为什么会强调左上到右下?其实从哪个角开始都行,但团队里统一标准很重要。我在项目中遇到过,有人从左上画,有人从右下画,最后统计框的坐标时乱成一锅粥。

画框时有几个原则:

  • 紧贴物体边缘:框要刚好包住目标,别留太多空白,也别切掉物体的一部分
  • 遮挡部分怎么处理:如果物体被挡住了,框就画到遮挡物的边缘,别去猜被挡住的部分
  • 小物体别漏:有些目标只有几十个像素,比如远处的行人,也得画上。模型对小物体本来就难识别,你再漏标,它就更学不会了

避坑指南:我曾经犯过一个低级错误——画框时手抖了一下,框歪了 2 个像素。当时觉得无所谓,结果模型训练出来,那个类别的 mAP 比其他类别低了 5 个点。后来排查半天,才发现是标注框不准确导致的。所以,画框时尽量放大图片(快捷键 Ctrl++),精确到像素级。

4.3 属性填写:类别、遮挡、截断

画完框,弹出一个对话框让你填属性。这里我重点说三个:

属性 说明 我的建议
类别(Class) 物体的名称,比如 car、person、dog 用英文小写,不要带空格。我习惯用下划线连接,比如 traffic_light
遮挡(Occluded) 物体被遮挡的程度:0=无遮挡,1=部分遮挡,2=严重遮挡 遮挡超过 50% 就标 2。这个属性对自动驾驶场景特别重要
截断(Truncated) 物体是否被图片边缘截断:0=完整,1=截断 只要物体有一部分在图片外面,就标 1。别犹豫

你可能会问:遮挡和截断有啥区别?说白了,遮挡是物体被别的东西挡住了,截断是物体被图片边界切掉了。这两个属性在训练时可以帮助模型理解「不完整的目标长什么样」。

重要:类别名称一定要和你的配置文件完全一致。大小写、拼写都不能错。我见过有人把「pedestrian」拼成「pedestrain」,结果模型训练时直接忽略了这个类别,白标了 2000 张图。

4.4 常见标注规范

标注规范这东西,每个团队都有自己的习惯。但有些底线是不能碰的:

  1. 一个物体一个框:别把两个挨着的物体画在一个框里。就算它们贴在一起,也得分开标
  2. 不标背景:只标你关心的目标类别。背景区域不需要框
  3. 边界情况:如果物体只有 5% 露在外面,要不要标?我的经验是:能认出是什么就标,认不出就放弃
  4. 一致性:同一个物体在不同图片里,标注方式要一致。比如「红绿灯」,要么都标整个灯杆,要么只标灯头,别混着来

我记得有一次做行人检测项目,标注员把「打伞的人」和「没打伞的人」都标成 person,但伞的遮挡程度标得乱七八糟。后来模型在雨天场景下直接崩了。所以,遮挡和截断这两个属性,千万别随便填。

4.5 标注流程与知识体系

下面这张图是我整理的标注核心流程,你看一眼就能明白整体逻辑:

目标检测标注核心流程 1. 安装启动 pip install labelImg 2. 绘制矩形框 快捷键 W,左上→右下 3. 填写属性 类别、遮挡、截断 4. 保存导出 XML / TXT 格式 5. 质量检查 框位置、类别、遮挡 6. 交付训练 数据集打包 发现问题 → 返回修改 → 重新检查 → 循环迭代 迭代优化

这个流程看着简单,但每一步都有讲究。比如质量检查这一步,我建议至少抽 20% 的标注结果做二次审核。别嫌麻烦,前期多花点时间,后期训练模型能省十倍的时间。

4.6 实战中的那些坑

最后分享几个我踩过的坑:

  • 文件名别用中文:LabelImg 对中文路径支持不好,容易报错。图片和标注文件都用英文命名
  • 备份原始图片:标注过程中可能会误操作,原始图片备份好,随时可以重来
  • 统一分辨率:如果图片分辨率差异太大,建议先 resize 到统一尺寸再标。不然模型训练时容易出问题
  • 多人协作时用同一份类别列表:把 classes.txt 文件共享给所有人,避免各标各的

嗯,标注这件事,说白了就是「慢工出细活」。你花在标注上的每一分钟,都会在模型训练时加倍回报给你。别想着偷懒,数据质量决定了模型的天花板。

我的习惯:每标完 100 张图,我会用脚本统计一下各类别的数量分布。如果发现某个类别数量明显偏少,就回去补标一些。这样能保证数据集不偏科。


公众号:蓝海资料掘金营,微信deep3321