4.卷积神经网络-第三周 目标检测

3.1 目标定位
Object localization
定位就是标明汽车在图片中的具体位置。
这里写图片描述
训练集不仅包含了神经网络要预测的对象分类标签,还包含了边界框的四个数字。接着用监督学习法输出一个分类标签还有这四个参数值,从而给出边界框的位置。
这里写图片描述
如何为监督学习任务定义目标标签y?
为简化,针对这种分类定位问题,图片最多只会出现其中一个对象。
如果图片中不存在对象,那么不用考虑网络输出中边界框的大小,也不用考虑图片中的对象是属于c1,c2,c3中的哪一类。so,do not care。不论图片中是否含有定位对象,构建输入图片x和分类标签y的具体过程都是如此。
这里写图片描述
这些(x,y)构建了训练集。
训练神经网络的损失函数。
如果用平方误差的策略,这里有8个元素,损失值等于每个元素相应差值的平方和。存在定位对象,y1 = 1,y1 就是 pc。
但是对于图片中没有对象的情况,就不能8个元素都考虑了,除y1外,不需要考虑其他元素,只需要关注神经网络输出pc的准确度。
这里写图片描述
为了方便理解,以上是简化版。在实际中,loss可以为c1,c2,c3 softmax loss。边界框应用平方误差或类似方法。对pc应用logistic regression loss或平方误差。
logistic regression loss
这里写图片描述
3.2 特征点检测
landmark detection
把神经网络输出的实数集作为一个回归任务。
概括的说,神经网络可以输出图片上特征点的(x,y)坐标,来实现对目标特征的识别。
选定特征点个数,生成包含这些特征点的标签训练集。然后利用神经网络输出脸部关键特征点的位置。
具体做法是:准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1(有人脸)或0(无人脸)。再输出其他特征点,识别面部表情的基本构造模块。
这里写图片描述
这些特征点都是人为标注的。
对于姿态估计而言,用神经网络标注关键点就相当于输出了人物的姿态动作。
通过标记关键点,可以判断人物的动作姿态,识别图片中人物的表情等。
3.3目标检测
学习如何通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。
如,以下是检测汽车的步骤。
首先,创建一个标签训练集,也就是x和y。And for our purposes in this training set,you can start off with I am going to call closely cropped images。即在一开始就使用适当剪切的图片。剪切标准:汽车要基本占据整张图片。
这里写图片描述
有了这些裁剪的图片,就可以开始训练卷积网络了。
这里写图片描述
训练完这个卷积网络,then use it in sliding windows detection,具体步骤如下:
首先,选定一个特定大小的窗口,将这个窗口(红色小方块)输入卷积网络,让卷积网络开始进行预测,即判断红色方框内有没有汽车。
继续滑动,处理第二个图像,
这里写图片描述
输入给卷积网络的只是红色方框内的区域。go on…直到这个窗口滑过图像的每一个角落。
为了滑动更快,可以增大stride。
图像滑动窗口操作的思路:以固定步幅滑动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类。
缺点:计算成本大。因为在图片中剪切出太多小方块,卷积网络需要一个个地处理。
在深度神经网络兴起前,用的是线性分类器,用滑窗法也还行。
除非采用超细粒度或极小stride,否则无法准确定位图片中的对象,计算成本就高了。所幸的是,计算成本问题已经有了很好的解决方案,大大提高了在卷积层上应用滑动窗口目标检测器的效率。
3.4 卷积的滑动窗口实现
为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的FC层转化成卷积层。
最后的4个圈分别对应softmax单元所输出的4个分类出现的概率。这4个分类可以是行人,汽车,摩托和背景。
原网络
这里写图片描述
如何把上图的全连接层转化成卷积层。
画一个卷积网络,前几层一样,对于全连接层,用5*5的filter实现,数量是400个。So,输入图像大小是5 * 5 * 16,用5 * 5 * 16的filter进行卷积,输出结果是 1 * 1。假设用了400个这样的5 * 5 * 16的filter,输出维度就是1 * 1 * 400。这样的话,就可以不再把全连接层看作是一个含有400个节点的集合,而是一个1 * 1 * 400的输出层。从数学角度看,它和全连接层是一样的。通过卷积网络,最终可以得到这个1 * 1 * 4 的输出层,而不是那四个数字。
这里写图片描述
以上,就是用卷积层代替全连接层的过程。
那么,如何通过卷积实现滑动窗口对象检测算法呢?convolution implementation of sliding windows
(借鉴OverFeat:2014,OverFeat: Integrated recognition, localization and detection using convolutional networks)
这里写图片描述
假设输入给卷积网络的图片大小是14 * 14 * 3(这个14 * 14也是滑窗的大小),and test set image is 16 * 16 * 3,所以用黄色标了一下。
这里写图片描述
滑动窗口的卷积应用使得卷积网络在这4次操作过程中很多计算都是重复的。
这里写图片描述
从上图可见,该卷积操作的原理是不需要把输入图片分割成四个子集,分别run forward propagation,而是把他们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享很多计算。
总结一下滑动窗口的实现过程:
在图片上剪切出一块区域,输入到卷积网络中,剪切next one,next one,直到某个区域识别出了车辆。
这里写图片描述
当然了,我们可以对大尺寸的整张图片进行卷积,一次得到所有预测值,并且希望能够识别出汽车的位置。这也叫做滑动窗口的卷积实现。效率蛮高的。
缺点:边界框的位置可能不够准确,或不能输出最精准的边界框。
3.5Bounding Box预测
这里写图片描述
如何输出更精准的边界框呢?
YOLO算法:
(2015,You Only Look Once: Unified real-time object detection.)
yolo的意思是you only look once。
具体做法:比如输入图像是100 * 100,然后在图像上放一个网格,这里是3 * 3,当然,实际实现时会用更精细的网格,或许是19 * 19。基本思路是使用图像分类和定位算法,将这算法逐一应用到9个格子上。更具体一点,需要定义训练标签,对于9个格子中的每一个,y是之前所说的8维向量,
这里写图片描述
YOLO算法要做的就是取对象的中点,然后将这个对象分配给包含对象中点的格子。
这里写图片描述
总的输出尺寸是3 * 3 * 8(目标输出尺寸)。
这里写图片描述
只要一个格子中只有一个对象,那么上述算法是没有问题的。若一个格子中存在多个对象的话,上述算法就不太合适了。所以,在实际中,网格会更加精细,这样不同对象分配到同一个格子的概率就小很多。
这里写图片描述
YOLO算法可以显式地输出边界框坐标,可以具有任意宽高比,并且能输出更精确的坐标。不会受到滑动窗口分类法的步长大小限制。其次,本算法是一个卷积实现,并没有在3 * 3网格上跑9次算法,而是用的单次卷积实现。使用了一个卷积网络,有很多共享计算步骤,所以算法的效率很高。
YOLO算法的好处:因为这是一个卷积实现,实际上它的运行速度非常快,可以达到实时识别。
有个小细节,如何编码这些边界框bx,by,(中心左边),bh,bw?
这里写图片描述
在YOLO算法中,约定左上的点坐标是(0,0),右下的点坐标是(1,1)。至于边界框的高度,用格子总体宽度的比例表示。in other words,this bx,by,bh,bw是相对格子尺度的比例。值得一提的是,bh和bw可能大于1。
指定边界框的方式有很多,但这种约定算是比较合理的。不过还有其他更复杂的参数化方式啦,连YOLO原文都不例外。bx,by涉及到sigmoid函数,确保值介于0和1之间。bh,bw涉及使用指数参数化,确保non-negative。当然,还有其他更高级的参数化方式,可能效果要更好一点。


