【深度学习】4.3目标检测

目标定位

定位分类问题:不仅要用算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置,用边框或红色方框把汽车圈起来。
在这里插入图片描述
约定图片的左上角坐标为(0, 0),右下角坐标为(1, 1),红色方框的中心点(bx, by),边界框的高度为bh,宽度为bw
在这里插入图片描述
训练集不仅包含神经网络要预测的对象分类标签(本例中为1行人,2汽车,3摩托车,4背景),还包含表示边界框的这四个数字。接着采用监督学习算法,输出一个分类标签,还有这四个参数值,从而给出被检测对象的边界框位置。
此例中,bx的理想值是0.5,因为它表示汽车位于图片水平方向的中间位置;by的理想值是0.7,表示汽车位于距离图片底部3/10的位置;bh的理想值是0.3,表示红色方框的高度是图片高度的0.3倍;bw的理想值是0.4,表示红色方框的宽度是图片宽度的0.4倍。

目标标签y的定义为:
在这里插入图片描述
第一个组件Pc表示是否含有对象,如果对象属于前三类,则Pc=1;如果是背景,则图片中没有要检测的对象,Pc=0;Pc可以被理解为被检测对象属于除了背景分类外的某一分类的概率。
如果检测到对象,就输出被检测对象的边界框参数bx、by、bh和bw
如果存在某个对象,那么Pc=1,同时输出c1、c2、c3,表示该对象属于1-3中的哪一类。

因为目标标签y含有8个值,所以训练神经网络的损失函数其参数为类别y和网络输出y hat,可以表示为L(y hat, y)。若采用平方差策略,其等于[(y1 hat- y1)2 + (y2 hat- y2)2 + … + (y8 hat- y8)2]。如果图片中存在定位对象,y1=Pc=1,那么损失值就等于不同元素的平方和;如果y1=Pc=0,那么损失值就等于(y1 hat- y1)2,因为这种情况下只需要关注神经网络输出Pc的准确度,不用再考虑其他元素了。

特征点检测

如果想对某一特征点进行检测,可以让神经网络的最后一层多输出两个数字lx和ly,去描述特征点的坐标。如果想多检测几个特征点,可以输出lx1、ly1、lx2、ly2、lx3、ly3…
为了构建这样的网络,需要准备一个标签训练集,也就是图片X和标签Y的集合,这些特征点都是人为辛苦标注的。

批量添加输出单元,用以输出要识别的各个特征点的(X, Y)坐标值。但是,特征点的特性在所有图片中必须保持一致,所用标签在所有图片中必须保持一致,比如特征点1是左眼的内眼角,特征点2是右眼的内眼角…

目标检测

采用基于滑动窗口的目标检测算法,通过卷积网络进行对象检测。

构建一个汽车检测算法的步骤:
首先创建一个标签训练集,也就是X和Y,也可以使用适当剪切的汽车图片样本(整张图片X几乎都被汽车占据,可以剪掉汽车以外的部分,使汽车居于中心位置,并基本占据整张图片):
在这里插入图片描述
有了这个标签训练集,就可以开始训练卷积网络了。输入这些适当剪切过的图像,卷积网络输出y(0或1表示图片中有汽车或没有汽车)。
训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,即:
假设这是一张测试图片,
在这里插入图片描述
首先选定一个特定大小的窗口,比如图片下方的窗口,将这个红色小方块输入卷积网络,卷积网络开始进行预测,即判断红色方框内有没有汽车,滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只是红色方框内的区域。再次运行卷积网络,然后处理第三个图像,依次重复操作。
在这里插入图片描述
在这里插入图片描述
直到这个窗口滑过图像的每一个角落。
为了滑动得更快,可以选用更大的步幅,但思路是:以固定步幅滑动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类。

滑动窗口目标检测的方法缺点在于计算成本过高。

卷积的滑动窗口实现

