一、对象定位
1.定位分类问题
(1)对象定位方法
通过四个参数bx,by,bh,bw,给出图片对象的边框。即,神经网络可以通过输出图片上的特征点的(x,y)坐标,来实现对目标特征的识别。
(2)对象定位分类
不仅要判断图片中是否是要识别的对象,还要在图片中标记出它的位置。
类似图片分类模型,想识别3个分类,你可以把分类标签C从1到3进行标记,或者把它变为3维的向量(3个数字),在对应位置填写上0或1,即可实现分类功能,标签标记通常采用后者方法。之后再加上四个参数bx,by,bh,bw,给出图片对象的边框,添加Pc参数,表示当前图片是否有目标对象,若Pc=0,则其他参数无效。
在对象检测问题中,一张图片中也可以包含多种不同分类的对象。
因此,图片分类的思路可以帮助学习分类定位,而对象定位的思路又有助于学习对象检测。
2.特征点检测
神经网络可以通过最后一层输出图片上特征点的(x,y)坐标,来实现对目标特征的识别。
例如,想实现人脸识别,可以选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。具体做法,将人脸图片输入卷积网络,输出一个face值,face=1或0,1表示有人类,0表示没有人脸,再然后输出特征点的坐标(x1,y1)......(x64,y64),即共有1+64*2=129个输出单元,由此实现图片对人脸检测和定位。
二、基于卷积网络实现滑动窗口的目标检测算法
1.滑动窗口的目标检测的原理
假设构建汽车检测算法,首先要构建带标签的训练集,为了获得更好的期望,可以适当剪切图片,使汽车居于中心位置并占据整张图片,有了标签训练集就可训练卷积神经网络了,输入适当剪切过的图片,卷积网络输出Y=0或1,0或1表示图中无汽车或有汽车。训练完卷积网络后,就可以用它来是实现滑动窗口目标检测。
(1)思路
以固定步幅滑动窗口,遍历图像的每个区域。通过选定特定大小的窗口,将其输入卷积网络。卷积网络开始进行预测,即判断窗口内有没有汽车,之后会将窗口滑动到下一个位置,再次判断窗口中有无汽车,以此类推,直至窗口滑过图像的每个角落。
(2)缺点
计算成本很大。若选用较大窗口,虽然会减少输入卷积网络的窗口个数,但是粗粒度可能影响性能。相反,如果用小步幅的窗口,则会增多输入卷积网络的窗口个数。
2.滑动窗口的目标检测算法在卷积层中的实现过程
(1)神经网络的全连接层转化为卷积层的方法
(2)滑动窗口在卷积层的实现过程
确定特定大小的窗口后,将整张图片输入给卷积神经网络,同时对所有窗口进行预测,最后可以直接根据卷积层的输出,判断出哪块区域有无需要识别的对象。
优点:利用卷积层,一次得到所有窗口范围内的预测值,使得滑动窗口的目标检测算法更加方便。
缺点:边界框的位置可能不够准确,可能不存在整个车都在窗口的边界框。
三、对象检测算法的组件
1.Bounding boxes(边界框)----每个格子只能检测一个对象
(1)如何编码bounding boxes边界框的位置(bx,by,bh,bw)
对于一个格子,规定最上角坐标为(0,0),右下角坐标为(1,1)。则下图边界框中心位置(bx,by)为格子长和宽为(0.4,0.3),(bh,bw)为红色边界框长和宽所占格子长和宽的比例(0.9,0.5),这个值可能会大于1,即超过格子范围。但是通常约定(bx,by,bh,bw)=(0.4,0.3,0.9,0.5)比较合理。
(2)Bounding boxes预测在YOLO中的应用
在图像上放一个网格,使用图像分类和定位算法,逐一应用到图像的格子上,每个格子对应一个y标签,y=(Pc,bx,by,bh,bw,c1,c2,c3,......),其中Pc为1或0,表示图中有无目标对象,若Pc为0,其他参数无效。(bx,by,bh,bw)表示图片对象的边框位置,(c1,c2,c3,......)表示对象的类别。
将整张图像划分3×3的格子,传给卷积层,通过反向传播训练,最后得到3×3×8的输出。这里3×3表示图像分为9个格子,会有9个预测值。8即表示每个格子中预测值y的纬度,y=(Pc,bx,by,bh,bw,c1,c2,c3)。若格子中有对象,Pc=1,则会有具体的(bx,by,bh,bw)边界框位置。若格子中无对象,Pc=0,则其他参数无效。若Pc等于1,再看(c1,c2,c3,...)中哪个为1,从而判断为那种类型的对象,再根据(bx,by,bh,bw)得到精确的边界框位置,即对象精确位置。
Bounding boxes预测优点:神经网络可以输出精确的边界框,得到目标对象的精确位置。
Bounding boxes预测缺点:格子中对象数目不能超过一个,即小于等于1,否则会出现问题。
注意:
(1)把对象分配到一个格子的过程是观察对象的中点,然后将对象分配到其中点所在的格子,所以即使对象可以横跨多个格子,也只会分配到所以格子的其中之一。
(2)若采用更精细的表格19×19,则多个对象分配到同一个格子中的概率就更小,即多个对象的中点位于同一个格子的概率更低。
2.Anchor boxes(锚框)---每个格子可以检测出多个对象
原理:预先定义两个不同形状的锚框anchor box,当然也可以定义多个anchor box,以两个为例,然后把预测结果和这两个anchor box关联起来,则预测值应有两个anchor box的参数组合起来。
3.交并比(IoU)
(1)原理
交并比是用来评价对象检测算法的好坏。用对象真实边界框与算法预测的边界框之间交集区域面积与两者之间并集区域面积的比值,来衡量对象检测算法的好坏。
(2)计算区域面积的方法
为了计算相交的区域,我们需要确定相交的区域的宽、高均为正数,否则就为0,我们可以使用max(height, 0)
与 max(width, 0)
来完成。
4.非最大值抑制( non-maximum suppression (NMS))
(1)原理
通过阈值来过滤了一些得分较低的分类,但是我们依旧会有很多的锚框被留了下来,第二个过滤器就是让下图左边变为右边,我们叫它非最大值抑制,主要采用交并比(IoU)原理。
(2)实现过程
首先,对于检测某一对象时,输出应为(Pc,bx,by,bh,bw),对于一个对象占据多个格子时,由于每个对象都会有个Pc值,我们可以规定一个阈值Pc=0.6,Pc小于等于0.6的都被筛选掉,过滤了一些得分较低的分类。
最后,选取一个最大的Pc边界框,计算其他边界框与它的交并比(IoU),再规定一个阈值,IoU=0.5,过滤掉交并比大于IoU的边界框,以此重复,直到不再有比当前选中的框得分更低的框,最后只得到唯一边界框。
若有汽车、行人、信号灯等多个类别,则可以分别对每个类别进行非最大值抑制。
三、YOLO算法(you only look once)
1.输入和输出的格式
2.YOLO算法的编码
使用了5个锚框,19x19的单元格,所以每个单元格内有5个锚框的编码信息,锚框的组成是Pc+px+py+ph+pw+c1+c2+.....c80.。
为了方便,我们将把最后的两个维度的数据进行展开,所以最后一步的编码由(m,19,19,5,85)变为了(m,19,19,425)。
3.对于某类对象在格子中的概率确定
对于每个单元格的每个锚框而言,我们将计算下列元素的乘积,并提取该框包含某一类的概率。
4.YOLO预测图的可视化预测的两种方法
(1)颜色填充
- 对于每个19x19的单元格,找寻最大的可能性值,在5个锚框和不同的类之间取最大值。
- 根据单元格预测的最可能的对象来使用添加颜色的方式来标记单元格。
(2)绘制边界框
5.YOLO算法流程
(1)输入图像为(608,608,3)
(2)输入的图像先要通过一个CNN模型,返回一个(19,19,5,85)的数据。
(3)在对最后两维降维之后,输出的维度变为了(19,19,425):
- 每个19x19的单元格拥有425个数字。
- 425 = 5 x 85,即每个单元格拥有5个锚框,每个锚框由5个基本信息+80个分类预测构成。
- 85 = 5 + 85,其中5个基本信息是(Pc,px,py,ph,pw),剩下80就是80个分类的预测。
(3)然后我们会根据以下规则选择锚框:
- 预测分数阈值:丢弃分数低于阈值的分类的锚框。
- 非最大值抑制:计算交并比,并避免选择重叠框。
(4)最后给出YOLO的最终输出。
6.YOLO算法优点
(1)与图像分类和定位算法很像,能显示输出边界框坐标,能让神经网络输出边界框,可以具有任意宽高比,并且能输出更精确的坐标,不会受滑动窗口分类器的步长大小限制。
(2)这是一个卷积实现,不需要每个格子都单独跑一次算法,而是单次卷积实现,一次性在所有格子上运行算法,在使用卷积网络时,有很多共享计算步骤,这个算法效率很高,甚至可以达到实时识别。
(3)采用Anchor boxes方法,每个格子可以同时检测到多个对象。