Object Detection目标检测

1. 滑动窗口目标检测算法

这里我们将会介绍如何使用卷积神经网络来进行对象检测,采用的是基于滑动窗口的目标检测算法

 

例如我们如果想构建一个汽车检测算法,首先是需要创建一个标签训练集,即X和Y表示适当剪切的汽车图片样本。X表示汽车样本图片以及无汽车样本图片,样本整张图片都几乎被汽车占据(需要对样本照片进行裁剪,除掉汽车以外的部分,使汽车居于中心位置,并基本占据整张照片),Y等于0/1,表示是否存在汽车。有了这个标签训练集,我们就可以训练卷积网络。输入这些适当剪切过的图片,卷积网络输出Y,0表示没有汽车,1表示有汽车。训练完这个卷积网络,我们就可以用它来实现滑动窗口目标检测。

选择一个特定大小的窗口,即上面的红色方框,这个方框的大小根据卷积网络对输入大小的要求调整,我们将红色方框所框出的图像输入到前面的检测汽车的卷积神经网络中进行处理输出0或1,再以某个固定步幅滑动窗口重复以上操作,遍历整个图像,输出结果;然后我们可以选择一个更大的窗口,重复前面的操作。这样操作不论汽车在图片的什么位置,总会有一个窗口可以检测到它。

这种算法叫做滑动窗口目标检测算法,因为我们以某个步幅滑动这些方框窗口,遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。该算法其实有一个很明显的缺点,就是计算成本非常高。因为你在图片中剪切出太多的小方块,每个小方块都需要输入到卷积网络进行处理,如果你选用的步幅很大,虽然会减少输入卷积网络的窗口个数,但是可能会存在漏掉的情况,如果使用小步幅,神经网络需要处理的小窗口图像会特别多,这意味着超高的计算成本。

所以在神经网络兴起之前,一般采用更简单的分类器进行对象检测,比如简单的线性分类器,至于误差,因为每个分类器的计算成本都很低,它只是一个线性函数,所以滑动窗口目标检测算法表现良好。然而卷积网络运行单个分类任务的成本却高得多,当采用超细粒度或极小步幅,否则无法准确定位图片中的对象。

不过,卷积网络的计算成本问题已经有很好的解决方案,大大提高了在卷积层上应用滑动窗口目标检测器的效率。具体如下分析

2.卷积网络的滑动窗口目标检测

前面我们学习了如何通过滑动窗口对象检测算法输入图像到卷积网络中运算得到图像检测结果,但是效率很低,这里我们介绍如何在卷积层上应用这个算法

为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化为卷积层

2.1神经网络全连接层转化为卷积层

上图中第一个神经网络最终通过softmax单元输出Y,用4个数字来表示Y,它们分别对应softmax单元所输出的4个分类出现的概率。这四个分类可以是行人、汽车、摩托和背景或其他目标对象。

第二个神经网络表示的是如何把第一个网络架构中的全连接层转化为卷积层。前面几层都是相同的,只是在FC1中我们使用了400个5*5*16的卷积核对输入进行卷积,输出维度为1*1*400。我们不再把它看做一个含有400个节点的集合,而是一个1*1*400的输出层。从数学角度来看,它和全连接层是一样的,因为这400个节点中每个节点都有一个5*5*16维度的卷积核,所以每个值都是上一层中这些5*5*16激活值经过某个任意线性函数的输出结果。 我们再添加另外一个卷积层,这里用的是400个1*1*400的卷积核,则输出的图像维度仍为1*1*400,它其实就是第一个神经网络中的FC2全连接层,最后经由4个1*1*400的卷积核处理,得到一个softmax激活值,通过这一整个卷积网络,我们最终得到这个1*1*4的输出层,而不是4个数字。

以上就是用卷积层代替全连接层的过程。将全连接层的单元集变成了1*1*400和1*1*4的维度。

2.2卷积层上实现滑动窗口目标检测算法

假设向滑动窗口卷积网络输入14*14*3的图片(为了简化演示和计算过程,假设输入维度如此),神经网络最后的输出层,即softmax单元的输出维度为1*1*4.

