视觉、对象检测 (object detection) 和分割 (segmentation):在投入产品前正确理解
简介
许多人开始学习计算机视觉 (computer vision) 都是通过一个非常熟悉的演示 (demo):将图像输入模型,模型在人、车、水瓶或某个物体周围画一个边界框 (bounding box)。
那个演示很好,但如果把它带入真实的产品中,仍然缺少很多东西。
生产环境中的视觉系统通常不仅需要知道有什么物体,还需要知道物体具体在哪里、它的边界是什么样的、它对下一步决策有什么影响,以及什么是可接受的误差范围。
本文基于 Mask R-CNN 及相关的文章/研究,简要记录了对象检测和分割 (segmentation) 之间的区别。
1. 对象检测 (Object detection) 回答了什么问题?
对象检测通常回答三个问题:
- 图像中有哪些物体?
- 该物体属于什么类别 (class)?
- 该物体在哪个边界框中?
例如,在产品检查摄像头中,模型可能会返回:
{
"class": "defect",
"confidence": 0.91,
"box": [120, 80, 260, 190]
}
这对于许多问题来说已经足够了:计数物体、检测明显的缺陷、当有人进入危险区域时发出警告。
但边界框仍然是一个矩形。它不能准确地描述物体的真实形状。如果物体是弯曲的、变形的、被遮挡的,或者有非常小的缺陷区域,那么边界框可能过于粗糙了。
2. 分割 (Segmentation) 更进一步
分割不仅仅是画框。它试图对属于对象的每一个像素 (pixel) 进行分类。
有三种常见类型:
- 语义分割 (Semantic segmentation): 每个像素属于什么类别,例如道路、天空、人。
- 实例分割 (Instance segmentation): 区分每个单独的对象,例如人 1、人 2。
- 全景分割 (Panoptic segmentation): 结合语义分割和实例分割。
Mask R-CNN 是一个著名的框架,因为它既能检测对象,又能为每个对象实例生成分割掩码 (segmentation mask)。Mask R-CNN 论文展示了如何通过添加一个与分类和边界框分支并行的预测掩码的分支来扩展 Faster R-CNN。
值得注意的是:对象检测告诉我们“这个物体在这里”,而实例分割告诉我们“这个物体占据了恰好这个区域”。
3. 为什么这在真实产品中很重要?
在工业制造中,当缺陷无法整齐地放入一个漂亮的矩形中时,分割可能会很有用。
例如:
- 边缘未对齐的泡罩包装 (blister packs);
- 变形的药丸;
- 标签有一小块撕裂;
- 表面有细长的划痕;
- 重叠的物体。
如果只看边界框,系统知道“有缺陷”。但如果需要测量缺陷面积、缺陷位置、扩散程度或与 QC 标准进行比较,分割能提供更好的数据。
在自动驾驶汽车中,分割也很重要,因为汽车不仅需要知道“前面有人”,还需要了解道路区域、车道、人行道、障碍物、可行驶区域和不可行驶区域。
4. 一种实际的思考方式
在选择检测还是分割时,我不会问“哪个模型更好”,而是问:
- 系统的最终决策是什么?
- 边界框足以做出决定吗?
- 我们需要知道物体的精确形状吗?
- 像素级误差是否会影响安全性或质量?
- 延迟 (latency) 允许运行分割吗?
例如,对于计算不良产品数量的仪表板,检测可能就足够了。但对于需要对表面缺陷严重程度进行分类的 QC 机器,分割则更值得考虑。
5. 结论
对象检测是一个很好的起点。但当产品进入真实环境时,问题将从“模型能检测到吗?”转变为“这个结果足以让系统做出决策吗?”。
这也是 AI 演示与 AI 产品之间的区别。
参考资料
- Mask R-CNN: https://arxiv.org/abs/1703.06870
- Meta Research — Mask R-CNN: https://research.facebook.com/publications/mask-r-cnn/
- Meta Engineering — Mask R-CNN2Go: https://engineering.fb.com/2018/12/12/ml-applications/mask-r-cnn2go/
New posts, shipping stories, and nerdy links straight to your inbox.
2x per month, pure signal, zero fluff.