第四门课-卷积神经网络 第三周(重点总结)


注:图片来自网络

第三周 目标检测(Object detection)

3.1 目标定位(Object localization)

图片分类: 算法遍历图片,判断其中的对象是不是汽车
分类过程: 如果你正在构建汽车自动驾驶系统,那么对象可能包括以下几类:行人、汽车、摩托车和背景,这四个分类就是softmax
在这里插入图片描述
定位分类: 用算法判断图片中是不是一辆汽车,还要在图片中标记出它的位置,用边框或红色方框把汽车圈起来。
定位过程: 定位图片中汽车的位置,可以让神经网络多输出几个单元,输出一个边界框。具体说就是让神经网络再多输出4个数字,标记为 bx,by,bh bw,这四个数字是被检测对象的边界框的参数化表示。
红色方框的中心点为 ( bx, by ),边界框的高度为 bh,宽度为 bw。因此训练集不仅包含神经网络要预测的对象分类标签,还要包含表示边界框的这四个数字。接着采用监督学习算法,输出一个分类标签,还有四个参数值,从而给出检测对象的边框位置。
对象检测: 图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象
定义label y: (假设图片中只含有一个对象)
在这里插入图片描述
pc表示是否含有对象。如果对象属于前三类(行人、汽车、摩托车),则 pc = 1
如果检测到对象,就输出被检测对象的边界框参数 bx、by、bh bw
如果存在某个对象,那么 pc = 1,同时输出c1、c2和c3,表示该对象属于1-3类中的哪一类,是行人,汽车还是摩托车。(假设图片中只含有一个对象)
损失值:
在这里插入图片描述
如果图片中存在定位对象,即 y1 = pc = 1,损失值就是不同元素的平方和。
如果图片中不存在定位对象,y1 = pc =0,只考虑pc准确度(第一项)

3.2 特征点检测(Landmark detection)

在这里插入图片描述

假设脸部有64个特征点。选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。
具体做法是,准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1或0,1表示有人脸,0表示没有人脸,然后输出(l1x,l1y)……直到(l64x,l64y)。
l代表一个特征,这里有64×2+1=129个输出单元(其中1表示图片中有人脸),由此实现对图片的人脸检测和定位。
这只是一个识别脸部表情的基本构造模块

在这里插入图片描述
如果你对人体姿态检测感兴趣,你还可以定义一些关键特征点,然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。
要实现这个功能,你需要设定这些关键特征点(32个),从(l1x,l1y)直到(l32x,l32y)。
你可以利用它们判断人物的动作姿态,识别图片中的人物表情等等

3.3 目标检测(Object detection)

构建一个汽车检测算法(基于滑动窗口的目标检测算法)(左图)
在这里插入图片描述

1.创建一个标签训练集
2.训练卷积网络,输入适当剪切过的图片(剪掉汽车以外的部分,使汽车居于中间位置,并基本占据整张图片)
3.滑动窗口目标检测:
①选定一个特定大小的窗口,比如图片下方这个窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车
在这里插入图片描述
②将红色方框稍向右滑动,区域内图像输入给卷积网络,再次运行卷积网络,依次重复操作,直到这个窗口滑过图像的每一个角落。
图像滑动窗口操作: 以固定步幅移动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类。
③选择一个更大的窗口,截取更大的区域,重复②操作
④多次重复③操作

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

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

如何把神经网络的全连接层转化成卷积层
全连接层:
假设对象检测算法输入一个14×14×3的图像,通过一个卷积层和一个池化层,图像减小到5×5×16。然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最后通过softmax单元输出y。y用4个数字来表示,分别对应行人、汽车、摩托车和其它对象。

在这里插入图片描述
转化为卷积层:
应用400个5×5×16过滤器,输出维度就是1×1×400,我们不再把它看作一个含有400个节点的集合,而是一个1×1×400的输出层。从数学角度看,它和全连接层是一样的,因为这400个节点中每个节点都有一个5×5×16维度的过滤器,所以每个值都是上一层这些5×5×16激活值经过某个任意线性函数的输出结果。
再添加另外一个卷积层,这里用的是1×1卷积,假设有400个1×1的过滤器,在这400个过滤器的作用下,下一层的维度是1×1×400,它其实就是上个网络中的全连接层。最后经由1×1过滤器的处理,得到一个softmax激活值,通过卷积网络,我们最终得到这个1×1×4的输出层