这里测试集的输入图像维度为16*16*3,在最初的滑动窗口算法中,我们会将蓝色区域(14*14*3)输入到卷积网络生成0或1的分类;接着滑动窗口,步幅为2个像素,将绿框区域图像输入到卷积网络,得到又一个结果;接着滑动窗口将橘色区域、紫色区域区域输入到卷积网络得到输出结果,对于该16*16*3的输入图像,卷积网络总共运行了4次,得到输出了4个标签结果。结果我们可以发现,这4次卷积操作中的很多计算都是重复的(因为这四块区域有重叠,那么经过相同的卷积核进行卷积时必定会存在重复计算的情况)。

如果我们将16*16*3的图像直接输入到滑动窗口卷积网络(不像前面那样分成4个区域分别输入到网络中),那么最终得到一个2*2*4的输出层,在输出层的4个子方块中,蓝色的是输入图像左上部分的14*14的输出,绿色方块是输入图像右上部分的14*14的输出,左下角橘色方块对应的是输入图像的坐下部分的14*14输出,紫色方块对应的是输入图像右下部分的14*14输出。所以该卷积操作的原理是:我们不需要把输入图片分割成四个子集,分别执行向前传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享很多计算,这其实是overfeat算法的思路。之所可以CNN可以实现这样的效果是因为卷积操作的特性,就是图片的空间位置信息的不变性,尽管卷积过程中图片大小减少,但是位置对应关系还是保存的。

总结一下滑动窗口算法在卷积网络上的实现过程:我们不用依靠连续的卷积操作来识别图片中的汽车,只需要将需要识别的图片整张中输入到卷积网络进行卷积操作,一次得到所有的预测值。但是这种算法会存在边界框的位置不够准确的缺点,下面一小节将会介绍如何解决此问题。

2.3 YOLO

在滑动窗口算法中,我们将窗口所框出的图像输入到分类器,在一些情况下,这些边界框没有一个能完美匹配汽车位置。但是使用yolo算法的话就能够较为精准的输出边界框了。

YOLO: you only look once

yolo算法具体实现是将输入图像划分为3*3的网格,实际上实现时会用更精细的grid网格,在论文中使用的是7*7的网格。基本思路是 使用图像定位算法,逐一应用在图像的9个格子上。我们需要这样定义训练标签,所以对于9个格子的每一个指定一个标签y,y是8维向量。如左上角的格子因无具体对象所以标签向量为0。对于包含目标对象的格子,yolo算法取两个对象的中点,然后将这个对象分配给包含对象中点的格子,即目标对象中点在哪个格子里就属于哪个格子。所以对于这里的9个格子中任何一个都会得到一个8维输出向量,目标输出大小为3*3*8。

所以现在你如果要训练一个输入为100*100*3的神经网络,需要将输入图像输入到一个卷积网络中,最后映射到一个3*3*8的输出尺寸。所以你要做的是 有一个输入图像X,然后你有这些3*3*8的目标标签y。当你用反向传播训练神经网络时,将任意输入x映射到这类输出向量y。所以这类算法的优点是神经网络可以输出精确的边界框,所以测试的时候你只需要输入图像x,然后跑正向传播,直到你得到这个输出y。然后对于这里3*3位置对应的9个输出,我们可以通过读取Pc判定当前是否存在对象,具体属于哪类对象,以及对象的边界框。当前所描述的仅适用于单个格子仅存在单个对象,当个格子多个对象时我们通过增加y向量数据来解决,具体后面再说明。

这里单独说明一下单个bbox,yolo算法约定bbox的左上角坐标为(0,0),右下角为(1,1),那么上面右边汽车标签y向量中的bounding box中心点坐标为(0.4,0.3),bounding box的宽高按照格子总体宽高比例表示,那么该格子y标签向量中的bh=0.5,bw=0.9,当格子中的对象超过该格子大小时那么 bh、bw都能够大于1,但是中心坐标都是0~1之间。

2.4 IOU交并比

