摘要: 一文了解目标检测技术发展,不要错过哟。
目标检测旨在准确地找到给定图片中物体的位置,并将其正确分类。准确地来说,目标检测须要肯定目标是什么以及对其定位。算法
然而,想要解决这个问题并不容易。由于,目标的大小,其在空间中的方向,其姿态,以及其在图片中的位置都是变化的。网络
这里有一张图片,咱们须要识别图片中的物体,而且用方框将该物体圈出来。框架
图像识别(分类)函数
定位:性能
现在大火的卷积神经网络帮助咱们很好地进行图像识别。可是,咱们仍须要一些额外的功能来进行精肯定位,深度学习在这里发挥了很好的做用。学习
在本文中,咱们将从目标定位的角度入手探讨目标检测技术的发展。咱们将按着以下的演化顺序讲述:R-CNN->SPP Net->Fast R-CNN-> Faster R-CNN优化
在开始前,咱们将对基于区域的卷积神经网络(R-CNN)进行简单的介绍。spa
若是咱们将其看做是一个回归问题,则须要对(x,y,w,h)四个参数进行预测,从而获得方框所在位置。设计
步骤13d
步骤2
步骤3
步骤4
接着,咱们将进行两次微调操做。第一次在AlexNet上进行,第二次将头部改成回归头。
回归部分加在哪里呢?
两种解决办法:
可是实现回归操做太困难了,咱们须要找到一种方法将其变为分类问题。回归的训练参数收敛的时间要长得多,因此上面的网络采起了用分类的网络来计算网络共同部分的链接权值。
左上角的黑框:得分0.5
右上角的黑框:得分0.75
左下角的黑框:得分0.6
右下角的黑框:得分0.8
根据这些得分,咱们选择右下角的黑框做为所要预测的目标位置。
注:有的时候也会选择得分最高的两个方框,而后取两个方框的交集做为最终须要预测的位置。
问题:方框的大小如何肯定呢?
当取了不一样的方框后,依次从左上角扫描到右下角。
总结:
对第一张图片,咱们使用不一样大小的方框(遍历整张图片)将图片截取出来,输入到CNN,而后CNN会输出这个框的分类以及这个框图片对应的(x,y,w,h)。
可是,这个方法太耗费时间了,须要作一些优化。最初的网络模型以下图所示:
所作优化:将全链接层改成为卷积层以提升速度。
当图中有多个物体存在的时候咱们应该如何作呢?如今咱们所要解决的问题就变成了:多个目标识别+定位。
如今咱们还能将其看做分类问题么?
但是,将其看做分类问题的话会有以下矛盾产生:
若是将其看做分类问题,咱们能作哪些优化呢?咱们并不想使用太多的方框在不一样的位置间来回尝试。下面,给出了一种解决方案:
首先,咱们须要找出包含全部目标的方框。其中有的方框会产生重叠或者互相包含,这样咱们就不用枚举出全部的方框了。
对于候选框的获取,前人发现了不少种方法:好比EdgeBoxes和Selective Search。如下是候选方框获取方法的性能对比:
对于“选择性搜索”是如何选出全部候选方框这个问题,本文不做介绍,有兴趣的能够对其相关论文进行研究。
上述说起的思路推进了R-CNN的面世。让咱们以一样的图片为例,对R-CNN进行讲解。
步骤1
下载一个分类模型(如AlexNet)
步骤2
对模型进行微调
步骤3
特征提取:
步骤4
步骤5
使用回归器对候选方框的位置进行仔细校订。对于每个分类,都须要训练一个线性回归模型,用以判断这个方框是否足够匹配。
空间金字塔池化(SPP:Spatial Pyramid Pooling)概念的提出对R-CNN的发展有着非凡的意义。在此咱们会对SPP进行简明的介绍。
SPP有两个特征:
1. 结合空间金字塔法,实现CNN的多尺度输入
通常来讲,在CNN后面会接有一个全链接层或者一个分类器。它们都须要调整至合适大小方可做为输入,所以须要对输入数据进行分割和变形。然而,这些预处理可能会形成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想与CNN相结合,实现数据的多尺度输入。
以下图所示,在卷积层和全链接层之间加入一个SPP层。此时,网络的输入尺度能够是任意的,在SPP层中,池化所需的过滤器会根据输入自动调节大小,但SPP的输出尺度确实保持不变的。
2. 只对原始图像提取一次卷积特征
在R-CNN中,每一个候选框会将其尺寸调至统一,而后分别做为CNN的输入,但这样的作法下降了效率。SPP Net针对这个缺点作了相应的优化:只对原始图像进行一次卷积操做,获得特征图,而后找到每一个候选方框在特征图上的映射,而后将该映射做为卷积特征输入SPP层。这种优化方法节约了大量的计算时间,相比 R-CNN快上百倍。
SPP Net很是实用,有学者就在R-CNN的基础上结合SPP Net,提出Fast R-CNN,进一步提高了性能。
R-CNN与Fast R-CNN有什么区别呢?
首先,让咱们来看看R-CNN的不足之处。尽管它在提取潜在边框做为输入时,使用了选择性搜索以及其它处理方法,可是R-CNN在运算速度上仍然遇到了瓶颈。这是因为计算机在对全部区域进行特征提取时会进行大量的重复计算。
为了解决这个问题,研究学者提出了Fast R-CNN。
在Fast R-CNN中,有一个被称为ROI Pooling的单层SPP网络层。该网络层可以将不一样尺寸的输入映射为一系列固定尺度的特征向量,正如咱们所知,conv,pooling,relu以及一些其它操做并不须要固定尺度的输入。所以,当咱们在原始图片上执行这些操做后,因为输入图片的尺寸不一样,获得的特征图尺寸也不同,不能将它们直接链接到一个全链接层上进行分类,可是咱们能够在其中加入ROI Pooling层,以一个固定尺度的特征来表示每一个区域,再经过softmax进行分类。
此外,前面所讲的R-CNN须要先有一个proposal,再输入到CNN中进行特征提取,以后采用SVM进行分类,最后进行边框回归。可是在Fast R-CNN模型中,做者将边框回归引入神经网络,并将其与区域分类合并,造成一个多任务模型。
实验证实,这两个任务可以共享卷积特征。Fast R-CNN的一个额外贡献是使Region Proposal+CNN这一框架得以运用,同时让人们看到进行多类检测的同时仍保证精度是可以实现的。
R-CNN总结:
很明显,Fast R-CNN比R-CNN在速度上有了大幅提高;与R-CNN对每一个候选方框输入到CNN中提取特征不一样的是,Fast R-CNN只对输入的整张图片提取一次特征,而后在第五个卷积层上提取每一个候选方框的特征,此操做只须要计算一次特征,剩下的操做在第五个卷积层上完成便可。
性能的提高也十分明显:
毫无疑问,Fast R-CNN与传统的CNN相比,在性能上有了大幅提高。但Fast R-CNN的一个主要问题在于它使用选择性搜索去找全部的候选方框,这是很是耗时的。
是否有更加高效的方法去找出全部的候选方框呢?
解决办法:增长一个能够对边缘进行提取的神经网络。换句话说,利用神经网络去寻找全部的候选方框。可以实现这种操做的神经网络叫作区域生成网络(RPN:Region Proposal Network)。
让咱们看看RPN有哪些提高:
RPN总结:
四种损失函数:
速度比较
Faster R-CNN的贡献在于它设计了一个RPN网络对候选区域进行提取,此步骤代替了耗时过多的选择性搜索,使速度获得大幅提高。
总的来讲,从R-CNN,SPP-NET,Fast R-CNN到R-CNN,基于深度学习进行目标检测的步骤获得了简化,精度获得了提升,速度获得了提高。能够说,基于区域生成的系列R-CNN目标检测算法在目标检测领域已经成为最主要的分支。
本文做者:【方向】
本文为云栖社区原创内容,未经容许不得转载。