第三周:目标检测
本文是卷积神经网络的笔记。
3.1 目标定位(Object Localization)
- Classification with localization: 把一个物体在图像中框出来
- Detection:把图像中所有物体框出来(可以是不同的类别)
下面我们考虑一个分类问题,类别为:
- pedestrain
- car
- motorcycle
- background
其中前面3类,我们称为图像中有物体。
记号:
- 图片左上角记为(0,0),右下角记为(1,1),竖着为y轴。
- 框(Bounding Box)左上角为,框的高度和宽度
- 输出:(一个分成3类的例子)
其中是图片中有物体的概率,对应Bounding Box的左上角和框的高度和宽度。为属于三个类别的概率。
例如
-
可以框出图像中的汽车。
当图像中无物体的时候,其他的数值就没有意义。 -
损失函数的定义
分成2类,是否检测到数据。
Rq:
实际上,我们可以对不同的输出使用不同的损失函数计算方法,例如我们可以对Pc使用交叉上损失函数,对于使用多分类任务的损失函数
3.2 特征点检测(Landmark Detection)
我们可以通过脸部特征点判断人物表情。
特征点也可以帮助检测人物的姿态。
- 例如:
我们选择64个脸部特征点,则一个常见的输出为:
目标检测
滑动窗口法:
(以检测车辆为例)
- 先训练一个检测车辆的分类器,
- 我们先选择一个小的窗口,从左到右,从上到下滑动,检测图像中是否有待检测的物体。
- 如果没有可以换一个大一点的窗口试一试。
缺点:
- 计算速度慢
滑动窗口的卷积方法实现
将FC层变成卷积层
Rq:
相当于一个立方体的每一个格子里依次取1。
滑动窗口的卷积方法实现
这里我们取的窗口是
Rq:
- 我们可以这样理解,最后输出的一个蓝色放个对应原来图像上的的图像,而最后一个例子中原来的图像输出的结果为 中的每一个格子就代表了每一个窗口的检测结果。
- 比较快的原因是因为我们可以通过矩阵乘法实现,而不用for循环,一次正向传播就可以得到所有窗口的预测结果。
缺点:
Bounding Box的边界可能不太精确
3.5 Bounding Box预测改进:YOLO算法
为了让Bounding Box更加准确
名称来源:
- YOLO: You Only Look Once
原理:
- 将图分成9个Grid,每一个Grid里面的训练标签为:
我们看的是框的中心,如果中心在9个Grid中间:
- 所以我们的输出为,即每一个Grid得到一个的向量y。一般来说我们可以把图像分得更精细一点。
Rq:
我们采用3.4节讲的方法,只要一次卷积的正向传播。
框的描述:
3.6 交并比
交并比(Intersection over Union,IoU)
用来评估Object Detection
Rq:
- 紫色是我们的预测结果,红色是我们之前数据的标注。
- 我们可以自己定一个比率说明我们的框是正确的。
3.7 非极大值抑制(Non-max suppression)
为了改进YOLO算法
⚠️ ⚠️ 对于同类物品,只有它的IoU大于阈值才会被抑制。(为了实现一个物体一个框)
当Grid足够精细的时候,可能有多个格子都预测会有汽车:
鉴于可以大于1,所以,如果一个Grid认为它检测到了一辆车,它就会给出一个框。因此会导致对一辆车触发多次预测。但是我们可以通过非极大值抑制使得每辆车只触发1次检测。
步骤
设置一个阈值,丢弃所有的框。
while(还有Boxes):
- 挑选同一个物体预测概率最大值,并高亮它的Bounding Box
- 变暗其他和高亮的框之间IoU比较高()的框,直接丢弃。
Rq:
- 如果是多类别:可以对每一个类别进行一次Non-Max Suppression
3.8 Anchor Boxes
问题:Overlapping Objects
即两个物体的中心都在同一个Grid里面,则可能会导致输出异常(只有一个框)
为了解决这个问题,我们引入横着和竖着的anchor box,见上图紫色的框,为了描述每一个Grid,我们采用
Rq:
- 每个物体的框属于跟原来训练标签中的框有最高的IoU的框。
- 如果上图就可以用来描述,其中上半部分为Anchor Box1,对应的是站立着的人(因为一开始训练标签里人的样子是竖着的,因此和AnchorBox的IoU值最大。)
- 如果Grid中只有车,则它对应的为。
缺点:
- 如果有大于等于3种类别
- 如果两个物体的Anchor Box形状相同。
Rq:
- 可以用K-Means聚类寻找Anchor Box的形状,否则要手动设置。
3.9 YOLO算法
训练集合
每一个Grid对应一个y,y的值为
具体步骤
- 对于每一个Grid得到基于两个Anchor Box的预测。
- 去除概率比较低的预测
- 对于每一类调用Non-Max Suppression 得到最后的结果:
3.10 Region proposal: R-CNN (Regions with CNN)
YOLO可能会更快。
R-CNN
通过图像分割算法(Segmentation),将图片分成若干块,再在每块上运行Detection的神经网络。这样避免了直接使用CNN导致在一些没有待识别物体的窗口上浪费时间。
Fast R-CNN
在R-CNN的基础上引入了卷积的滑动窗法,加快了Detection的处理速度。
Faster R-CNN
使用了神经网络来分割图像,加快了得到候选区域的速度。
第三周测试重点:
-
分成3类:行人(c=1),汽车(c=2),摩托车(c=3)。
下图中的标签哪个是正确的?注:y=
y=[1, 0.3, 0.7, 0.3, 0.3, 0, 1, 0] //横着是x轴
y=[0, ?, ?, ?, ?, ?, ?, ?] -
计算IoU,左上角方块22,右下角方块23
-
Non-Max Suppression
假如你在下图中的预测框中使用非最大值抑制,其参数是放弃概率≤ 0.4的框,并决定两个框IoU的阈值为0.5,使用非最大值抑制后会保留多少个预测框?
答案:5个,对于同类物品,只有它的IoU大于阈值才会被抑制。(为了实现一个物体一个框) -
假如你使用YOLO算法,使用19x19格子来检测20个分类,使用5个锚框(anchor box)。在训练的过程中,对于每个图像你需要输出卷积后的结果y作为神经网络目标值(这是最后一层),y可能包括一些“?”或者“不关心的值”。请问最后的输出维度是多少?
答案:19x19x(5x25),其中
(1个数值输出+4个Bounding Box的坐标+20个类别的0/1值)*anchor box的数量。