目标检测

卷积神经网络-目标检测

2018-02-13  本文已影响0人  徐凯_xp

1. 目标定位和特征点检测

图片检测问题:

目标分类和定位:
对于目标定位问题,我们卷积神经网络模型结构可能如下:


输出:包含图片中存在的对象及定位框

其中,bx、by表示汽车中点,bh、bw分别表示定位框的高和宽。以图片左上角为(0,0),以右下角为(1,1),这些数字均为位置或长度所在图片的比例大小。


如何定义目标标签:

损失函数:
如果采用平方误差形式的损失函数:
当Pc=1时:
L(y^,y)=(y^1−y1)2+(y^2−y2)2+⋯+(y^8−y8)^2 ^
此时,我们需要关注神经网络对所有输出值的准确度;
当Pc=0时:
L(y^,y)=(y^1−y1)2
此时,我们只关注神经网络对背景值的准确度。

特征点检测:
由前面的目标定位问题,我们可以知道,神经网络可以通过输出图片上特征点的坐标(x,y),来实现对目标特征的识别和定位标记。


假设正在构建一个人脸识别应用,给出眼角的具体位置,眼角坐标(x,y),让神经网络最后一层多输出两个数字lx,ly

如对于人脸表情识别的问题中,我们通过标定训练数据集中特征点的位置信息,来对人脸进行不同位置不同特征的定位和标记。具体做法是准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1或0表示有无人脸,(lx1,ly1)~直到(lx64,ly64),最终输出129个单元。
AR的应用就是基于人脸表情识别来设计的,如脸部扭曲、增加头部配饰等。为了构建这样的网络,你需要一个标签训练集,这些特征点都是人为辛苦标注的。还有任务姿态的关键特征点等应用。要明确一点,特征点1的特性在所有图片中必须保持一致。

2.目标检测

目标检测采用的是基于滑动窗口的检测算法。


假如你想构建一个汽车检测算法,步骤是:
训练模型:

首先创建一个标签训练集:
训练集X:将有汽车的图片进行适当的剪切,剪切成整张几乎都被汽车占据的小图(正样本)或者没有汽车的小图;
训练集Y:对X中的图片进行标注,有汽车的标注1,没有汽车的标注0。
训练完这个卷积网络,就可以用它来实现滑动窗口目标检测。

滑动窗口目标检测:
利用滑动窗口在实际图片中实现目标检测。

缺点:计算成本巨大,每个窗口的小图都要进行卷积运算,(但在神经网络兴起之前,使用的是线性分类器,所以滑动窗口算法的计算成本较低)。

卷积的滑动窗口实现

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

假设对象检测算法输入一个14×14×3的图像,过滤器大小5×5,数量16,然后通过2×2的最大池化操作,接着再添加一个全连接层,最终softmax输出


对于卷积网络中全连接层,我们可以利用1×1大小卷积核的卷积层来替代。1×1的卷积核相当于在一个三维图像的切片上应用了一个全连接的神经网络。同样,全连接层也可以由1×1大小卷积核的卷积层来替代。需注意卷积核的个数与隐层神经元个数相同。


滑动窗口的卷积实现:

在我们实现了以卷积层替代全部的全连接层以后,在该基础上进行滑动窗口在卷积层上的操作。下面以一个小的图片为例:



我们以上面训练好的模型,输入一个16×16×3大小的整幅图片,图中蓝色部分代表滑动窗口的大小。我们以2为大小的步幅滑动窗口,分别与卷积核进行卷积运算,最后得到4幅10×10×16大小的特征图,然而因为在滑动窗口的操作时,输入部分有大量的重叠,也就是有很多重复的运算,导致在下一层中的特征图值也存在大量的重叠,所以最后得到的第二层激活值(特征图)构成一副12×12×16大小的特征图。对于后面的池化层和全连接层也是同样的过程。

那么由此可知,滑动窗口在整幅图片上进行滑动卷积的操作过程,就等同于在该图片上直接进行卷积运算的过程。所以卷积层实现滑动窗口的这个过程,我们不需要把输入图片分割成四个子集分别执行前向传播,而是把他们作为一张图片输入到卷积神经网络中进行计算,其中的重叠部分(公共区域)可以共享大量的计算。

汽车目标检测:
依据上面的方法,我们将整张图片输入到训练好的卷积神经网络中。无需再利用滑动窗口分割图片,只需一次前向传播,我们就可以同时得到所有图片子集的预测值。

利用卷积的方式实现滑动窗口算法的方法,提高了整体的计算效率。

3. Bounding Box 预测

