吴恩达深度学习 第三课 第三周 目标检测

本文深入讲解目标检测技术,包括目标定位、特征点检测、滑动窗口卷积实现、边界框预测、交并比、非最大值抑制、YOLO算法、候选区域等关键概念。探讨如何构建高效准确的对象检测系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


机器学习、深度学习、相关论文

目标定位(Object localization)

学习神经网络的另一个问题,即定位分类问题,我们不仅要判断图中是不是一辆车,还要标记出它的位置。

如果你在构建汽车自动驾驶系统,那么对象可能包括:行人、汽车、摩托车和背景,这四个分类就是softmax函数可能输出的结果。
如果我们还想定位图片中汽车的位置,我们可以让神经元多输出几个单元,输出一个边界框, b x , b y , b h , b w b_x,b_y,b_h,b_w bx,by,bh,bw表示边界框,约定图片左上角为(0,0),右下角(1,1),要确定边框,需要指定红色方框的中心点 ( b x , b y ) (b_x,b_y) (bx,by),边框的高度 b h b_h bh和宽度 b w b_w bw
以下图为例, b x b_x bx的理想值为0.5,大约处于图片水平方向的中间; b y b_y by大约是0.7,表示汽车处于垂直的 7 10 \frac{7}{10} 107的位置; b h b_h bh约为0.3,因为红色方框的高度是图片高度的0.3倍; b w b_w bw约为0.4,红色边框的宽度约为图片宽度的0.4倍。同时,如果输出四个边界框,还会输出每个边界框的分类情况。

为监督学习定义目标标签y

接下来我们为监督学习定义一个分类标签。y为一个向量, p c p_c pc表示是否含有对象,如果属于前3类,则为1,是背景则为0。若果检测到对象,就输出被检测对象的4个边界框参数,同时输出 c 1 , c 2 , c 3 c_1,c_2,c_3 c1,c2,c3,表示该对象属于哪一类对象。这里我们假设只含有一个对象。
在这里插入图片描述
下图两张图片的具体表示,可以看到,当不存在对象只有背景时, p c p_c pc为0,其它参数则没有意义,可以以"?"表示。

神经网络的损失函数

p c = 1 p_c=1 pc=1时:
L ( y p r e , y ) = ( y p r e 1 − y 1 ) 2 + ( y p r e 2 − y 2 ) 2 . . . + ( y p r e 8 − y 8 ) 2 L(y_{pre},y)=(y_{pre1}-y_1)^2+(y_{pre2}-y_2)^2...+(y_{pre8}-y_8)^2 L(ypre,y)=(ypre1y1)2+(ypre2y2)2...+(ypre8y8)2
p c = 0 p_c=0 pc=0时:
只需要考虑 p c p_c pc的准确度

特征点检测(Landmark detection)

神经网络可以通过输出图片上特征点的 ( x , y ) (x,y) (x,y)坐标来实现对目标特征的识别。
如果你正在构建一个人脸识别应用,你希望算法给出眼角的具体位置,可以让神经网络的最后一层多输出两个数字 ( l x , l y ) (l_x,l_y) (lx,ly),如果你想知道四个眼角的具体位置,那么从左到右可以输出两个特征点 ( l 1 x , l 1 y ) ( l 2 x , l 2 y ) (l_{1x},l_{1y})(l_{2x},l_{2y}) (l1x,l1y)(l2x,l2y),如果你还想获取更多特征点输出值,都可以以坐标的形式加入 ( l 1 x , l 1 y ) (l_{1x},l_{1y}) (l1x,l1y) ( l 64 x , l 64 y ) (l_{64x},l_{64y}) (l64x,l64y)这样就构建了64个特征,来实现图片的人脸检测。当然你也可以定义人体姿态检测的关键特征点,头部、胸部、手肘等等。
定义过人物姿态后,就可以批量定义输出单元,要注意每个特征点所代表的位置是相同的,如特征点1总是代表左眼外眼角。

目标检测(Object detection)

学过了对象定位和特征点检测,我们来构建一个对象检测算法。通过卷积网络进行对象检测,采用基于滑动窗口的目标检测算法。
假如构建一个汽车检测算法,首先创建一个标签训练集,我们可以裁剪掉汽车以外的部分,使汽车居于中间并占据整张图片,然后开始训练神经网络,检测是否有汽车,训练完这个卷积网络,就可以用它来实现滑动窗口目标检测。

首先选定一个特定大小的窗口,将这个红色小块输入卷积神经网络,检测并输出0或1,然后以固定步幅活动窗口,遍历整个图像;第二次增大红框,重复上述检测步骤;第三次重复操作,选用更大的窗口,这样,不论汽车在图片的哪个位置,总有一个窗口可以检测到它。

这样滑动窗口太慢,计算成本很大

滑动窗口的卷积实现

