吴恩达深度学习第四课——卷积神经网络(第三周)

3.1目标定位(Object localization)
1、什么是目标定位
在这里插入图片描述
图片分类任务我们已经熟悉了,就是算法遍历图片,判断其中的对象是不是汽车,这就是图片分类。这节课我们要学习构建神经网络的另一个问题,即定位分类问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置,用边框或红色方框把汽车圈起来,这就是定位分类问题。其中“定位”的意思是判断汽车在图片中的具体位置。
在这里插入图片描述
图片分类问题如上图所示,例如,输入一张图片到多层卷积神经网络。这就是卷积神经网络,它会输出一个特征向量,并反馈给softmax单元来预测图片类型,这个例子中提供了 4种类型行人、汽车、摩托车(前三个都是有对象的)和背景。如果要定位图片中汽车的位置,我们可以让神经网络多输出几个单元,输出一个边界框。具体说就是让神经网络再多输出4个数字,标记为 b x b_x bx, b y b_y by(红色方框中心点位置), b w b_w bw b h b_h bh(红色方框宽高),这四个数字是被检测对象的边界框的参数化表示。

2、定义目标标签 y与损失函数L

  • 目标标签 y

在这里插入图片描述
因为这有四个分类,神经网络输出的是这四个数字和一个分类标签,或分类标签出现的概率。目标标签的定义如下:
在这里插入图片描述
它是一个向量,第一个组件 p c p_c pc表示是否含有对象,如果对象属于前三类(行人、汽车、摩托车),则 p c = 1 p_c=1 pc=1,如果是背景,则图片中没有要检测的对象,则 p c = 0 p_c=0 pc=0。我们可以这样理解 p c p_c pc,它表示被检测对象属于某一分类的概率,背景分类除外。

如果检测到对象,就输出被检测对象的边界框参数 b x b_x bx b y b_y by b h b_h bh b w b_w bw。最后,如果存在某个对象,那么 p c = 1 p_c=1 pc=1,同时输出 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3,表示该对象属于1-3类中的哪一类,是行人,汽车还是摩托车。鉴于我们所要处理的问题,我们假设图片中只含有一个对象,所以针对这个分类定位问题,图片最多只会出现其中一个对象。如果 p c = 0 p_c=0 pc=0,y的其它参数将变得毫无意义,这里的参数都写成问号,表示“毫无意义”的参数。

  • 损失函数L
    其损失函数参数为类别y和网络输出y^,如果采用平方误差策略,则公式如下,损失值等于每个元素相应差值的平方和。在这里插入图片描述
    实际应用中,你可以不对 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3和softmax激活函数应用对数损失函数,并输出其中一个元素值,通常做法是对边界框坐标应用平方差或类似方法,对 p c p_c pc应用逻辑回归函数,甚至采用平方预测误差也是可以的。

3.2特征点检测(Landmark detection)
神经网络可以通过输出图片上特征点的坐标(x,y)来实现对目标特征的识别。
在这里插入图片描述
这里主要讲解第二张人脸图片,如上图所示,选定特征点个数(这里是64个),并生成包含这些特征点的标签训练集(也就是图片x和标签y的集合,这些点都是人为辛苦标注的,此处先训练网络再测试),然后利用神经网络输出脸部关键特征点的位置。
具体做法是准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1或0,1表示有人脸,0表示没有人脸,然后输出(l1x,l1y)……直到(l64x,l64y)。这里我用l代表一个特征,这里有129个输出单元,其中1表示图片中有人脸,因为有64个特征,64×2=128,所以最终输出128+1=129个单元,由此实现对图片的人脸检测和定位。

3.3目标检测(Object detection)
这一小节我们将学习如何通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。
在这里插入图片描述
假如你想构建一个汽车检测算法,步骤是,首先创建一个标签训练集,也就是x和y表示适当剪切的汽车图片样本,有了这个标签训练集,你就可以开始训练卷积网络了,输入这些适当剪切过的图片(编号6),卷积网络输出y,0或1表示图片中有汽车或没有汽车。
训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,它是以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。具体步骤如下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上图片是利用不同大小的窗口进行目标检测。假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片上方这个窗口,然后将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车,就是对每个位置按0或1进行分类。之后以某个固定步幅滑动窗口,依次重复操作,直到这个窗口滑过图像的每一个角落。

滑动窗口目标检测算法也有很明显的缺点,就是计算成本,因为你在图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。

3.4滑动窗口的卷积实现(Convolutional implementation of sliding windows)
上一小节说明了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低。这一小节主要说明如何在卷积层上应用这个算法。

1、为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层。
在这里插入图片描述
假设在第一个全连接层应用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,最后经由1×1过滤器的处理,得到一个softmax激活值,通过卷积网络,我们最终得到这个1×1×4的输出层,而不是上面的4个数字。

