目标定位

符号表示:
图片左上角的坐标为(0,0)(0,0)(0,0),右下角标记为(1,1)(1,1)(1,1)。
红色方框的中心点(bxb_{x}bx​,byb_{y}by​),边界框的高度为bhb_{h}bh​,宽度为bwb_{w}bw​。

因此训练集不仅包含神经网络要预测的对象分类标签,还要包含表示边界框的这四个数字,接着采用监督学习算法,输出一个分类标签,还有四个参数值,从而给出检测对象的边框位置。

如何为监督学习任务定义目标标签 yyy:

这有四个分类,神经网络输出的是这四个数字和一个分类标签,或分类标签出现的概率。目标标签yyy的定义如下:y=[pcbxbybhbwc1c2c3]y= \ \begin{bmatrix} p_{c} \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ c_{1} \\ c_{2}\\ c_{3} \end{bmatrix}y= ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​pc​bx​by​bh​bw​c1​c2​c3​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​
第一个组件pcp_{c}pc​表示是否含有对象,如果对象属于前三类(行人、汽车、摩托车),则pc=1p_{c}= 1pc​=1,如果是背景,则图片中没有要检测的对象,pc=0p_{c} =0pc​=0。我们可以这样理解pcp_{c}pc​,它表示被检测对象属于某一分类的概率,背景分类除外。

如果检测到对象,就输出被检测对象的边界框参数bxb_{x}bx​、byb_{y}by​、bhb_{h}bh​和bwb_{w}bw​。

我们假设图片中只含有一个对象。

神经网络的损失函数:
参数为类别yyy和网络输出y^\hat{y}y^​,如果采用平方误差策略,则L(y^,y)=(y1^−y1)2+(y2^−y2)2+…(y8^−y8)2L\left(\hat{y},y \right) = \left( \hat{y_1} - y_{1} \right)^{2} + \left(\hat{y_2} - y_{2}\right)^{2} + \ldots\left( \hat{y_8} - y_{8}\right)^{2}L(y^​,y)=(y1​^​−y1​)2+(y2​^​−y2​)2+…(y8​^​−y8​)2,损失值等于每个元素相应差值的平方和。

如果图片中存在定位对象,那么y1=1y_{1} = 1y1​=1,所以y1=pcy_{1} =p_{c}y1​=pc​;另一种情况是,y1=0y_{1} = 0y1​=0,也就是pc=0p_{c} = 0pc​=0,损失值是(y1^−y1)2\left(\hat{y_1} - y_{1}\right)^{2}(y1​^​−y1​)2,因为对于这种情况,我们不用考虑其它元素,只需要关注神经网络输出pcp_{c}pc​的准确度。

回顾一下,当y1=1y_{1} =1y1​=1时,也就是编号1,平方误差策略可以减少这8个元素预测值和实际输出结果之间差值的平方。如果y1=0y_{1}=0y1​=0,yyy 矩阵中的后7个元素都不用考虑(编号2),只需要考虑神经网络评估y1y_{1}y1​(即pcp_{c}pc​)的准确度。

为了让大家了解对象定位的细节,这里我用平方误差简化了描述过程。实际应用中,你可以不对c1c_{1}c1​、c2c_{2}c2​、c3c_{3}c3​和softmax激活函数应用对数损失函数,并输出其中一个元素值,通常做法是对边界框坐标应用平方差或类似方法,对pcp_{c}pc​应用逻辑回归函数,甚至采用平方预测误差也是可以的。

特征点检测(Landmark detection)

神经网络可以通过输出图片上特征点的(x,y)(x,y)(x,y)坐标来实现对目标特征的识别,我们看几个例子。

假设你正在构建一个人脸识别应用,算法可以给出眼角的具体位置。如果你想知道两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来表示这四个眼角。对神经网络稍做些修改,输出第一个特征点(l1xl_{1x}l1x​,l1yl_{1y}l1y​),第二个特征点(l2xl_{2x}l2x​,l2yl_{2y}l2y​),依此类推,这四个脸部特征点的位置就可以通过神经网络输出了。

也许除了这四个特征点,你还想得到更多的特征点输出值,假设脸部有64个特征点,选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。