为了构建滑动窗口的卷积应用,首先要把神经网络的全连接层转化为卷积层
在这里插入图片描述
假设对象检测算法输入一个14×14×3的图像,过滤器大小为5×5,数量是16,处理之后映射为10×10×16;然后通过参数为2×2的最大池化操作,图像减小到5×5×16;然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最终通过softmax单元输出Y。

下面做一点改动,用4个数字来表示Y,它们分别对应softmax单元所输出的4个分类出现的概率,然后需要将这些全连接层转化为卷积层:
在这里插入图片描述
在之前全连接层的那个位置用5×5的400个过滤器来实现,那么卷积之后输出结果为1×1×400,不再将它看作一个含有400个节点的集合,而是一个1×1×400的输出层。再添加另外一个1×1的卷积层,假设有400个1×1的过滤器,那么下一层的维度为1×1×400。最后经由1×1过滤器的处理,得到一个softmax激活值,通过卷积网络,最终得到了1×1×4的输出层,而不是4个数字。

接下来,通过卷积实现滑动窗口对象检测算法
在这里插入图片描述
假设向滑动窗口卷积网络输入14×14×3的图片,和前面一样,神经网络最后的输出层,即softmax单元的输出是1×1×4。
在这里插入图片描述
假设输入给卷积网络的图片大小是14×14×3,测试集图片是16×16×3,现在给这个输入图片加上黄色条块,在最初的滑动窗口算法中,会把这片蓝色区域输入卷积网络,生成0或1分类。接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1。继续将橘色区域输入给卷积网络,卷积后得到另一个标签。最后对右下方的紫色区域进行最后一次卷积操作。
卷积网络运行了4次,于是输出了4个标签。结果发现,这4次卷积操作中的很多计算都是重复的。
在这里插入图片描述
最终在输出层的这4个子方块中,蓝色的是图像左上部分14×14的输出,右上角方块是图像右上部分的对应输出,左下角方块是输入层左下角14×14区域经过卷积网络处理后的结果,右下角是卷积网络处理输入层右下角14×14区域的结果。

该卷积操作的原理是:无需把输入图片分割成四个子集分别执行向前传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享很多计算。
PS:若最大池化参数为2,相当于以大小为2的步幅在原始图片上应用神经网络。

总结一下滑动窗口的实现过程:
在这里插入图片描述
在图片上剪切出一块区域,假设它的大小是14×14,将它输入到卷积网络,继续下一块区域,大小同样是14×14,重复操作,直到某个区域识别到汽车。
在这里插入图片描述
但是,不用依靠连续的卷积操作来识别图片中的汽车,比如:可以对大小为28×28的整张图片进行卷积操作,一次得到所有预测值,神经网络便可以识别出汽车的位置。

Bounding Box预测

以上算法虽然效率高,但不能输出最精准的边界框。
使用YOLO算法可以解决此问题。
使用图像分类和定位算法,在图像上放一个网格,将算法应用到划分的这几个格子上。对于这9个格子中的每一个,指定一个标签y,y是8维向量。第一个输出pc是0还是1,取决于这个格子里是否有图像,bx、by、bh、bw的作用就是当那个格子里有对象时,给出边界框坐标,c1、c2、c3就是要识别的三个类别,背景类别不算在里面。所以对这个图像里面划分的每个格子都有这么一个y向量。
在这里插入图片描述
在这里插入图片描述
对于最左上方的那个格子,里面什么都没有,所以左上格子的标签向量是0,其它分量不用去关心。
对于第二行的格子,里面有两个对象,YOLO的做法就是取两个对象的中点,然后将这个对象分配给包含对象中点的格子,所以左边那辆车分配给了第二行第一个格子,右边那辆车分配给了第二行最后一个格子。所以即使中心格子同时有两辆车的一部分,仍然认为中心格子没有我们感兴趣的对象。
这种划分总的输出尺寸为3×3×8,所以目标输出是3×3×8,因为这里有3×3个格子,对于每个格子都有一个8维向量y。

如果要训练一个输入为100×100×3的神经网络,上面的图是输入图像,然后我们有一个普通的卷积网络,卷积层、最大池化层等等。最后会选择卷积层和最大池化层,映射到一个3×3×8的输出尺寸。