下面是一些让YOLO变得更好的方法。
3.6交并比
如何判断对象检测算法运作良好呢?(衡量定位精确度的一种方式)
用交并比函数IOU。a function called intersection over union.评价对象检测算法。
这里写图片描述
用IOU来评价对象定位算法是否精确。但更一般地说,IOU衡量了两个边界框重叠的相对大小。所以也可以判断两个边界框的相似度。
3.7非极大值抑制
object detection中有一个问题,即算法可能对同一个对象做出多次检测。用non-max suppression 可以确保算法对每个对象只检测一次。非极大值抑制要做的就是清理检测结果,这样一辆车只检测一次,而不是每辆车都触发多次检测。
非极大值抑制意味着:只输出概率最大的分类结果,但抑制很接近,但不是最大的其他预测结果。
这里写图片描述
所以,可以先看看每个检测结果相关的概率p_c,实则是p_c * c1 or c2 or c3。看概率最大的那个,为最可靠的检测。然后,所有和这个最大的边界框有很高交并比的其他框就会被抑制。
这里写图片描述
在抑制之后,审视the remaining rectangles,找出概率最高的那个,认为又检测出了一辆车。然后非极大值抑制算法就会去掉其他IOU值很高的矩形。
这里写图片描述
如果直接抛弃变暗的框,就是最后得到的两个预测结果。
这里写图片描述
算法细节:
这里为简化问题,只检测车辆,去掉了c1,c2,c3。
这里写图片描述
p_c:算法中存在对象的概率。
如果尝试同时检测三个对象,比如行人,汽车,摩托,那么输出向量就会有三个额外的分量c1, c2 和 c3,事实证明,正确的做法是独立进行三次non-max suppression,对每个输出类别都做一次。
3.8 Anchor Boxes
锚盒可以改善Yolo算法。
到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象。如果想让一个格子检测出多个对象,可以使用anchor box这个概念。
下图中心基本重合,预测结果基本无法确定,需要使用anchor box的思想。
这里写图片描述
预先定义两个不同形状的anchor box,要做的就是把检测结果和这两个anchor box关联起来。一般来说,可能会用更多的anchor box。这里,我们用2个anchor box。
要做的事重新定义类别标签,与anchor box1关联的8个输出参数。和anchor box2有关的另外8个输出。
这里写图片描述
算法对比:
这里写图片描述
Previously:
对于训练集图像中的每个对象,都根据那个对象中点位置,分配到对应的格子中,所以输出是3 * 3 * 8。
With two anchor boxes:
每个对象都和之前一样分配到对象中点所在的格子中,但是它还分配一个anchor box,和对象形状交并比最高的anchor box。
对象在目标标签中的编码方式:(grid cell, anchor box )。
这里写图片描述
anchor box是为了处理两个对象出现在同一个格子的情况。
一些输出单元可以检测车子,一些输出单元可以检测行人。
请问,如何选择anchor box的形状呢?
一般手工指定anchor box的形状,覆盖想要检测的对象的各种形状。
有一种更好的方法:kmeans,可以将两类对象形状聚类,and if we use that to select a set of 具有代表性的anchor boxes,或许可以代表试图检测的十几个对象类别,这实际上是自动选择anchor box的高级方法。
3.9 YOLO算法
Put it together:yolo
如何构造训练集?
假设要训练一个算法检测3种对象。要训练training set,需要遍历9个格子,然后构成对应的目标向量y。最终输出尺寸就是3 * 3 * 16。
这里写图片描述
?实则是数字,多多少少是噪音。
实际中可能会用到更加精细的grid,和更多的anchor box,可能是19 * 19 * 5 * 8。这里的5表明是有5个anchor box,输出尺寸是19 * 19 * 40。
神经网络做预测:
这里写图片描述
预测之后,跑一下non-max suppression。
假设使用2个anchor box,那么对于9个格子中任何一个都会有两个预测的边界框,其中一个概率很低。But you still get two predicted bounding boxes for each of the 9 grid cells.
注意,有一些边界框可以超出所在格子的高度和宽度。
这里写图片描述
接下来,抛弃概率低的预测,连神经网络都说那儿啥样没有,
这里写图片描述
如果有3个类别,人,车,摩托,单独运行非极大值抑制。运行三次得到最终的预测结果。
这里写图片描述
算法最好能够检测出图像里所有的车子还有所有的行人。
3.10 RPN网络(选修)
RPN:Region proposals。
首先,得到候选区域,然后再分类。
sliding window:使用训练过的分类器,在这些窗口全部跑一遍。然后用一个detector,看看是否有车辆,行人,摩托。
带区域的卷积:RCNN,regions with convolutional networks。
2013,Rich feature hierarchies for accurate object detection and semantic segmentation。
这个算法尝试选出一些区域,在这些区域上运行卷积网络classifier是有意义的。所以,这里不再针对每个滑动窗口跑检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络classifier。
选出候选区域的方法是运行图像分割算法a segmentation algorithm,
这里写图片描述
可能会找出2000多个色块,然后在这个2000多个色块上放置边界框。然后在这2000个色块上跑一下分类器。这样,需要处理的位置较滑窗法而言要少很多,可以减少卷积网络分类器运行的时间。可以在各种尺度上运行分类器啦。
区域建议就是R-CNN的特色概念。
这里写图片描述
澄清一下,RCNN算法不会直接信任输入的边界框,而是会输出一个边界框bx,by,bh,bw。这样得到的边界比较精确,比单纯使用图像分割算法给出的色块边界要好。
这里写图片描述
Fast R-CNN用卷积实现了滑动窗口法。RCNN算法是逐一对区域分类的,而Fast R-CNN用的是滑动窗口法的一个卷积实现。提速了。但是,fast-rcnn还有一个问题,就是得到regions的聚类步骤很慢。
这里写图片描述
faster rcnn用卷积神经网络to propose regions,而不是用更加传统的分割算法来获得候选区域色块。进一步提速。
不过呢,这种faster rcnn还是比yolo算法慢很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值