具体做法是,准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1或0,1表示有人脸,0表示没有人脸,然后输出(l1xl_{1x}l1x​,l1yl_{1y}l1y​)……直到(l64xl_{64x}l64x​,l64yl_{64y}l64y​)。这里用lll代表一个特征,这里有129个输出单元,其中1表示图片中有人脸,因为有64个特征,64×2=128,所以最终输出128+1=129个单元,由此实现对图片的人脸检测和定位。

如果你对人体姿态检测感兴趣,你还可以定义一些关键特征点,如胸部的中点,左肩,左肘,腰等等。然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。当然,要实现这个功能,你需要设定这些关键特征点,从胸部中心点(l1xl_{1x}l1x​,l1yl_{1y}l1y​)一直往下,直到(l32xl_{32x}l32x​,l32yl_{32y}l32y​)。

一旦了解如何用二维坐标系定义人物姿态,操作起来就相当简单了,批量添加输出单元,用以输出要识别的各个特征点的(x,y)(x,y)(x,y)坐标值。要明确一点,特征点1的特性在所有图片中必须保持一致。

目标检测(Object detection)

构建一个对象检测算法。这节课,我们将学习如何通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。

假如你想构建一个汽车检测算法。

首先创建一个标签训练集,xxx和yyy表示适当剪切的汽车图片样本,这张图片(编号1)xxx是一个正样本,因为它是一辆汽车图片,这几张图片(编号2、3)也有汽车,但这两张(编号4、5)没有汽车。出于我们对这个训练集的期望,你一开始可以使用适当剪切的图片,剪掉汽车以外的部分,使汽车居于中间位置,并基本占据整张图片。有了这个标签训练集,你就可以开始训练卷积网络了,输入这些适当剪切过的图片(编号6),卷积网络输出yyy,0或1表示图片中有汽车或没有汽车。

训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,具体步骤如下。

假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片下方这个窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。

滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。

为了滑动得更快,我这里选用的步幅比较大,思路是以固定步幅移动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。

重复上述操作,不过这次我们选择一个更大的窗口,截取更大的区域,并输入给卷积神经网络处理,你可以根据卷积网络对输入大小调整这个区域,然后输入给卷积网络,输出0或1。

再以某个固定步幅滑动窗口,重复以上操作,遍历整个图像,输出结果。

然后第三次重复操作,这次选用更大的窗口。不论汽车在图片的什么位置,总有一个窗口可以检测到它。

这种算法叫作滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。

缺点:计算成本。因为图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。

滑动窗口的卷积实现(Convolutional implementation of sliding windows)

这节课我们讲讲如何在卷积层上应用这个算法。

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

假设对象检测算法输入一个14×14×3的图像。在这里过滤器大小为5×5,数量是16,图像处理之后映射为10×10×16。

然后通过参数为2×2的最大池化操作,图像减小到5×5×16。

然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最后通过softmax单元输出yyy。为了跟下图区分开,我先做一点改动,用4个数字来表示yyy,它们分别对应softmax单元所输出的4个分类出现的概率。这4个分类可以是行人、汽车、摩托车和背景或其它对象。

如何把这些全连接层转化为卷积层:

画一个这样的卷积网络,它的前几层和之前的一样,而对于全连接层,我们可以用5×5的过滤器来实现,数量是400个(编号1所示),输入图像大小为5×5×16,用5×5的过滤器对它进行卷积操作,过滤器实际上是5×5×16,因为在卷积过程中,过滤器会遍历这16个通道,所以这两处的通道数量必须保持一致,输出结果为1×1。应用400个这样的5×5×16过滤器,输出维度就是1×1×400,我们不再把它看作一个含有400个节点的集合,而是一个1×1×400的输出层。

从数学角度看,它和全连接层是一样的,因为这400个节点中每个节点都有一个5×5×16维度的过滤器,所以每个值都是上一层这些5×5×16激活值经过某个任意线性函数的输出结果。

我们再添加另外一个卷积层(编号2所示),这里用的是1×1卷积,假设有400个1×1的过滤器,在这400个过滤器的作用下,下一层的维度是1×1×400,它其实就是上个网络中的这一全连接层。最后经由1×1过滤器的处理,得到一个softmax激活值,通过卷积网络,我们最终得到这个1×1×4的输出层,而不是这4个数字(编号3所示)。

以上就是用卷积层代替全连接层的过程,结果这几个单元集变成了1×1×400和1×1×4的维度。

