深度学习笔记(四)(3)目标检测(Object detection)
3.1 目标定位(Object localization)
想要定位目标,要在标准的分类过程下,让神经网络多输出几个单元,输出一个边界框。具体说就是让神经网络再多输出4 个数字,标记为????????,????????,????ℎ和????????,这四个数字是被检测对象的边界框的参数化表示。(,)是指定的图象的中心点,是边界框的高度,宽度为
若果没有检测到对象,对于=0的情况,则y的其他参数就会变得没有意义。
3.2 特征点检测(Landmark detection)
假如要探测人脸的64个特征,则:
一旦了解如何用二维坐标系定义人物姿态,操作起来就相当简单了,批量添加输出单元,用以输出要识别的各个特征点的(????, ????)坐标值。要明确一点,所以标签在所有图片中必须保持一致,就是特征点1是左眼角,那他就是左眼角,不能改变。
3.3 目标检测(Object detection)
假如你想构建一个汽车检测算法,步骤是,首先创建一个标签训练集,也就是????和????表示适当剪切的汽车图片样本,这张图片(编号 1)????是一个正样本,因为它是一辆汽车图片,这几张图片(编号 2、3)也有汽车,但这两张(编号 4、5)没有汽车。出于我们对这个训练集的期望,你一开始可以使用适当剪切的图片,就是整张图片????几乎都被汽车占据,你可以照张照片,然后剪切,剪掉汽车以外的部分,使汽车居于中间位置,并基本占据整张图片。创建完训练集后,就可以训练卷积网络,训练完后,就可以用它来实现滑动窗口目标检测:
首先选取一个特定大小的窗口,然后将它输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。
然后
然后第三次重复操作,这次选用更大的窗口。。。。。
如果你这样做,不论汽车在图片的什么位置,总有一个窗口可以检测到它。这种算法叫作滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。
缺点:计算成本,但若步幅选择较大,虽然减少计算成本,但是粗略间隔尺寸又会影响性能;反之,如果采用小粒度或小步幅,传递给卷积
网络的小窗口会特别多,这意味着超高的计算成本。
3.4 滑动窗口的卷积实现(Convolutional implementation of sliding windows)
这个算法可以说是上面的滑动窗口目标检测的一种提升,本节主要讲解讲如何在卷积层上应用这个算法。
演示卷积的应用过程(这个图的上面是原来的卷积实现,下面是应用改造):
然后通过卷积实现算法:
这个要多看视频吧,看了俩边才好像懂了。。
从图跟上面的图对比可以看出这里是把全连接层变为了卷积层的结果。
这个图代表的就是假设向滑动窗口卷积网络输入 14×14×3 的图片,这个时候只对应了输出为1 * 1 * 4,因为有一个结果这一个结果就是卷积的图片是否有的结果。
现在变为了16 * 16 * 3的输入图片,这个时候想要用网络进行卷积,就要如图按照 14 * 14 的框选去进行四次卷积操作,最后的输出结果是2 * 2 * 4,就是对应了四次不同卷积的结果,代表了每次卷积的图片是否有想要的目标。
提高效率实现的原因:
执行滑动窗口的卷积时使得卷积网络在这 4 次前向传播过程中共享很多计算,就是重复计算的地方就计算了一次,跟上一节的对比看一下
划线部分是一个重点,虽然第一步的步长是1,但是MAX POOL的步长是2,也就相当于以2的步幅在原始图片上应用了。
3.5 Bounding Box 预测(Bounding box predictions)
滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框。这里将提出怎么获得精准的边界框。
其中一个能得到更精准边界框的算法是 YOLO 算法,YOLO(You only look once)这张图有两个对象,YOLO 算法做的就是,取两个
片的输出标签尺寸就是 3×3×8。
所以这个算法的优点在于神经网络可以输出精确的边界框,所以测试的时候,你做的是喂入输入图像????,然后跑正向传播,直到你得到这个输出????。只要每个格子中对象数目没有超过 1 个,这个算法应该是没问题的。
注意:
这个图形分类与定位很像,但它显式地输出边界框坐标,所以这能让神经网络输出边界框,可以具有任意宽高比,并且能输出更精确的坐标,不会受到滑动窗口分类器的步长大小限制。并且使用卷积实现,效率很高,可以达到实时识别。
**而如何输出精准坐标呢?**即精准输出,,,
指定边界框的方式有很多,但这种约定是比较合理的,如果你去读 YOLO 的研究论文,YOLO 的研究工作有其他参数化的方式,可能效果会更好,我这里就只给出了一个合理的约定,用起来应该没问题。不过还有其他更复杂的参数化方式,涉及到 sigmoid 函数,确保这个值(和)介于 0 和 1 之间,然后使用指数参数化来确保这些(和)都是非负数,因为 0.9 和 0.5,这个必须大于等于 0。还有其他更高级的参数化方式,可能效果要更好一点,但我这里讲的办法应该是管用的。
3.6 交并比(Intersection over union)
loU函数可以用来判断算法是否检测的好。一般约定,在计算机检测任务中,如果???????????? ≥ 0.5,就说检测正确,如果预测器和实际边界框完美重叠,loU 就是 1,因为交集就等于并集。但如果要求更高,可以把阈值0.5设计更高。
这是衡量定位精确度的一种方式,你只需要统计算法正确检测和定位对象的次数,你就可以用这样的定义判断对象定位是否准确。
3.7 非极大值抑制(Non-max suppression)
你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个对象只检测一次。
算法细节:
英文部分:最首先把中小于阈值的抛弃,然后在剩余的里面,先挑最大概率的把他当成输出结果,接下来去掉所有剩下的边界框,任何没有达到输出标准的边界框,之前没有抛弃的边界框,把这些和输出边界框有高重叠面积和上一步输出边界框有很高交并比的边界框全部抛弃。
以 while 循环的第二步是上一张幻灯片变暗的那些边界框,和高亮标记的边界重叠面积很高的那些边界框抛弃掉。在还有剩下边界框的时候,一直这么做,把没处理的都处理完,直到每个边界框都判断过了,它们有的作为输出结果,剩下的会被抛弃,它们和输出结果重叠面积太高,和输出结果交并比太高,和你刚刚输出这里存在对象结果的重叠程度过高。
3.8 Anchor Boxes
额外的细节:如果你有两个 anchor box,但在同一个格子中有三个对象,
这种情况算法处理不好,你希望这种情况不会发生,但如果真的发生了,这个算法并没有很好的处理办法,对于这种情况,我们就引入一些打破僵局的默认手段。
怎么选取 anchor box?人们一般手工指定 anchor box 形状,你可以选
择 5 到 10 个 anchor box 形状,覆盖到多种不同的形状,可以涵盖你想要检测的对象的各种形状。或者使用YOLO论文中有K-平均算法。
3.9 YOLO 算法(Putting it together: YOLO algorithm)
假设你要训练一个算法去检测三种对象,行人、汽车和摩托车,你还需要显式指定完整的背景类别
对于为0时,那他下面的数字就是噪音,没有意义。
当使用网络预测出来结果后,最后你要运行一下这个非极大值抑制。
3.10 候选区域(选修)(Region proposals (Optional))
R-CNN 的算法,意思是带区域的卷积网络,或者说带区域的 CNN。这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,所以这里不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。
这个细节就是所谓的分割算法,先找到可能的色块,然后在色块上运行分类器,来达到减少计算量的效果。这就是 R-CNN 或者区域 CNN 的特色概念,现在看来 R-CNN 算法还是很慢的。
R-CNN 算法不会直接信任输入的边界框,它也会输出一个边界框????????,????????,????ℎ 和????????,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好,所以它可以得到相当精确的边界框。
在R-CNN算法的一个缺点是太慢了,然后有了Fast-CNN,然后又有了Faster-CNN。
候选区域的概念在计算机视觉领域的影响力相当大,得候选区域是一个有趣的想法,但这个方法需要两步,首先得到候选区域,然后再分类,相比之下,能够一步做完,类似于 YOLO 或者你只看一次(You only look once)这个算法,在吴老师看来,是长远而言更有希望的方向。我也听从吴老师的建议,决定批评接受。/doge
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度学习笔记(四)(3)目标检测(Object detection) - Python技术站