参考论文:
Sermanet, Pierre, et al. “OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks.” Eprint Arxiv (2013).
如何通过卷积实现滑动窗口对象检测算法:
(主视图)假设输入给卷积网络的图片大小是14×14×3,测试集图片是16×16×3,现在给这个输入图片加上黄色条块,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络(红色笔标记)生成0或1分类。接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1。继续将这个橘色区域输入给卷积网络,卷积后得到另一个标签,最后对右下方的紫色区域进行最后一次卷积操作。我们在这个16×16×3的小图像上滑动窗口,卷积网络运行了4次,于是输出了了4个标签。
最终,在输出层这4个子方块中,蓝色的是图像左上部分14×14的输出(红色箭头标识),右上角方块是图像右上部分(绿色箭头标识)的对应输出,左下角方块是输入层左下角(橘色箭头标识),也就是这个14×14区域经过卷积网络处理后的结果,同样,右下角这个方块是卷积网络处理输入层右下角14×14区域(紫色箭头标识)的结果。

在这里插入图片描述
结果发现,这4次卷积操作中很多计算都是重复的,执行滑动窗口的卷积时使得卷积网络在这4次前向传播过程中共享很多计算。所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,输入为四个子图片,输出为四个1×1×4的输出层。
在这里插入图片描述
对28×28×3的图片应用滑动窗口操作,如果以同样的方式运行前向传播,最后得到8×8×4的结果。以14×14区域滑动窗口,首先在这个区域应用滑动窗口,其结果对应输出层的左上角部分(1×1×4的输出层)。接着以大小为2的步幅不断地向右移动窗口,直到第8个单元格,得到输出层的第一行。然后向图片下方移动,最终输出这个8×8×4的结果。因为最大池化参数为2,相当于以大小为2的步幅在原始图片上应用神经网络。
缺点:边界框的位置可能不够准确

3.5 Bounding Box预测(Bounding box predictions)