再看看如何通过卷积实现滑动窗口对象检测算法。

假设向滑动窗口卷积网络输入14×14×3的图片,和前面一样,神经网络最后的输出层,即softmax单元的输出是1×1×4,我画得比较简单,严格来说,14×14×3应该是一个长方体,第二个10×10×16也是一个长方体,但为了方便,我只画了正面。所以,对于1×1×400的这个输出层,我也只画了它1×1的那一面,所以这里显示的都是平面图,而不是3D图像。

假设输入给卷积网络的图片大小是14×14×3,测试集图片是16×16×3,现在给这个输入图片加上黄色条块,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络(红色笔标记)生成0或1分类。接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1。继续将这个橘色区域输入给卷积网络,卷积后得到另一个标签,最后对右下方的紫色区域进行最后一次卷积操作。我们在这个16×16×3的小图像上滑动窗口,卷积网络运行了4次,于是输出了了4个标签。

结果发现,这4次卷积操作中很多计算都是重复的。所以执行滑动窗口的卷积时使得卷积网络在这4次前向传播过程中共享很多计算,尤其是在这一步操作中(编号1),卷积网络运行同样的参数,使得相同的5×5×16过滤器进行卷积操作,得到12×12×16的输出层。然后执行同样的最大池化(编号2),输出结果6×6×16。照旧应用400个5×5的过滤器(编号3),得到一个2×2×400的输出层,现在输出层为2×2×400,而不是1×1×400。应用1×1过滤器(编号4)得到另一个2×2×400的输出层。再做一次全连接的操作(编号5),最终得到2×2×4的输出层,而不是1×1×4。最终,在输出层这4个子方块中,蓝色的是图像左上部分14×14的输出(红色箭头标识),右上角方块是图像右上部分(绿色箭头标识)的对应输出,左下角方块是输入层左下角(橘色箭头标识),也就是这个14×14区域经过卷积网络处理后的结果,同样,右下角这个方块是卷积网络处理输入层右下角14×14区域(紫色箭头标识)的结果。

所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算,就像这里我们看到的这个4个14×14的方块一样。

总结一下滑动窗口的实现过程,在图片上剪切出一块区域,假设它的大小是14×14,把它输入到卷积网络。继续输入下一块区域,大小同样是14×14,重复操作,直到某个区域识别到汽车。

但是我们不能依靠连续的卷积操作来识别图片中的汽车。

这种算法仍然存在一个缺点,就是边界框的位置可能不够准确。

Bounding Box预测(Bounding box predictions)

滑动窗口算法有时会出现滑动窗不能完全涵盖目标的问题,如下图蓝色窗口所示。

YOLO(You Only Look Once)算法可以解决这类问题,生成更加准确的目标区域(如上图红色窗口)。

YOLO算法首先将原始图片分割成n x n网格,每个网格代表一块区域。为简化说明,上图中将图片分成3 x 3网格。

然后,利用上一节卷积形式实现滑动窗口算法的思想,对该原始图片构建CNN网络,得到的的输出层维度为3 x 3 x 8。其中,3 x 3对应9个网格,每个网格的输出包含8个元素:

y=[pcbxbybhbwc1c2c3]y= \ \begin{bmatrix} p_{c} \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ c_{1} \\ c_{2}\\ c_{3} \\\end{bmatrix}y= ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​pc​bx​by​bh​bw​c1​c2​c3​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​
如果目标中心坐标(bx,by)不在当前网格内,则当前网格Pc=0P_c=0Pc​=0;相反,则当前网格Pc=1P_c=1Pc​=1(即只看中心坐标是否在当前网格内)。判断有目标的网格中,bxb_xbx​,byb_yby​,bhb_hbh​,bwb_wbw​限定了目标区域。值得注意的是,当前网格左上角坐标设定为(0, 0),右下角坐标设定为(1, 1),(bx,by)范围限定在[0,1]之间,但是bh,bw可以大于1。因为目标可能超出该网格,横跨多个区域,如上图所示。目标占几个网格没有关系,目标中心坐标必然在一个网格之内。

划分的网格可以更密一些。网格越小,则多个目标的中心坐标被划分到一个网格内的概率就越小,这恰恰是我们希望看到的。

交并比(Intersection over union)

