四个框的 IoU 是 0.800/0.736/0.341/0.627—— 3 个标对、1 个标歪。 IoU 0.5 是「算不算命中」的合格线, 两个标注员之间低于 0.7 就说明标准没对齐。
上一节把标签定好了。这一节真动手画框,并且给出一个能替代「人盯着看」的量化方法。
一、打标就是画框,但「画得准」不是感觉
画框这个动作很简单:从目标左上角按下,拖到右下角松开。难的是判断画到哪里算对。 包得松一点、紧一点,视觉上都像那么回事。 但模型训练时要拿这个框去算损失,框歪了,损失就一直降不下来。 所以必须有一个数来判断。 检测任务用的数是 IoU(交并比):两个框重叠的面积,除以它们合起来覆盖的面积。 完全重合是 1.0,完全不沾是 0.0。 这个数同时管两件事:评模型(预测框对真值框)、评标注(两个标注员互相之间)。
二、两条线:0.5 和 0.7
0.5 是「算不算命中」的线。 模型预测的框和真值框 IoU 不小于 0.5,这个目标就算检测到了。 低于 0.5 算漏检。 这条线是约定俗成的,也是很多检测评测标准(比如 COCO 的 AP50)用的阈值。 它衡量的是「大致框住了没有」,不衡量精度。 0.7 是「标准对齐了没有」的线。 让两个标注员标同一批图,算他们互相的 IoU。 低于 0.7 就说明手册写得不够细,这时候该去改手册,不是去骂人。 Demo 里四个框的 IoU 是 0.800/0.736/0.341/0.627:前两个合格,第三个 0.341 是明显标歪, 第四个 0.627 是「擦线合格」。 注意第三个框为什么歪:它把行人的框往左上扩了一大圈, 覆盖了旁边的空地。 这种「差不多框住」的标法最常见, 也最伤模型——因为模型会学到「行人的框应该包含周围一片地面」。
三、三个最常见的偏差
包太松。 为了「确保框住」,四周留一大圈空白。 后果是同一类目标的框大小差异巨大,模型学不准尺度。 包太紧。 只框住躯干,把手脚、头发切掉。后果是框和真实物体边界不一致,推理时框会偏小。 漏标小目标。 远处的、被遮挡的、只露出一点点的,干脆不标。 这个最隐蔽——因为漏标的框根本不在数据里,统计时看不出来。 第三条的解法是反向检查:拿训好的模型跑一遍,看它在哪里检出了目标但标注里没有。 这些「多出来的框」要么是模型误检,要么是标注漏标,逐个看一遍,能捞回不少。 还有一条操作纪律:框的两条边要紧贴目标的外轮廓,不要留空隙也不要切进去。目标被遮挡时, 框自己脑补完整形状,而不是只框可见部分。这条必须写进手册,否则十个人会标出十种。
四、在 MakeSense 里打标
📋 实操清单(要在浏览器里点):
第一步,选好任务类型(Object Detection),图片拖进页面,左侧选当前标签。
第二步,在目标上按住拖出矩形。松手即生成一个框,按住快捷键(数字键)再拖,可以直接用对应标签。
第三步,标错了点中框按 Delete 删掉;框的位置不对,拖动四角或四边调整。
第四步,A 和 D 切换上一张下一张。
标完一批先别急着导出,抽 10 张回看一遍——回看能抓出大部分手误。
🐍 沙箱等价物:IoU 的算法和半自动画框见 Demo。
沙箱里不能点鼠标,但「两个框差多少」这件事是纯几何计算,
所以标注质量检查完全可以自动化——批量算双人标注的 IoU,比人眼抽检准得多。
五、动手 Demo:四个框 3 个合格、1 个标歪:IoU 0.341 低于 0.5 那条线
造一张 320×240 的示意图,放四个目标,给每个目标一对框(真值和「标注」),逐个算 IoU, 并按 0.5 的合格线判定。
def iou(a, b):
ax1, ay1 = max(a[0], b[0]), max(a[1], b[1])
ax2, ay2 = min(a[2], b[2]), min(a[3], b[3])
iw, ih = max(0, ax2 - ax1), max(0, ay2 - ay1)
inter = iw * ih
ua = ((a[2]-a[0]) * (a[3]-a[1])
+ (b[2]-b[0]) * (b[3]-b[1]) - inter)
return inter / float(ua) if ua else 0.0
for t, p in zip(truth, pred):
v = iou(t, p)
print(t[4], v, u'是' if v >= 0.5 else u'否')
实跑输出:
--------------------------------------------------------------------
打标:框画得准不准,用一个数就能量
--------------------------------------------------------------------
图像尺寸 320 × 240
真值框 4 个
预测框 4 个
类别 真值 预测 IoU IoU≥0.5
-----------------------------------------------------------
car 40,60,120,150 46,66,118,146 0.800 是
car 180,90,280,160 176,86,292,168 0.736 是
person 60,170,100,230 30,150,95,240 0.341 否
person 200,180,250,235 198,170,258,228 0.627 是
IoU 最小 0.341
IoU 中位 0.681
IoU 最大 0.800
四个框里 3 个算「标对」(IoU 不小于 0.5),1 个算「标歪」。
**IoU 就是交并比:两个框重叠的面积除以它们合起来的面积。**
完全重合是 1.0,完全不沾是 0.0。0.5 是检测任务最常用的合格线。
这个数为什么重要?因为它同时管两件事:
评模型 预测框和真值框的 IoU ≥ 0.5 才算命中
评标注 两个标注员画同一个目标,IoU 低于 0.7 就说明标准没对齐
**所以标注质量可以用「双人重复标注的 IoU」来量,不用靠人盯。**
抽一小部分图让两个人各标一遍,算平均 IoU,
低于 0.7 就回去改手册,别急着开标。
四个 IoU:0.800、0.736、0.341、0.627。
最小值 0.341 那个就是标歪的,其余三个过 0.5 线,其中一个 0.627 是擦线。
0.341 那个为什么歪?
它的预测框是 30,150,95,240,
真值是 60,170,100,230——左边扩出去 30 像素、上边扩出去 20 像素,把旁边一大片空地框进来了。
这种错最典型:视觉上「框住了那个人」,但框的面积比真值大了将近一倍半,IoU 直接掉到 0.34。
模型学到的是「行人的框要包含周围地面」。
再看 0.627 那个:它是「稍微偏了一点」,刚好过线。
这种擦线的框最容易被放过,但批量都是这样,模型精度就会整体偏软。
要说明的是:这里的「真值」是我手写的,不是人工标出来的。
Demo 演示的是「怎么算、怎么判」,不是「这一批数据质量如何」。
真实项目里把两个人标的框批量喂进这个函数,就能得到一致性分数。
30 秒实验
- 把第三个框的偏移量从 30 像素改成 10 像素,看 IoU 从 0.341 涨到多少。 体会一下「偏一点」和「偏很多」在 IoU 上的差别。
- 把合格线从 0.5 改成 0.7,看有几个框还能过。这就是「评模型」和「评标注一致性」两条线的区别。
- 算一下「框大一倍」对应的 IoU 上限:如果预测框面积是真值的两倍且完全覆盖,IoU 最多是 0.5。 这说明「包太松」的错法天然过不了线。
常见误区
- 「框大概框住就行」。IoU 0.34 和 0.80 在视觉上都能说「框住了」,但对训练是完全不同的信号。 要有量化标准。
- 「IoU 0.5 就够精确了」。0.5 是「算不算命中」的线,不是精度线。 标注一致性要求更高(0.7),否则十个标注员会标出十种框。
- 「小目标漏标不影响」。漏标的框不在数据里,统计上完全看不出来,只能靠模型跑一遍反向找。
自测三问(点开对答案)
1. IoU 是怎么算的? —— 两个框重叠的面积,除以它们合起来覆盖的面积。完全重合是 1.0,完全不沾是 0.0。 2. 0.5 和 0.7 这两条线分别管什么? —— 0.5 是「算不算命中」的线,用来评模型; 0.7 是「标准对齐了没有」的线,用来评两个标注员之间的一致性。 3. 为什么「漏标小目标」最难发现? —— 因为漏标的框根本不在数据里,任何统计都看不出来。 只能用训好的模型跑一遍,看它检出但标注里没有的地方。框画完了,如果中途发现标签起错名,别急着重新标。下一节讲怎么安全地改名。
- ☐ (本节完,下一节 4.2.4 修改标注项目的名称)