YOLO算法的优点是:神经网络可以输出精确的边界框,所以测试的时候,喂入输入图像x,然后正向传播,直到得到输出y。只要每个格子中对象数目没有超过一个,此算法就没有问题。并且YOLO算法是一个卷积实现,它的运行速度非常快,可以达到实时识别。

YOLO对于边界框的约定:
左上角的点是(0,0),右下角的点是(1,1)。边界框的高度用格子总体宽度的比例表示,如下图,红框的宽度大概是蓝线的90%,因此bh=0.9。在这里,bx=0.4、by=0.3、bw=0.5。其实,bx、by、bh、bw是相对格子尺度的比例,因此bx、by必须在0和1之间;bh、bw是非负数,有可能大于1,比如下下图:
在这里插入图片描述
在这里插入图片描述
如果它的边界框是这样的,那么边界框的高度和宽度就会大于1。

交并比

交并比(loU)函数可以用来评价对象检测算法,它是用来计算两个边界框交集和并集之比
在这里插入图片描述
实际边界框为红框,算法给出的是紫色的边界框。两个边界框的并集是属于两个边界框之一的区域,交集是同时属于两个边界框的区域,交并比就是计算交集的大小除以并集的大小。一般约定,在计算机检测任务中,如果loU≥0.5,就认为检测正确;0.5是阈值,用来判断预测的边界框是否正确。如果预测器和实际边界框完美重叠,loU就是1。如果希望更准确一点,可以将loU定得高一些,loU越高,边界框就越精确。

这是衡量定位精确度的一种方式,我们只需要统计算法正确检测和定位对象的次数,就可以用这样的定义来判断对象定位是否准确。

loU也可以判断两个边界框是否相似。

非极大值抑制

之前介绍的对象检测中的一个问题就是算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次,非极大值抑制的方法可以确保算法对每个对象只检测一次
在这里插入图片描述
假设需要在这张图里检测行人和汽车,可能会在上面放个19×19网络。理论上每辆车都只有一个中点,所以它应该只分配到一个格子里。实际上,当跑对象分类和定位算法时,对于每个格子都要跑一次,那么其它格子可能也会认为它们包含车的中点。

因为需要在361个格子上都跑一次图像检测和定位算法,算法首先看看每次报告,每个检测结果相关的概率pc,实际上pc=c1×c2×c3,首先看概率最大的那个,如下图:
在这里插入图片描述
会先看pc=0.9的那个,认为这是最可靠的检测,将其高亮,然后非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边界框有很高交并比,高度重叠的其它边界框的输出就会被抑制,矩形会变暗,在这里是pc为0.6和0.7的两个矩形。
接下来,逐一审视剩下的矩形,找出概率pc最高的一个,在本图中是0.8的那个矩形,这样就认为这里检测出了一辆车,然后非极大值抑制算法就会去掉其它loU值很高的矩形。这样,所有的矩形都会被高亮显示或者变暗。
非极大值抑制意味着只输出概率最大的分类结果,抑制与其很接近但不是最大的其他预测结果。

算法的细节为:

首先这个19×19网格上跑一下算法,会得到19×19×8的输出尺寸。对于本例,简化一下,只做汽车检测,所以去掉c1、c2、c3,然后假设这条线对于19×19的每一个输出就是格子中有对象的概率,然后是边界框参数,如果只检测一个对象,就没有c1、c2、c3这些预测分量。
现在要实现非极大值抑制的第一件事就是去掉所有概率比较低的输出边界框,即把pc≤某个阈值的边界框去掉。接下来剩下没有被抛弃处理过的边界框,就一直把概率pc最高的边界框输出成预测结果。然后,去掉所有剩下的没有达到输出标准的边界框,把这些和输出边界框有很高重叠面积的边界框全部抛弃。一直这么操作,直到每个边界框都判断过了。

