吴恩达机器学习——04卷积神经网络(3)
这一节的内容是目标检测。
一、目标定位与特征点检测
二、目标检测
三、卷积的滑动窗口实现
四、Bounding Box预测
五、交并比、非极大值抑制与Anchor Boxes
六、YOLO算法
七、候选区域
一、目标定位与特征点检测
1、目标定位
1.1、图片检测问题:
(1)分类问题:判断图中是否为汽车
(2)目标定位:判断是否为汽车,并确定其具体位置
(3)目标检测:检测多种不同物体并定位
1.2、目标分类与定位
对于目标定位问题,卷积网络可能如下:
得到预测值y,其中bx,by代表汽车中点,bh,bw分别表示定位框的高和宽,以图片左上角为(0,0),右下角为(1,1),那么这四个参数数字均为位置或者长度所在图片的比例大小。
当pc=1时,表示图中存在物体
当pc=0时,表示图片中不存在物体,那么此时y的其他值为多少没有意义,不会参与损失函数的计算。
1.3、损失函数
(1)如果采用平方误差形式的损失函数:
此时,我们只需要关注神经网络对所有输出值的准确度,要求出8个参数产生的偏差。
此时,我们只需要关注神经网络对背景值的准确度,只需要求出pc的偏差,而其余七个参数没有意义。
(2)当然在实际应用中,我们可以采用如下方法:
对c1,c2,c3的softmax不使用对数似然损失函数来输出其中的一个值。通常的做法是对边界框坐标应用平方差或者类似方法,对pc应用逻辑回归函数,甚至采用平方预测误差也可以的。
2、特征点检测
由前面的目标定位问题,我们可以知道,神经网络可以通过输出图片上特征点的坐标(x,y),来实现对目标特征的识别和定位标记。
如对人脸识别的问题中,我们通过标定训练数据集中特征点的位置信息,来对人脸进行不同位置不同特征的定位和标记。AR的应用就是基于人脸表情识别来设计的,如脸部扭曲、增加头部饰件等。在人体姿态检测中,同样可以通过对人体不同的特征关键点的标注,来记录人体的姿态。
二、目标检测
目标检测,学习如何通过卷积网络进行对象检测,采用的是滑动窗口的目标检测算法。
2.1、训练模型:
训练集X:将有汽车的图片进行适当的裁剪,剪切成整张几乎都被汽车占据的小图片,或者没有汽车的小图;
训练集Y:对X中的图进行标注,有汽车的标注1,没有汽车的标注0。
2.2、基于滑动窗口的目标检测算法
利用2.1训练出的模型,即:首先创建一个标签训练集,也就是x和y表示适当剪切的汽车图片样本,上图编号1x是一个正样本,因为它是一辆汽车图片,编号2、3也有图片,但是4、5没有汽车。有了这个标签训练集,我们就可以开始训练卷积网络了,输入这些适当剪切过的图片(编号6),卷积网络输出y,0或1表示图中没有汽车或者有汽车。训练完这个网络,我们就可以用它来实现滑动窗口目标检测了。
滑动窗口目标检测步骤:
(1)、一张测试图片,首先选定一个特定大小的窗口,并将小方块的内容输入到训练好的卷积网络中,卷积网络开始预测,即判断窗口内有没有汽车。
(2)、滑动窗口按照从左到右、从上至下的方向以固定步幅移动,并持续输入到卷积网络中检测,并输出每个位置的0/1(有无车),直至遍历图片的每一个角落。
(3)、选择一个更大的窗口,并重复1、2步骤。(加上最初的,要进行三个不同大小的窗口的遍历检测)。
缺点:计算成本大,因为每个窗口的小图都要经过卷积网络的一个个处理预测。如果选择的窗口移动步幅太大,会减少要检测的图片数量,但是粗糙尺寸可能会影响性能。反之,如果采用小粒度或者小步幅,传递给卷积网络的小窗口会特别的多,这意味着超高的计算成本。(神经网络兴起之前,使用的是线性分类器,所以滑动窗口的计算成本低)
三、卷积的滑动窗口实现
上面讲了卷积网络实现滑动窗口对象检测算法,但是效率很低。现在我们在卷积层上应用这个算法。
为了构建滑动窗口的卷积应用,首先我们要知道如何把神经网络的全连接层转化为卷积层,如下图:
对于上图,上下两个网络的前几层是一样的,而对于下一层,也就是第一个全连接层,我们可以用5x5的过滤器来实现,数量是400个,输入图像的大小为5x5x16,用5x5的过滤器对它进行卷积操作,过滤器实际上是5x5x16,因为在卷积的过程中,过滤器会遍历16个通道,输出结果为1x1,因为有400个过滤器,所以最后得到的输出维度是1x1x400。从数学角度来讲,它和全连接层是一样的,因为这400个节点中每个节点中每个节点都有一个5x5x16(这里的16同上来理解)维度的过滤器,所以每个值都是上一层这些5x5x16**值经过某个任意线性函数的输出结果。在下一个FC层,则使用1x1的过滤器。
滑动窗口的卷积实现:
在这里,是以16x16x3图像为例,并且训练好了的卷积网络是对14x14x3的图像进行处理并得到预测值,因此,在16x16x3上我们可以应用滑动窗口得到四个子图像来进行操作。但是,在滑动窗口的操作时,输入部分有大量的重叠,也就是有很多重复的运算,导致在每次在下一层中的特征图中也存在着大量的重叠。
CNN可以实现上图的效果是因为卷积操作的特性,就是图片的空间位置信息的不变性,尽管卷积过程中图片大小减少,但是位置对应关系还是保存的。
卷积操作的原理是我们不需要把输入图像分成四个子图像,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算。(注意:在最后的输出时,与可以滑动得到的窗口数量有关系)
示例:汽车目标检测
依据上面的方法,无需利用滑动窗口分割图片,只需要一次前向传播,就可以得到所有图片子集的预测值。利用卷积的方式实现滑动窗口算法的方法,提高了整体的计算效率。
四、Bounding Box预测
上面的卷积方式实现的滑动窗口算法,使得在预测时计算的效率大大的提高,但是其存在的问题是:无法精确的输出最精确的边界框。
在滑动窗口算法中,我们取的一些离散的图片子集的位置,在这种情况下,有可能我们没有得到一个能够完美匹配汽车位置的窗口,也有可能真实汽车的边界框为一个长方形。所以我们需要寻找更加精确的边界框(Bounding Box)。
能找到更精确边框的算法:YOLO算法(You only look once)
keys:
(1)在整幅图片上加上较为精细的网格,将图片分割为nxn个小的图片(me:从更小的图片中来使用训练好的网络来寻找对象会更加精确一点)。
(2)采用图像分类和定位算法,分别应用在图像的nxn个格子中。
(3)定义训练标签:(对于每个网格,定义一个向量yi=[Pc bx by bh bw c1 c2 c3])
(4)将nxn个格子标签合并在一起,最终的目标输出Y的大小为:nxnx8(这里8是因为例子中目标值参数个数是8)
tips:
(1)将对象分配到一个格子里,是根据对象的中点是否在格子里,不管对象是否横跨多个格子。
(2)YOLO算法显式地输出了边界框(即在y向量中精确的输出了边框的信息),使得其可以有任意的宽高比,并且能够输出更加精确的坐标,不受滑动窗口分类器的步长大小限制。
(3)YOLO算法是一次卷积实现,并非在nxn的网格上进行了n^2此运算,而是单次卷积实现,算法效率高,运行速度快,可实现实时识别。(留个坑,看看代码的实现。。。。)
bounding box的一些小细节:
边界框四个参数的指定,四个参数都是以中心点所在网格的长度为比例的,对于每个网格,以左上角为(0,0),右下角为(1,1);中点bx,by表示坐标值,在0~1之间,宽高bh,bw表示比例值,存在>1的情况。
五、交并比、非极大值抑制与Anchor Boxes
5.1、交并比(Intersection-over-Union)
交并比是用来评价目标检测算法是否运作良好。结果越大越好。
5.2、非极大值抑制(non-max suppression,NMS)
非最大值抑制可以确保我们的算法对图中的一个对象只检测一次,因为在更加精细的格子里,最终预测输出的结果中,可能会有多个相邻的格子里均检测出同一个对象(通过清除预测pc最大值周围的非最大值边界框)。
tips:
(1)非最大值抑制对多种检测结果进行清理:选取最大Pc的边界框,对所有其他与该边界框具有高交并比或高重叠的边界框进行抑制。
(2)逐一审视剩下的边界框,寻找最高的Pc值边界框,重复(1)。
NMS算法:
以单个对象检测为例:
(1)对于图片的每个网格预测输出矩阵:yi = [Pc bx by bh bw],其中Pc表示有对象的概率;
(2)抛弃Pc<=0.6的边界框,也就是低概率的情况;
(3)对剩下的边框遍历:
-选取最大的Pc值的边界框,作为预测输出边界框;
-抛弃和选取的边界框IoU>=0.5的剩余的边界框。
如果是对于多个对象存在检测的,那么正确的做法是:对每个输出类别都独立使用一次非极大值抑制。
5.3、Anchor Boxes
到目前为止,对象检测问题都是一个格子值检测一个对象,如果想要一个格子检测出多个对象,就要使用anchor box这个概念。
Anchor box预先定义多个不同形状的Anchor box,我们需要把预测目标对应地和各个Anchor box关联起来。用如图新定义的y来最终表示多个重叠的目标。
上图中有两个对象,但如果其中只有汽车时,我们使用了两个anchor box,那么我们的目标向量就成为:yi=[0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0 ],“?”表示我们不关心其值时多少。
tips:
如果我们使用了两个Anchor box,但是同一个格子却有更多对象的情况,或者两个对象的anchor box形状一样,这些情况需要引入一些其他的手段来处理。
对于anchor box的选择, 一般时手工选定,选择5~10个以覆盖到多种不同的形状,可以涵盖我们想要检测对象的形状。还有另一种比较高级的方法,就是将不同对象形状进行聚类,用聚类后的结果来选择一组最具有代表性的Anchor box,以此来代表我们想要检测对象的形状。
六、YOLO算法目标检测
假设在图片中检测三种目标:行人、汽车和摩托车,同时使用两种不同的Anchor box。
训练集:
模型预测:
使用非极大值抑制(NMS):
初始:
抛弃Pc低的预测bounding boxes:
对每个对象(如行人、汽车、摩托车)分别使用NMS得到最终结果(在这里,上图的两个框应该时属于同一种类别了,否则NMS无法消除掉其中的框)。
七、候选区域(region proposals)
R-CNN(Regions with concolutional networks):此算法会在图片中选择一些目标的候选区域,从而避免了传统滑动窗口在大量无对象区域的无用运算。
具体实现:运用图像分割算法,将图片分成需要不同颜色的色块,然后在这些色块上放置窗口,将窗口中的内容输入网络,从而减少需要处理的窗口数量。
更快的算法:
(1)R-CNN:给出候选区域,不适用滑动窗口,对每个候选区进行分类识别,输出对象标签和bounding box,从而再确定确实存在对象的区域得到更加精确的边界框,但是速度慢。
(2)Fast R-CNN:给出候选区域,使用滑动窗口的卷积实现去分类所有的候选区域,但得到后选区的聚类步骤仍然非常的慢;
(3)Faster R-CNN:使用卷积网络给出候选区域。
总结:滑动窗口的实现,是在一个很大图上进行子图遍历,通过卷积的实现,将这种需要遍历的单独输入到网络中预测变成了单个卷积操作,极大的节省了计算成本。交并比是一个衡量参数,Anchor boxes是关于不同对象的边框形状。YOLO算法,将一个图片分为nxn的格子,我认为在小格子里再来进行卷积滑动窗口的一个操作相比于在整幅图像会让检测变得更加精细。而且在进行实际网络预测时,是使用的单个卷积网络,最终结果输出为nxnx8(or 16,参数值)而达到一个分成nxn个格子。。。。看完代码再回来修改吧
参考内容:https://zhuanlan.zhihu.com/p/31284596