原文出处:Object Detection 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
到目前为止,我们接触的都是图像分类模型:输入一张图片,输出一个类别结果,比如 MNIST 问题里的"数字"类。但很多时候,光是知道图片里画着物体还不够,我们想知道它们的确切位置。这正是目标检测(object detection)要做的事。
课前小测
原文此处有一张图,画的是目标检测的实际效果:一张街景照片里,行人、骑行者、汽车、交通信号灯等物体被一个个矩形框圈出,框上标着类别名(图来自 YOLO v2 网站)。
目标检测的朴素做法
假设我们想在一张照片里找到猫,一种非常朴素的做法是:
- 把照片划分成若干小方块
- 对每个小方块跑一次图像分类
- 哪个方块的激活值足够高,就认为它包含要找的物体
原文此处有一张图,演示这种分块检测:图像被网格切分,含有猫的格子被点亮(图出自练习笔记本)。
这个办法远谈不上理想,因为它只能很粗糙地定位物体的边界框(bounding box)。要想定位更精确,就得跑某种回归(regression)来预测边界框的坐标,而这就需要专门的数据集。
用于目标检测的回归
这篇博客对形状检测有一段由浅入深的入门介绍,写得很不错。
目标检测数据集
做这个任务,你可能会遇到下面这些数据集:
- PASCAL VOC:20 个类别
- COCO(Common Objects in Context,场景中的常见物体):80 个类别,带边界框和分割掩码(segmentation mask)
原文此处有一张图,展示 COCO 数据集的样例照片,人物、动物、车辆等日常物体都标好了边界框。
目标检测的评估指标
交并比
图像分类的好坏容易衡量,目标检测不行:既要判断类别对不对,又要看推断出的边界框位置准不准。衡量后者,用的是所谓的交并比(Intersection over Union,IoU),它度量两个框(或任意两块区域)重叠得好不好。原文此处有一张图,画的是两个矩形框的相交区域与合并区域,旁边配着 IoU 的计算公式(引自这篇讲 IoU 的优秀博客的图 2)。
思路很简单:两个图形相交的面积,除以它们合并起来的面积。两块区域完全重合时 IoU 为 1,完全不相交时为 0,其余情况在 0 到 1 之间变化。我们通常只认 IoU 超过某个设定值的边界框。
平均精确率
假设要衡量模型对某个物体类别 $C$ 的识别效果。用的指标是平均精确率(Average Precision,AP),计算方法如下:
- 看精确率-召回率曲线(Precision-Recall curve),它展示检测效果随检测阈值(从 0 到 1)变化的情况
- 阈值取不同的值,一张图里检出的物体数量就多寡不同,精确率和召回率的取值也各不相同
- 曲线大概长这样
原文此处有一张精确率-召回率曲线图(图来自 NeuroWorkshop)。
给定类别 $C$ 的平均精确率,就是这条曲线下的面积。更准确地说,通常把召回率轴分成 10 份,在这些点上对精确率取平均:
$$ AP = {1\over11}\sum_{i=0}^{10}\mbox{Precision}(\mbox{Recall}={i\over10}) $$
AP 与 IoU
我们只统计 IoU 高于某个阈值的检出结果。例如在 PASCAL VOC 数据集上通常取 $\mbox{IoU Threshold} = 0.5$,而 COCO 会在不同的 $\mbox{IoU Threshold}$ 取值下分别测量 AP。原文此处有一张图,展示引入 IoU 阈值后精确率-召回率曲线的变化(图来自 NeuroWorkshop)。
平均精确率的均值 mAP
目标检测的主要指标叫平均精确率的均值(Mean Average Precision),简称 mAP。它是 AP 在所有物体类别上取平均的值,有时也对 $\mbox{IoU Threshold}$ 取平均。mAP 的详细计算过程在这篇博客里有讲解,这里还附有代码示例。
目标检测的不同路线
目标检测算法大体分两大类:
- 区域建议网络(Region Proposal Network)一类:R-CNN、Fast R-CNN、Faster R-CNN。主要想法是先生成一批感兴趣区域(Region of Interest,ROI),再对每个区域跑 CNN,寻找激活值最大的结果。这跟朴素做法有点相似,区别在于 ROI 的生成方式更聪明。这类方法的一个主要缺点是慢,因为 CNN 分类器要对图像反复扫描很多遍。
- 单趟(one-pass)一类:YOLO、SSD、RetinaNet。这类架构把网络设计成一趟前向传播同时预测类别和 ROI。
R-CNN:基于区域的 CNN
R-CNN 用选择性搜索(Selective Search)生成层次结构的 ROI 区域,这些区域随后送入 CNN 特征提取器和 SVM 分类器来确定物体类别,再用线性回归确定边界框坐标。官方论文
原文此处有两张图:第一张展示选择性搜索层层合并生成的候选区域(图来自 van de Sande 等人 ICCV'11 的论文);第二张是 R-CNN 的流程示意图(图来自这篇博客)。
F-RCNN:Fast R-CNN
这个做法与 R-CNN 相似,区别是区域在卷积层应用之后才定义。原文此处有一张图,画的是 Fast R-CNN 的网络结构(图来自官方论文及 arXiv 版本,2015)。
Faster R-CNN
这一方法的主要想法是用神经网络来预测 ROI,也就是所谓的区域建议网络(Region Proposal Network)。论文,2016。原文此处有一张图,展示 Faster R-CNN 的整体结构(图来自官方论文)。
R-FCN:基于区域的全卷积网络
这个算法比 Faster R-CNN 还快。主要想法如下:
- 用 ResNet-101 提取特征
- 特征交给位置敏感得分图(Position-Sensitive Score Map)处理。类别 $C$ 中的每个物体被划分成 $k\times k$ 个区域,我们训练网络去预测物体的各个部件
- $k\times k$ 个区域中的每个部件都对物体类别投票,得票最高的类别胜出
原文此处有一张图,展示 R-FCN 按部件划分并投票的机制(图来自官方论文)。
YOLO:You Only Look Once
YOLO 是一种实时的单趟算法。主要想法如下:
- 图像被划分成 $S\times S$ 个区域
- 对每个区域,CNN 预测 $n$ 个可能的物体、边界框坐标,以及置信度 = 概率 × IoU
原文此处有一张图,展示 YOLO 的网格检测流程(图来自官方论文)。
其他算法
- RetinaNet:官方论文
- Torchvision 中的 PyTorch 实现
- Keras 实现
- Keras 示例库中的用 RetinaNet 做目标检测
- SSD(Single Shot Detector,单发检测器):官方论文
练习:目标检测
继续在下面的 notebook 里学习:
小结
这节课把实现目标检测的各种方法快速过了一遍。
挑战
读一读这些讲 YOLO 的文章和 notebook,自己动手试一试:
- 一篇介绍 YOLO 的实用博客
- 官方网站
- YOLO:Keras 实现,分步教程 notebook
- YOLO v2:Keras 实现,分步教程 notebook
课后小测
复习与自学
- Nikhil Sardana 的目标检测讲义
- 目标检测算法的横向比较
- 深度学习目标检测算法综述
- 基础目标检测算法的分步入门
- 用 Python 实现 Faster R-CNN 做目标检测