2、如何通过卷积实现滑动窗口对象检测算法
在这里插入图片描述
假设输入给卷积网络的图片大小是14×14×3,测试集图片是16×16×3,现在给这个输入图片加上黄色条块。如上图第一行所示,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络生成0或1分类。如上图第二行所示,继续滑动14x14的窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1。继续将这个橘色区域输入给卷积网络,卷积后得到另一个标签,最后对右下方的紫色区域进行最后一次卷积操作。我们在这个16×16×3的小图像上滑动窗口,卷积网络运行了4次,于是输出了了4个标签。
在这里插入图片描述
以绿色方块为例,可以从上图看出绿色区域在卷积层的走向,它从14x14大小的区域最后被处理为大小为1x1的右上角区域,最后,第一张图的4个14×14的方块分别对应最后结果的4个1x1方块。
所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,一次得到所有预测值。其中的公共区域可以共享很多计算,就像这里我们看到的这个4个14×14的方块一样。

3、总结
在这里插入图片描述
如上图所示,我们可以对大小为28×28的整张图片进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出汽车的位置。
以上就是在卷积层上应用滑动窗口算法的内容,,它提高了整个算法的效率。不过这种算法仍然存在一个缺点,就是边界框的位置可能不够准确

3.5Bounding Box预测(Bounding box predictions
如上一小节所说,滑动窗口法的卷积实现不能输出最精准的边界框,但存在另外一个能得到更精准边界框的算法是YOLO(You only look once)算法

1、YOLO(You only look once)算法基本流程
在这里插入图片描述

比如你的输入图像是100×100的,然后在图像上放一个网格。为了介绍起来简单一些,这里用3×3网格,实际实现时会用更精细的网格,可能是19×19。基本思路是使用图像分类和定位算法。可以看出这张图有两个对象(两辆车),YOLO算法做的就是取两个对象的中点(如上图的绿点、黄点所示),然后将这个对象分配给包含对象中点的格子。所以左边的汽车就分配到这个格子上(编号4),然后右边的车分配给这个格子(编号6)。所以即使中心格子(编号5)同时有两辆车的一部分,我们就假装中心格子没有任何我们感兴趣的对象,使 p c = 0 p_c=0 pc=0。(把对象分配到一个格子的过程是,你观察对象的中点,然后将这个对象分配到其中点所在的格子,所以即使对象可以横跨多个格子,也只会被分配到9个格子其中之一。)

所以对于这里9个格子中任何一个,你都会得到一个8维输出向量,因为这里是3×3的网格(每个网格都会有一个8维的目标标签y),所以有9个格子,总的输出尺寸是3×3×8,所以目标输出是3×3×8。
在这里插入图片描述
总结:如果你现在要训练一个输入为100×100×3的神经网络,现在这是输入图像,然后你有一个普通的卷积网络,卷积层,最大池化层等等,这样最后就映射到一个3×3×8输出尺寸。所以你要做的是,有一个输入x,就是这样的输入图像,然后你有这些3×3×8的目标标签y。当你用反向传播训练神经网络时,将任意输入x映射到这类输出向量y。测试的时候,你做的是喂入输入图像x,然后跑正向传播,直到你得到这个输出y。
YOLO算法是单次卷积实现,在处理这3×3计算中很多计算步骤是共享的,所以这个算法效率很高。

2、如何编码这些边界框 b x b_x bx b y b_y by b h b_h bh b w b_w bw
在这里插入图片描述
b x b_x bx b y b_y by b h b_h bh b w b_w bw和单位是相对于格子尺寸的比例,所以 b x b_x bx b y b_y by必须在0和1之间,因为从定义上看,橙色点位于对象分配到格子的范围内,如果它不在0和1之间,如果它在方块外,那么这个对象就应该分配到另一个格子上。 b h b_h bh b w b_w bw可能会大于1,特别是如果有一辆汽车的边界框是这样的(编号3所示),那么边界框的宽度和高度有可能大于1。
指定边界框的方式有很多,但上述的这种约定是比较合理的。

论文:Redmon, Joseph, et al. “You Only Look Once: Unified, Real-Time Object Detection.” (2015):779-788.

3.6 交并比(Intersection over union)
在这里插入图片描述
交并比(loU)函数可以判断对象检测算法是否运作良好。如上图所示,在对象检测任务中,红色边框是实际边框,紫色的边界框是你的算法给出的,那么这个结果是好还是坏?所以交并比(loU)函数做的是计算两个边界框交集和并集之比(黄色区域与绿色区域之比)。loU越高,边界框越精确。一般约定,0.5是阈值,用来判断预测的边界框是否正确。

3.7非极大值抑制(Non-max suppression)
到目前为止学到的对象检测中的一个问题是,你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个对象只检测一次,下面通过一个例子说明。
在这里插入图片描述
假设你需要在这张图片里检测行人和汽车,你可能会在上面放个19×19网格,实践中当你运行对象分类和定位算法时,对于每个格子都运行一次,所以这个格子(编号1)可能会认为这辆车中点应该在格子内部,这几个格子(编号2、3)也会这么认为。因为你要在361个格子上都运行一次图像检测和定位算法,那么可能很多格子都会举手说我的 p c p_c pc,我这个格子里有车的概率很高,而不是361个格子中仅有两个格子会报告它们检测出一个对象。所以当你运行算法的时候,最后可能会对同一个对象做出多次检测,所以非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次,而不是每辆车都触发多次检测。
在这里插入图片描述
如上图所示逐一审视剩下的矩形,找出概率最高, p c p_c pc最高的一个。然后非极大值抑制算法就会去掉其他loU值很高的矩形。所以现在每个矩形都会被高亮显示或者变暗,如果你直接抛弃变暗的矩形,那就剩下高亮显示的那些,这就是最后得到的两个预测结果。

具体算法细节如下图所示。
在这里插入图片描述
3.8Anchor Boxes
到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以这么做,就是使用anchor box这个概念。
在这里插入图片描述
如上图所示,人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中。按照前面的方法无法输出检测结果。
在这里插入图片描述
anchor box的思路是预先定义两个不同形状的anchor box,如上图所示,你要做的是把预测结果和这两个anchor box关联起来。定义类别标签如下图所示:在这里插入图片描述
前面的8个参数是和anchor box 1关联,后面的8个参数是和anchor box 2相关联。不管选的是1还是2,这个对象不只分配到一个格子,而是分配到一对,即(grid cell,anchor box)对,最后会分配到和对象形状交并比最高的anchor box中,行人更类似于anchor box 1的形状,所以对于行人来说,我们将她分配到向量的上半部分。车子的形状更像anchor box 2,所以这个向量剩下的部分是 p c = 1 p_c=1 pc=1 ,然后 c 1 = 0 , c 2 = 1 , c 3 = 0 c_1=0,c_2=1,c_3=0 c1=0,c2=1,c3=0(编号1所示的绿色参数)。所以这就是对应中下格子的标签 y。

注意事项如下:
在这里插入图片描述

3.9 YOLO 算法(Putting it together: YOLO algorithm)
首先先训练你的神经网络,在这不多赘述。看上文。
在这里插入图片描述
其次输入图像,你的神经网络的输出尺寸是这个3×3×2×8,对于9个格子,每个都有对应的向量。比如左上角格子对应的向量是编号3,绿色的格子对应编号4。这就是神经网络做出预测的过程。最后要运行一下这个非极大值抑制,这里用另外一张图片举例。
在这里插入图片描述
如果你使用两个anchor box,那么对于9个格子中任何一个都会有两个预测的边界框,其中一个的概率 p c p_c pc很低。但9个格子中,每个都有两个预测的边界框,比如说我们得到的边界框是是这样的,注意有一些边界框可以超出所在格子的高度和宽度(编号1所示)。接下来就是抛弃概率很低的预测,如果你有三个对象检测类别,你希望检测行人,汽车和摩托车,那么你要做的是,对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行三次来得到最终的预测结果。所以算法的输出最好能够检测出图像里所有的车子,还有所有的行人(编号3所示)。

3.10候选区域(选修)
R-CNN的算法,意思是带区域的卷积网络,或者说带区域的CNN。这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,所以这里不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。
选出候选区域的方法是运行图像分割算法,分割的结果是下边的图像。在这里插入图片描述
你先找出可能2000多个色块,然后在这2000个色块上放置边界框,然后在这2000个色块上运行分类器,这样需要处理的位置可能要少的多,可以减少卷积网络分类器运行时间,比在图像所有位置运行一遍分类器要快。
这就是R-CNN或者区域CNN的特色概念,现在看来R-CNN算法还是很慢的。所以有一系列的研究工作去改进这个算法,所以基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区域运行一下分类器,每个区域会输出一个标签,有没有车子?有没有行人?有没有摩托车?并输出一个边界框,这样你就能在确实存在对象的区域得到一个精确的边界框。
在这里插入图片描述
现在R-CNN算法的一个缺点是太慢了,所以这些年来有一些对R-CNN算法的改进工作。如上图所示,快速的R-CNN(Fast R-CNN)算法,它基本上是R-CNN算法,不过用卷积实现了滑动窗法。更快的R-CNN算法(Faster R-CNN),使用的是卷积神经网络,而不是更传统的分割算法来获得候选区域色块。

【RCNN系列】【超详细解析】(转载)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值