前面一节的卷积方式实现的滑动窗口算法,使得在预测时计算的效率大大提高。但是其存在的问题是:不能输出最精准的边界框(Bounding Box)。


在滑动窗口算法中,我们取的一些离散的图片子集的位置,在这种情况下,有可能我们没有得到一个能够完美匹配汽车位置的窗口,也有可能真实汽车的边界框为一个长方形。所以我们需要寻找更加精确的边界框。

YOLO(you only look once):
YOLO算法可以使得滑动窗口算法寻找到更加精准的边界框。

通过这样的训练集训练得到目标探测的卷积网络模型。我们利用训练好的模型,将与模型输入相同大小的图片输入到训练好的网络中,得到大小为n×n×8的预测输出。通过观察n×n不同位置的输出值,我们就能知道这些位置中是否存在目标物体,然后也能由存在物体的输出向量得到目标物体的更加精准的边界框。

YOLO notation:

bounding boxes 细节:
如何编码bx,by,bh,bw

利用YOLO算法实现目标探测的时候,对于存在目标对象的网格中,定义训练标签Y的时候,边界框的指定参数的不同对其预测精度有很大的影响。这里给出一个较为合理的约定:(其他定值方式可阅读论文)

4. 交并比(Intersection-over-Union)

交并比函数用来评价目标检测算法是否运作良好。



对于理想的边界框和目标探测算法预测得到的边界框,交并比函数计算两个边界框交集和并集之比。
IoU = 交集面积 / 并集面积
一般在目标检测任务中,约定如果 IoU⩾0.5 ,那么就说明检测正确。当然标准越大,则对目标检测算法越严格。得到的IoU值越大越好。

5. 非最大值抑制(non-max suppression,NMS)

对于我们前面提到的目标检测算法,可能会对同一个对象做出多次的检测,非最大值抑制可以确保我们的算法对每个对象只检测一次。

多网格检测同一物体:
对于汽车目标检测的例子中,我们将图片分成很多精细的格子。最终预测输出的结果中,可能会有相邻的多个格子里均检测出都具有同一个对象。

NMS算法思想:

NMS算法:

以单个对象检测为例:

对于多对象检测,输出标签中就会有多个分量。正确的做法是:对每个输出类别分别独立进行一次非最大值抑制。

6. Anchor box

通过上面的各种方法,目前我们的目标检测算法在每个格子上只能检测出一个对象。使用Anchor box 可以同时检测出多个对象。

重叠目标:

对于重叠的目标,这些目标的中点有可能会落在同一个网格中,对于我们之前定义的输出:yi=[Pc bx by bh bw c1 c2 c3],只能得到一个目标的输出。

而Anchor box 则是预先定义多个不同形状的Anchor box,我们需要把预测目标对应地和各个Anchor box 关联起来,所以我们重新定义目标向量:

yi=[Pc bx by bh bw c1 c2 c3 Pc bx by bh bw c1 c2 c3⋯]

用这样的多目标向量分别对应不同的Anchor box,从而检测出多个重叠的目标。


例子:
如下面的图片,里面有行人和汽车,我们为其分配两个Anchor box。对于行人形状更像Anchor box 1,汽车形状更像Anchor box 2,所以我们将人和汽车分配到不同的输出位置。

如果格子中只有汽车的时候,我们使用了两个Anchor box,那么此时我们的目标向量就成为:
yi=[0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0]
其中,“?”代表的是该位置是什么样的参数我们都不关系。

难点问题:

但是以上的两种问题出现的可能性不会很大,对目标检测算法不会带来很大的影响。

Anchor box 的选择:

7. YOLO算法目标检测

在这里我们把上述方法组合组装在一起,构成YOLO对象检测算法。

假设我们要在图片中检测三种目标:行人、汽车和摩托车,同时使用两种不同的Anchor box。
训练集:

模型预测:


输入与训练集中相同大小的图片,同时得到每个格子中不同的输出结果:3×3×2×8。

运行非最大值抑制(NMS):

8. 候选区域(region proposals)

R-CNN:
R-CNN(Regions with convolutional networks),会在我们的图片中选出一些目标的候选区域,从而避免了传统滑动窗口在大量无对象区域的无用运算。

所以在使用了R-CNN后,我们不会再针对每个滑动窗口运算检测算法,而是只选择一些候选区域的窗口,在少数的窗口上运行卷积网络。

具体实现:运用图像分割算法,将图片分割成许多不同颜色的色块,然后在这些色块上放置窗口,将窗口中的内容输入网络,从而减小需要处理的窗口数量。

更快的算法:

上一篇下一篇

猜你喜欢

热点阅读