IoU,即交集与并集之比,可以用来评价目标检测区域的准确性。

如上图所示,红色方框为真实目标区域,蓝色方框为检测目标区域。两块区域的交集为绿色部分,并集为紫色部分。蓝色方框与红色方框的接近程度可以用IoU比值来定义:

IoU=IUIoU=IUIoU=IU
IoU可以表示任意两块区域的接近程度。IoU值介于0~1之间,且越接近1表示两块区域越接近。

Non-max Suppression

YOLO算法中,可能会出现多个网格都检测出到同一目标的情况,例如几个相邻网格都判断出同一目标的中心坐标在其内。

上图中,三个绿色网格和三个红色网格分别检测的都是同一目标。那如何判断哪个网格最为准确呢?方法是使用非最大值抑制算法。

非最大值抑制(Non-max Suppression)做法很简单,图示每个网格的Pc值可以求出,Pc值反映了该网格包含目标中心坐标的可信度。首先选取Pc最大值对应的网格和区域,然后计算该区域与所有其它区域的IoU,剔除掉IoU大于阈值(例如0.5)的所有网格及区域。这样就能保证同一目标只有一个网格与之对应,且该网格Pc最大,最可信。接着,再从剩下的网格中选取Pc最大的网格,重复上一步的操作。最后,就能使得每个目标都仅由一个网格和区域对应。如下图所示:

总结一下非最大值抑制算法的流程:

  1. 剔除Pc值小于某阈值(例如0.6)的所有网格;

  2. 选取Pc值最大的网格,利用IoU,摒弃与该网格交叠较大的网格;

  3. 对剩下的网格,重复步骤2。

Anchor Boxes
到目前为止,我们介绍的都是一个网格至多只能检测一个目标。那对于多个目标重叠的情况,例如一个人站在一辆车前面,该如何使用YOLO算法进行检测呢?方法是使用不同形状的Anchor Boxes。

如下图所示,同一网格出现了两个目标:人和车。为了同时检测两个目标,我们可以设置两个Anchor Boxes,Anchor box 1检测人,Anchor box 2检测车。也就是说,每个网格多加了一层输出。原来的输出维度是 3 x 3 x 8,现在是3 x 3 x 2 x 8(也可以写成3 x 3 x 16的形式)。这里的2表示有两个Anchor Boxes,用来在一个网格中同时检测多个目标。每个Anchor box都有一个Pc值,若两个Pc值均大于某阈值,则检测到了两个目标。

y=[pcbxbybhbwc1c2c3]y= \ \begin{bmatrix} p_{c} \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ c_{1} \\ c_{2}\\ c_{3} \\\end{bmatrix}y= ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​pc​bx​by​bh​bw​c1​c2​c3​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​
在使用YOLO算法时,只需对每个Anchor box使用上一节的非最大值抑制即可。Anchor Boxes之间并行实现。

顺便提一下,Anchor Boxes形状的选择可以通过人为选取,也可以使用其他机器学习算法,例如k聚类算法对待检测的所有目标进行形状分类,选择主要形状作为Anchor Boxes。

YOLO Algorithm

这一节主要介绍YOLO算法的流程,算是对前几节内容的回顾。网络结构如下图所示,包含了两个Anchor Boxes。

  1. For each grid call, get 2 predicted bounding boxes.

  2. Get rid of low probability predictions.

  3. For each class (pedestrian, car, motorcycle) use non-max suppression to generate final predictions.

Region Proposals

之前介绍的滑动窗算法会对原始图片的每个区域都进行扫描,即使是一些空白的或明显没有目标的区域,例如下图所示。这样会降低算法运行效率,耗费时间。

为了解决这一问题,尽量避免对无用区域的扫描,可以使用Region Proposals的方法。具体做法是先对原始图片进行分割算法处理,然后支队分割后的图片中的块进行目标检测。

Region Proposals共有三种方法:

R-CNN: 滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。

Fast R-CNN: 利用卷积实现滑动窗算法,类似第4节做法。

Faster R-CNN: 利用卷积对图片进行分割,进一步提高运行速度。

比较而言,Faster R-CNN的运行速度还是比YOLO慢一些。