IOU(Intersection over union)函数可以用于评估当前神经网络的定位效果。IOU是计算两个边界框(神经网络输出的边界框、实际对象的边界框)交集和并集之比,通过IOU数据我们可以很好的获得当前神经网络训练的效果,IOU值越大,说明训练的神经网络越精确,两个边界框的重合度越高,一般在计算机检测任务中我们至少要求IOU\geqslant 0.5

2.5 Non-max Suppression非最大值抑制

结合前面所描述的对象检测中有一个问题是:当前算法有可能对同一对象做出了多次检测,非最大值抑制可以确保你的算法对每个对象只输出一个最精确的结果。

假设我们需要在这张图里检测行人和汽车,我们将图片划分为19*19个格子,理论上车子只会有一个中心点,也就是说只有一个格子做出有车的预测,实践中当你跑对象分类和定位算法时,对于每个格子都跑一次,所以会出现多个格子都会检测到中心点在自己的格子内,那么每个格子都会有自己对应的bounding box,如上右图所示 。所以非最大值抑制做的就是清理这些检测结果,这样一个对象只会有一个bounding box。

我们首先用高亮标记对象最大概率的边界框,即Pc值最大的边界框,接下来非最大值抑制就会逐一处理剩下的边界框,所有和刚才最大概率的边界框有很高交并比,高度重叠的其他边界框输出就会被抑制,所以这两个矩形Pc分别是0.6、0.7,两个和高亮边界框有高度重合的bounding box就会被抑制变暗;接下来逐一审视剩下的矩形,找出概率最高Pc最高的一个,这里找到左侧对象0.8概率的边界框,然后非最大值抑制算法就会去掉和置暗其他与该边界框IOU值很高的矩形框。所以现在每个矩形框都会被高亮显示或者变暗,如果我们直接抛弃变暗的边框,那就剩下高亮显示的边界框,这就是最后得到的两个预测结果。这个就是非最大值抑制,非最大值意味着你只输出概率最大的分类结果,但抑制很接近该概率的其他结果,所以这方法叫做非最大值抑制。

如上图所示,我们输入如上的图片到yolo算法中最终得到了19*19*8维度的输出,这里我们简化一下只做汽车检测。那么对于19*19的每一个输出标签向量均只有5个数据.现在要实现非最大值抑制,首先需要去掉所有Pc概率低于某一阈值(一般是0.6)的边界框。接下来剩下的边界框中,我们选择概率Pc最高的边界框,然后把它输出成预测结果,接下来所有剩下的与前面输出边界框有很高IOU的边界框全部被抛弃,那么图像中某一个对象的边界框都被处理掉了;接下来为了图片中其他对象的边界框,我们继续重复执行前面一步,选择概率Pc最高的边界框,然后去掉与该边界框有很高重叠的其他边界框。。如此循环直至所有边界框都被处理了。。。。

在上面我们只介绍了算法检测单个对象的情况,如果尝试同时检测三个对象,比如说行人、汽车、摩托,那么输出标签向量y就会多出三个额外的分量,需要独立的进行三次非最大值抑制(因为在一次非最大值抑制时我们是不考虑分类的,直接对输出的所有边框进行处理,所以需要按每一类对象进行非最大值抑制操作),对每一个输出类都要做一次。

2.6 Anchor boxes

到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象, 如果我们想让一个格子检测出多个对象,我们可以使用anchor box。

上图中,汽车和行人的中点重合,两者落在同一个格子中,所以对于那个格子,前面的8个维度的向量输出y已经无法表明此种情况,那么我们需要增加输出标签y的维度。anchor box的思路:预先定义两个不同形状的anchor box,把预测结果与这两个anchor box相关联起来(一般来说,我们可以使用更多的anchor box,这里我们只是用两个演示),对于这两个anchor box,我们定义的类别标签已经变成了16维,前8维是anchor box1的数据,后8维是anchor box2的数据。

这里有这两种情况:在同一个格子中有三个对象 或者 在同一个格子中两个对象的形状一样,都是anchor box1类型, 这些特殊的场景算法并没有很好的处理办法,你需要引入一些打破僵局的默认手段专门处理这种情况。