如果同时检测三个对象,那么输出向量就会有三个额外的分量,正确的做法就是独立对每个输出类别都进行非极大值抑制,做三次。

Anchor Boxes

到目前为止,对象检测中存在的问题是每个格子只能检测出一个对象,如果想让一个格子检测出多个对象,可以使用anchor boxes这个概念。
在这里插入图片描述
假设有这样一张图,为了简化,继续使用3×3网络。行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中。
对于那个格子,如果y输出向量,可以检测这三个类别,行人、汽车和摩托,它就无法输出检测结果。所以必须从两个检测结果中选一个。
而Anchor Boxes的思路为:
在这里插入图片描述
预先定义两个不同形状的anchor boxes,把预测结果和这两个anchor boxes关联起来。实际中可能会用更多的anchor boxes,5个或者更多个。我们所要做的就是定义类别标签。用的向量不再是之前那个,而是重复两次,前8个输出参数和anchor box1关联,后8个是和anchor box2关联的8个输出参数。
因为行人的形状更类似于anchor box1的形状,而不是anchor box2的形状,所以可以用前8个数值编码来包住行人的边界框;车的形状比起anchor box1更像anchor box2的形状,就可以用后8个数值进行编码。

总结
用anchor boxes之前,对于训练集图像中的每个对象都要根据那个对象中点的位置分配到对应的格子中,所以对于3×3网格来说,输出y就是3×3×8。
使用anchor boxes之后,现在每个对象都和之前一样分配到同一个格子中,也就是对象中点所在的格子中,但是它还分配到一个和对象形状交并比最高的anchor box,现在的输出y为3×3×16(16是因为使用了2个anchor boxes,而y是8维的),这就是对象在目标标签中的编码方式。

一般人工指定anchor boxes的形状,可以选择5-10个anchor box的形状覆盖到想要检测的对象的各种形状。k-mean其实是自动选择anchor boxes的高级方法。

YOLO算法

假设需要训练一个算法去检测三种对象:行人、汽车和摩托。在这里插入图片描述
如果要用两个anchor boxes,那么输出y就是3×3×16(8是5+三个类别)。要构造训练集,就需要遍历这9个格子,然后构成对应的目标向量y。
首先看一下第一个格子,里面没有什么有价值的东西,行人、汽车和摩托这三个类别都没有出现在左上格子中。所以对应这个格子的目标y为:
在这里插入图片描述
现在网格中大多数格子都是空的,但有车的那个格子会有这个目标向量y:
在这里插入图片描述
总的来说,输入图像,神经网络输出尺寸是3×3×2×8,对于9个格子,每个都有对应的向量。最后需要跑一下非极大值抑制。
在这里插入图片描述

YOLO对象检测算法实际上是最有效的对象检测算法之一。

RPN网络

R-CNN算法,意思是带区域的卷积网络。这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器,不再针对每个滑动窗跑检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。
选出候选区域的方法是为了找出可能存在对象的区域,运行图像分割算法,分割的结果是右边的图像。
在这里插入图片描述
比如说,分割算法得到一个色块,然后可能会选择包住这个色块的边界框,然后在这个色块上跑分类器。也就是说,先找出可能2000多个色块,然后在这个2000多个色块上放置边界框,再在这2000个色块上跑一下分类器。这样需要处理的位置可能就要少得多了,可能减少卷积网络分类器的运行时间。

基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区域跑一下分类器,每个区域会输出一个标签,并输出一个边界框。R-CNN算法不会直接信任输入的边界框。

==快速的R-CNN算法(Fast R-CNN)==基本上是R-CNN算法,不过用卷积实现了滑动窗法,最初的算法是逐一对区域分类的,快速的R-CNN用的是滑动窗法的一个卷积实现。它虽然提高了R-CNN的速度,但得到候选区域的聚类步骤仍然非常缓慢。

==更快的R-CNN算法(Faster R-CNN)==解决了这个问题。它使用卷积神经网络,而不是更传统的分割算法来获得候选区域色块。但它仍然比YOLO算法慢很多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值