Deep Learning (12) - Object Detection
这一章主要介绍了当下大行其道的Computer Vision中的Object Detection,也就是目标检测。课程由浅入深,其间也深入介绍了目标检测算法的集大成者YOLO算法。
模型定义
输入是一张图片,经过CNN网络,输出预测标签。标签定义通常是:
- Pc: 是否有需要检测的目标
- : 代表bounding box
- : 代表三种分类,例如:car, pedestrian, motorcycle
损失函数(用最小二乘法):
检测方法
滑动窗口检测法
检测方法就是如图所示,先用最小的窗口截取图片的每个角落,跑一遍CNN,看看有没有命中的格子,如果没有,就换大一点的窗口,如果还没有就再换大一点的窗口,以此类推。这是最容易想到的方法,但是缺点就是计算量太大,效率极低。
滑动窗口的卷积实现
其本质还是利用窗口来采样图片,并输出该窗口中是否有检测对象。但滑动窗口类似串行算法,卷积实现类似于并行算法,其共享了很多计算步骤,效率更高。
下面将会对滑动窗口算法网络进行一步步的改造,最终实现卷积算法来一次性检测所有窗口的结果。
1. 使用1x1 convolution (Network in network)来取代FC层
假设就是14x14的窗口使用在14x14的图片上,最终运算出来的结果是一个1x1x4的volume,代表4个分类上的结果。
2. 增加图像尺寸后的情况
图像尺寸在长宽方向上都增加2个pixel,则图像尺寸是16x16。如果仍然采用14x14的窗口,则会需要4个窗口来检测这个16x16的图像。经过上述CNN网络迭代后,结果是4x4x4。其每一个格子代表了一个窗口的运算结果。这实际上就是滑动窗口的卷积实现了。
更大一点的图像会是怎么样的情况呢?
同理,如果是28x28的图像,则会有8个窗口来检测,最终产生的volume是8x8x4,代表这8个窗口的检测结果。
卷积算法通过一次性迭代,输出了一幅图片上所有分片的检测结果,其效率要远远大于滑动窗口的运算效率。
YOLO Algorithm
YOLO = You Only Look Once
这是公认比较高效的目标检测算法。据说这篇论文的难度也很高,比较难读懂。
IOU
IOU = Intersection Over Union,翻译成交并比。交集和并集的比例。如下图:
蓝色框是算法预测出的目标位置,红色框是实际目标位置。黄色阴影是交集,绿色阴影是并集。那么:
Non-max Suppression Algorithm
翻译成非极大值抑制。
当有如下的检测结果的时候:
理论上,一个物体只属于一个box。但是,通常在预测的时候,每一个物体四周的box都有可能产生有效预测。Non-max suppression要做的就是过滤掉质量较差的预测,为每个物体只留下一个有效预测。具体做法如下
经过Non-max suppression过滤后,最终结果如下:
每个物体只保留一个有效检测。
Anchor Box
Anchor Box要解决的问题就是像下面这幅图,有两个不同形状的物体,其中心点重叠。也就是一个grid box中有两个物体,这个通过一般的y label是没法反映出来的。
通常的y label是:
YOLO算法
先将样本图片切割成网格,针对每个网格填充标签y。
- 每个网格的左上点坐标为(0,0),右下角坐标为(1,1)。所以,是真实物体尺寸针对网格的比例。所以上图右边车子的bounding box的长宽可能是0.4x0.9,左边车子的长宽比可能是0.5x0.6。
- 如果有目标物体则,否则
- 如果有可能有图片重叠在一个格子的时候,需要设置对应的Anchor Box
后面就是经典的CNN了,最终得出对y的预测
最终输出的图像,可能是如下:
采用non-max suppression来过滤出最终的预测结果。
参考文献
YOLO: Redmon et al., 2015, You Only Look Once: Unified real-time object detection