滑动窗口的卷积应用可以提高滑动窗口目标检测器的效率。将神经网络的全连接层转化为卷积层,用卷积层代替全连接层。在之前的全连接层出使用5x5的过滤器,输出为1x1x400,然后采用1x1的过滤器并改变通道数,最终输出1x1x4,从数学角度看,它和全连接层是一样的。

通过全卷积网络的构建,可以实现不需要将输入图像分割分别执行,而是整张图片输入卷积网络计算,公共区域可以共享很多计算
下图中,输入给卷积网络的图片大小是14×14×3,测试集图片是16×16×3。图一为14×14×3的目标检测,在最初的滑动我们会预测分类0或1。图二16×16×3在步长为2的情况下可以看做有4个目标检测的输入,执行与图一相同的操作,右上角方块是图像右上部分(绿色箭头标识)的对应输出,左下角方块是输入层左下角(橘色箭头标识),也就是这个14×14区域经过卷积网络处理后的结果。

同样考虑一个更大的图片样本28×28×3,应用图片滑动窗口操作,如果以同样的方式运行前向传播,最后得到8×8×4的结果。跟上一个范例一样,以14×14区域滑动窗口,首先在这个区域应用滑动窗口,其结果对应输出层的左上角部分。接着以大小为2的步幅不断地向右移动窗口,直到第8个单元格,得到输出层的第一行。然后向图片下方移动,最终输出这个8×8×4的结果。因为最大池化参数为2,相当于以大小为2的步幅在原始图片上应用神经网络。
在这里插入图片描述

Bounding Box预测

滑动窗口法的卷积实现效率很高,有个缺点,无法输出最精准的边界框。
更精准边界框的算法是YOLO(You only look once)算法。
比如你的输入图像是100×100的,然后在图像上放一个网格。为了介绍起来简单一些,我用3×3网格,实际实现时会用更精细的网格(19×19)。基本思路是使用前面介绍的图像分类和定位算法。
在这里插入图片描述
对于每一个格子各自都会输出一个标签y(8x1),如果我们输出9个格子,总的输出尺寸3x3x8。有两点需要注意:

  • 如果一个物体存在于两个格子内,我们考虑它的中心所在的格子

  • 当前考虑的一个格子只存在一个对象,一个格子多个对象的情况稍后讨论。
    算法同时具有两点好处

  • 神经网络输出边界框,可以有任意的宽高比,不会受到滑动窗口分类器的限制。

  • 通过卷积实现,即单次卷积,共享了很多计算,算法效率很高。

  • YOLO算法的运行速度非常快。

交并比(Iou)

计算两个边框的交集和并集之比(loU),当交并比大于等于0.5,认为检测正确。同时,0.5是人为约定,没有特别深的理论依据。
在这里插入图片描述

非最大值抑制(Non-max suppression)

对象检测中的一个问题是,你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以确保你的算法对每个对象只检测一次,我们讲一个例子。
非极大值意味着只输出概率最大的分类结果,但抑制很接近概率最大的结果(loU较高)但不是最大的其他预测结果。
如图,以左车为例,4、5、6可能都认为自己检测到车,而最大值抑制则是清理检测结果,使其只触发一次检测。
在这里插入图片描述
具体算法如下图,首先抛弃 p c &lt; = 0.6 p_c&lt;=0.6 pc<=0.6
然后while循环操作:

  1. 选择最大的概率 p c p_c pc检测
  2. 抛弃与最大概率的检测 l o U &gt; = 0.5 loU&gt;=0.5 loU>=0.5的其他检测

    当我们同时检测三个对象时,我们需要独立进行三组非极大值抑制。

Anchor Boxes

如果你想让一个格子检测多个对象,可以使用anchor box。

如下图,当两个物体的中心都出现在一个格子中,这时会有两个Anchor box,Anchor box的思路就是根据分类(假设两个:车和人)预先定义两个Anchor box。

所以当有两个Anchor box,输出的维度由3x3x8变为了3x3x16。

YOLO算法

有了以上模块,我们可以构建YOLO算法。假设你要训练一个算法去检测三种对象,行人、汽车和摩托车以及背景。这里有3个类别标签,如果你要用两个anchor box,那么输出就是3×3×2×8,其中3×3表示3×3个网格,2是anchor box的数量,8是向量维度。构造训练集,需要遍历9个格子,然后构成对应的目标向量y。
训练算法如下:

  1. 将图像切分为3x3x2x8的训练结果集
  2. 预测
  3. 非极大值抑制
    关于算法的详细实现,将有一个课后练习来实践一下。

候选区域

这里涉及对象检测的另一类算法,通过图像分割算法分割不同色块,对色块进行对象检测。R-CNN、Fast R-CNN先选出带区域的卷积网络,不再对所有的滑动窗运行检测算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值