anchor box的作用是为了处理多个对象处于同一个格子中的情况,实践中这种情况很少发生,特别是如果使用的是19*19网格而不是3*3的网格,两个对象的中点处于361个格子中同一个格子的概率很低。使用anchor box能够让你的学习算法更具有针对性,特别是如果你的数据集中有一些很高很瘦的对象,比如说行人,还有像汽车这样很宽的对象,这样你的算法就能更具有针对性的处理。这样有一些输出单元可以针对检测很宽很胖的对象,比如说车子,有一些输出单元可以针对检测很高很瘦的对象,例如行人。

如何选择anchor box?一般我们都是需手工指定anchor box形状,那你可以选择5到10个anchor box形状,覆盖到多种不同的形状,可以涵盖你想要检测的对象的各种形状。后期YOLO论文中对于这类场景有了更好的做法,就是所谓的k-平均算法,可以将两类对象形状聚类,这其实是自动选择anchor box的高级方法。如果我们手动指定anchor box,就需要考虑到所有对象的形状。

2.7 YOLO算法总结

  

我们将输入图像分为了3*3个grid网格,因为使用了两个anchor box,那么对于9个格子中的每一个格子都有两个预测的边界框

然后我们去掉那些Pc概率较低的边界框

最后,如果你有三个对象检测类别,那么就需要针对每一个类别执行非最大值抑制,运行三次得到了最终的预测结果。

2.8 region proposals候选区域

在阅读对象检测的文献时,我们经常会碰到所谓的 候选区域 region proposals的概念。这个概念在计算机视觉领域是非常有影响力的概念。

对于滑动窗口目标检测算法,我们使用训练过的分类器在输入图片的每一个窗口上都执行一遍,看看里面是否有车辆、行人、摩托。现在我们可以运行卷积算法,这个算法的其中一个缺点是:它在没有对象的区域也需要运行,这样会导致浪费计算时间,例如左下角的区域就是没有任何对象的,它在卷积运算中也会被计算。

所以R-CNN(Region CNN)被提出来,意思是 带区域的卷积网络。这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器。所以这里不再针对每个滑动窗跑检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。选出候选区域的方法是运行图像分割算法,分割的结果如右图所示。运行图像分割算法,分割的结果是右边的图像, 为了找出可能存在对象的区域,我们找出分割算法所得到的一些色块,然后在这个色块上跑分类器,得到最终的目标检测结果。所以我们使用所谓的分割算法在输入图像上可能先找到了2000多个色块,然后在这个2000多个色块上放置边界框,然后在这2000多个色块上跑一下分类器,这样需要处理的位置可能要少得多,可以有效减少卷积网络分类器运行时间比在图像所有位置跑一遍分类器要快。特别是这种情况,现在不仅是在方形区域中运行卷积网络,还要在高高瘦瘦的区域运行,尝试检测出行人,然后在很宽很胖的区域运行,尝试检测出车辆,同时在各种尺度运行分类器。

从目前来看 R-CNN还是很慢的,基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区域跑一下分类器,每个区域会输出一个标签并输出一个边界框,这样就能在确实存在对象的区域得到一个精确的边界框。这里说明一下,R-CNN算法不会直接信任输入的边界框,它也会输出一个边界框,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好,所以它可以得到相当精确的边界框。但是它虽然输出的边界框精准,但是运行速度太慢。

所以出现了改进的 Fast R-CNN,它基本是R-CNN,但是用卷积实现了滑动窗口目标检测算法。前面的算法是逐一对区域跑分类器的,所以Fast R-CNN用的是滑动窗口对象检测算法的一个卷积实现。这显著提升了R-CNN的运行速度。 事实证明,Fast R-CNN算法的其中一个问题是 得到候选区域的聚类步骤仍然非常缓慢。

所以再次出现了改进的 Faster R-CNN,使用的是卷积神经网络,而不是更传统的分割算法来获得候选区域色块,结果比Fast R-CNN算法快得多,但是大多数Faster R-CNN的算法实现还是比YOLO算法慢得多。

R-CNN首先需要得到候选区域然后再分类,这总共需要两步完成,它们是two-stage算法的,相比之下,Yolo,SSD这类one-stage算法只需要一步即可,虽然可能准确度会稍微差些,但是这个以后还是以这种one-stage算法更有优势和前景。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值