Ng深度学习笔记-卷积神经网络-目标检测相关推荐

  1. 吴恩达深度学习笔记——卷积神经网络(Convolutional Neural Networks)

    深度学习笔记导航 前言 传送门 卷积神经网络(Convolutional Neural Networks) 卷积神经网络基础(Foundations of Convolutional Neural N ...

  2. 吴恩达深度学习笔记——卷积神经网络(CNN)

    目录 一.计算机视觉(Computer vision) 二.边缘检测示例(Edge detection example) 三.更多的边缘检测内容(More edge detection) 四.Padd ...

  3. 吴恩达深度学习笔记12-Course4-Week3【目标检测】

    目标检测(Object detection) 一.目标定位(Object Localization) 图像识别的三个层次: 图像分类:判断图像中是否包含某一类物体,并且假定每张图像只有一个目标. 目标 ...

  4. 深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?

    转载 https://blog.csdn.net/weixin_35227692/article/details/79223536 转载于:https://www.cnblogs.com/USTBlx ...

  5. Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集

    Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集 一.相关介绍 二.下载数据集 三.代码示例 1.导入keras库,并显示版本号 2.构建网络 3.数据预处理 4.使用数据增强 四.使用 ...

  6. 【深度学习】深入浅出YOLOv3目标检测算法和实现(图片和视频)

    [深度学习]深入浅出YYOLOv3目标检测算法(图片和视频) 文章目录 1 概述 2 一个全卷积神经网络--Darknet-53 3 解释输出 4 代码实现4.1 导入项目4.2 执行脚本4.3 预测 ...

  7. 深度学习在遥感图像目标检测中的应用综述

    深度学习在遥感图像目标检测中的应用综述 1 人工智能发展 1.1 发展历程 1.2 深度学习的应用 2 深度学习 2.1 机器学习概述 2.2 神经网络模型 2.3 深度学习 2.4 深度学习主要模型 ...

  8. 深度学习之卷积神经网络(1)什么是卷积

    深度学习之卷积神经网络(1)什么是卷积 1. 全连接网络的问题 2. 局部相关性 3. 权值共享 4. 卷积运算 1. 全连接网络的问题  首先我们来分析全连接网络存在的问题.考虑一个简单的4层全连接 ...

  9. 机器学习_深度学习毕设题目汇总——目标检测B

    下面是该类的一些题目: 题目 典型恶劣天气条件下高铁周界入侵目标检测 图模型融合时空特征的视觉显著性目标检测算法研究 基于SAR图像的舰船目标检测方法研究 基于三维点云分析的智能汽车目标检测方法研究 ...

最新文章

  1. 网站用户登录验证:Servlet+JSP VS Struts书剑恩仇录
  2. ADOQuery的LockType
  3. 提高网站首页载入速度的常用方法
  4. oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...
  5. php no route to host,java.net.NoRouteToHostException: No route to host解决方法
  6. 精确的力量:完美SNES仿真器的一个3GHz追求
  7. 在线教育网校系统源码,搭建可以解决培训考试的教学平台
  8. 在Linux下安装GmSSL
  9. 2007年中国搜索引擎市场调查报告
  10. datax(25):插件加载原理
  11. 深入剖析jsonp跨域原理
  12. K8S 数据卷volumes之ConfigMap
  13. 第一阶段:JAVA快速入门
  14. Windows密码凭证获取学习
  15. #02数据结构练习二
  16. 软件工程小组项目——单词计数
  17. Java最小因式分解_Javascript-625-最小因式分解——腾讯面试题库
  18. 那个给三千人算命的大师,正在给自己水滴筹
  19. 差分信号经运放后转为单端输出供单片机采集原理图
  20. iOS开发支付 — 内购(IAP)

热门文章

  1. Linux curses库使用
  2. easyrecovery数据恢复软件免费版最新下载,以及磁盘数据怎么恢复
  3. Oracle日期型函数详解
  4. Python 轻松解决从 K 个字符串数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合。(对比用库和不用库的方法)
  5. python socket模块[errno 113_error:
  6. PotPlayer播放蓝光片源及如何硬解码和音频源码输出
  7. python中的散点图还可以这么画
  8. 基于SpringBoot的毕业论文管理系统的设计与实现(开题报告)
  9. python从键盘输入一个字符串、将小写字母全部_从键盘输入一个字符串_将其中的小写字母全部转换成大写字母...
  10. OLE操作EXCEL