YOLO(You only look once)算法: 你只看一次
在这里插入图片描述
假设输入图像是100×100的,然后在图像上放一个3×3网格,使用图像分类和定位算法,然后将算法应用到9个格子上。定义训练标签时,所以对于9个格子中的每一个指定一个标签y。y维度是3×3×8。
在这里插入图片描述
YOLO算法: 分别取两个对象的中点,然后将这个对象分配给包含对象中点的格子。(左边的汽车分配4号格,右边的汽车分配到6号格,5号格不分配
优点:①神经网络可以输出精确的边界框,可以具有任意宽高比,并且能输出更精确的坐标。对于3×3位置对应的9个输出,可以读出1或0(pc位置),就能知道9个位置之一有没有对象,那个对象是什么(c1,c2,c3位置),对象的边界框是什么(bx,by,bh,bw)。
19×19网格更精细,网格越精细得多,那么多个对象分配到同一个格子得概率就越小。
②使用了一个卷积网络,有很多共享计算步骤,所以这个算法效率很高。
如何编码边界框:
在这里插入图片描述

对于这个方框(编号1所示),我们约定左上这个点是(0,0),右下这个点是(1,1),橙色中点的位置(bx,by)大概是(0.4,0.3),宽度bw为0.9,高度bh为0.5。
橙色点(bx,by)如果不在0和1之间,那么这个对象就应该分配到另一个格子上。
高度 bh 和宽度 bw 可能大于1。

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

3.6 交并比(Intersection over union)

交并比(loU)函数: 衡量了两个边界框重叠地相对大小,判断对象检测算法运作是否良好
计算两个边界框(实际边界框和算法给出的边界框)交集和并集之比

在这里插入图片描述
如果loU >= 阈值,就说检测正确。一般约定0.5是阈值,你可以将loU定得更高(如0.6)
loU越高,边界框越精确。
定义判断对象定位是否准确:统计算法正确检测和定位对象的次数。

3.7 非极大值抑制(Non-max suppression)

非极大值抑制:只输出概率最大的分类结果,抑制很接近但不是最大的其他预测结果。
到目前为止你们学到的对象检测中的一个问题是,你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个对象只检测一次。

在这里插入图片描述
实践中当你运行对象分类和定位算法时,对于每个格子都运行一次,所以这个格子(编号1)可能会认为这辆车中点应该在格子内部,这几个格子(编号2、3)也会这么认为。对于左边的车子也一样,不仅这个格(编号4)子会认为它里面有车,也许这个格子(编号5)和这个格子(编号6)也会,也许其他格子也会这么认为,觉得它们格子内有车。结果如下:
在这里插入图片描述
非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次,而不是每辆车都触发多次检测。
步骤:
1.看看每次报告每个检测结果相关的概率pc首先看概率最大的那个,这个例子(右边车辆)中是0.9,然后就说这是最可靠的检测,所以我们就用高亮标记,就说我这里找到了一辆车。这么做之后,非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,那么这些输出就会被抑制。所以这两个矩形分别是0.6和0.7,这两个矩形和淡蓝色矩形重叠程度很高,所以会被抑制,变暗,表示它们被抑制了。
2.接下来,逐一审视剩下的矩形,找出概率 pc最高的一个,在这种情况下是0.8,我们就认为这里检测出一辆车(左边车辆),然后非极大值抑制算法就会去掉其他loU值很高的矩形。所以现在每个矩形都会被高亮显示或者变暗,如果你直接抛弃变暗的矩形,那就剩下高亮显示的那些,这就是最后得到的两个预测结果。
如果你尝试同时检测三个对象,比如说行人、汽车、摩托,那么输出向量就会有三个额外的分量。正确的做法是独立进行三次非极大值抑制,对每个输出类别都做一次。

3.8 Anchor Boxes

到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让一个格子检测出多个对象,你可以使用anchor box这个概念
在这里插入图片描述
anchor box的思路: 预先定义两个不同形状的anchor box,或者anchor box形状,你要做的是把预测结果和这两个anchor box关联起来,定义类别标签如下
在这里插入图片描述
在这里插入图片描述
前面的和anchor box 1关联,后面的和anchor box 2关联
对于训练集图像中的每个对象,都根据那个对象中点位置分配到对应的格子中,以及分配到和对象形状交并比最高的anchor box中。这个对象不只分配到一个格子,而是分配到一对,即(grid cell,anchor box)对。所以现在输出y就是 3×3×2×8 ,因为现在这里有2个anchor box

在这里插入图片描述
在这个格子(编号2)中,对于行人来说,更类似于anchor box 1的形状,所以分配到上半部分(橙色),pc = 1,c1 = 1;对于车来说,更类似于anchor box 2的形状,所以分配到下半部分(绿色),pc = 1,c2 = 1。
假设没有行人只有车,对于车来说,更类似于anchor box 2的形状,所以分配到下半部分(绿色),pc = 1,c2 = 1;anchor box 1对应的向量分量里面没有任何对象,所以 pc = 0

无法处理:①同一个格子中有三个对象②两个对象都分配到一个格子中,而且它们的anchor box形状也一样
好处: anchor box 能让你的学习算法能够更有征对性
如何选择anchor box: ①手工指定anchor box形状,选择5到10个anchor box形状,覆盖到多种不同的形状。②k-平均算法,可以将两类对象形状聚类,选择最具有代表性的一组anchor box

3.9 YOLO 算法(Putting it together: YOLO algorithm)

在这里插入图片描述
构造训练集: 假设你要训练一个算法去检测三种对象,行人、汽车和摩托车,你需要3个类别标签,如果你要用两个anchor box,那么输出y就是3×3×2×8,其中3×3表示3×3个网格,2是anchor box的数量,8是向量维度,你需要遍历9个格子,然后构成对应的目标向量y。网格中大多数格子都是空的,即y=[0 ???????0 ???????]T,而编号2的格子中y=[0 ???????1 bx by bh bw 0 1 0]T(红框和anchor box 2的交并比更高,选择向量下半部分)遍历9个格子,遍历3×3网格的所有位置,你会得到这样一个向量,得到一个16维向量,所以最终输出尺寸就是3×3×16
算法预测过程:
在这里插入图片描述
1.输入图像,输出尺寸是3×3×2×8
2.运行非极大值抑制:如果你使用两个anchor box,那么对于9个格子中任何一个都会有两个预测的边界框(如图1);接下来抛弃概率很低的预测(如图2);最后,如果你有三个对象检测类别,你希望检测行人,汽车和摩托车,那么你要做的是,对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框。运行三次来得到最终的预测结果。所以算法的输出最好能够检测出图像里所有的车子,还有所有的行人(如图3)

在这里插入图片描述

3.10 候选区域(选修)(Region proposals (Optional))

滑动窗法: 使用训练过的分类器,在这些窗口中全部运行一遍,然后运行一个检测器,看看里面是否有车辆,行人和摩托车。现在你也可以运行一下卷积算法。
这个算法的其中一个缺点是,它在显然没有任何对象的区域浪费时间。
论文推荐:
Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2014: 580-587.
R-CNN的算法: 使用某种算法求出候选区域,然后对每个候选区域运行一下分类器
选出候选区域的方法是运行图像分割算法,分割的结果是下边的图像,为了找出可能存在对象的区域,在不同的这个色块上运行分类器
在这里插入图片描述
R-CNN 算法的一个缺点是太慢了,大多数更快R-CNN 的算法实现还是比YOLO 算法慢很多
在这里插入图片描述
参考文献:

  • Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi - You Only Look Once: Unified, Real-Time Object Detection (2015)
  • Joseph Redmon, Ali Farhadi - YOLO9000: Better, Faster, Stronger (2016)
  • Allan Zelener - YAD2K: Yet Another Darknet 2 Keras
  • The official YOLO website (https://pjreddie.com/darknet/yolo/)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值