内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。
文章目录
- 对象定位
- 特征点检测
- 基于滑动窗口的目标检测算法
- 原理
- 将全连接层转化成卷积层
- 通过卷积实现滑动窗口检测算法
- YOLO
- Bounding Box预测
- 交并比
- 非极大值抑制
- Anchor Box
- YOLO检测
- 训练集中
- 预测时
- 带区域的卷积网络
对象定位
之前检测一张图片只是检测是不是车,现在进一步地,不仅仅检测是不是车,而且要标记出其位置,这就是对象定位问题。
首先对图片进行分类,判断图片的类别,这个过程是之前分享过的一般过程:图片使用CNN后,经过softmax激活函数进行分类。如果需要附加定位功能,那么CNN的输出不仅要输出分类,而且还要输出定位框的坐标信息。因此,训练集的数据不仅仅要包含要预测的对象分类标签,还需要包含表示边界框的四个坐标数字。
定义图片左上角位置为(0,0),右下角位置为(1,1),定位框的中心点坐标为(bx,by),定位框宽bw,高bh。
定义目标标签 Y Y Y:
- pc:是否包含对象,若包含行人、车、摩托车,则值为1;若是背景,则值为0。
- bx、by、bw、bz:若检测到对象,输出边界框的参数。
- c1、c2、c3:若pc=1,则输出,表示该对象属于行人、车,摩托车中的哪一类。
- 第一张图中有车,对应的目标标签 y y y中, p c p_c pc(表示是否存在目标)为1说明存在目标, b x b_x bx、 b y b_y by、 b h b_h bh、 b w b_w bw为汽车边界框的相关参数,类别标签 c 1 c_1 c1为0(行人)、 c 2 c_2 c2为1(汽车)、 c 3 c_3 c3为0(摩托车)说明该对象被分类为车。
- 第二张图中没有对象,对应的目标标签 y y y中, p c p_c pc为0, b x b_x bx、 b y b_y by、 b h b_h bh、 b w b_w bw以及 c 1 c_1 c1、 c 2 c_2 c2、 c 3 c_3 c3都可以设为“?”表示无参数。
特征点检测
如果要检测特征,比如人脸检测,标记了64处特征。输出包括是否为人脸的判断,以及人脸64个关键点的坐标,即 l 1 x l_{1x} l1x, l 1 y l_{1y} l1y, l 2 x l_{2x} l2x, l 2 y l_{2y} l2y,… , l 64 x l_{64x} l64x, l 64 y l_{64y} l64y ,共计129(64个标签,x和y两个坐标和一个是不是人脸的判断64*2+1)个输出值。
基于滑动窗口的目标检测算法
原理
要检测和定位车。准备训练集时,可以先重点关注图片是否包含车和不包含车,经过CNN输出预测值。然后实现滑动窗口目标检测。具体步骤如下:
首先选定一个特定大小的窗口(红色小方块)输入卷积网络,然后窗口按照一定的步长滑动来遍历图片上的像素。然后选定更大的窗口继续遍历。这个遍历过程需要重复多次。在上述的遍历过程中,总有一个窗口能够对应上车的位置,输出标签为1。
由于需要在大量不同位置和尺寸上滑动窗口,计算量较大。
将全连接层转化成卷积层
将全连接层转化为卷积层,可以减少参数数量,降低计算量,减轻内存负担。
上部分图:输入一个 14 × 14 × 3 14×14×3 14×14×3的特征图,使用了 16 16 16个大小为 5 × 5 5×5 5×5的卷积核进行卷积操作。 H w = ⌊ H i n − f + 2 p s ⌋ + 1 H_{w}=\lfloor\frac{H_{in}-f + 2p}{s}\rfloor + 1 Hw=⌊sHin−f+2p⌋+1, H h = ⌊ H i n − f + 2 p s ⌋ + 1 H_{h}=\lfloor\frac{H_{in}-f + 2p}{s}\rfloor + 1 Hh=⌊sHin−f+2p⌋+1,则输出特征图的高度和宽度为 ⌊ 14 − 5 1 ⌋ + 1 = 10 \lfloor\frac{14 - 5}{1}\rfloor + 1 = 10 ⌊114−5⌋+1=10,输出特征图的通道数等于卷积核的数量,即 16 16 16。所以卷积层输出特征图的尺寸为 10 × 10 × 16 10×10×16 10×10×16。
池化层采用最大池化,池化窗口大小为 2 × 2 2×2 2×2,步长为 2 2 2,有 H w = ⌊ H i n − f + 2 p s ⌋ + 1 H_{w}=\lfloor\frac{H_{in}-f+2p}{s}\rfloor + 1 Hw=⌊sHin−f+2p⌋+1, H h = ⌊ H i n − f + 2 p s ⌋ + 1 H_{h}=\lfloor\frac{H_{in}-f+2p}{s}\rfloor + 1 Hh=⌊sHin−f+2p⌋+1,输出特征图的高度和宽度为 ⌊ 10 − 2 2 ⌋ + 1 = 5 \lfloor\frac{10 - 2}{2}\rfloor + 1 = 5 ⌊210−2⌋+1=5。池化层不改变通道数,输出特征图尺寸为 5 × 5 × 16 5×5×16 5×5×16。
在全连接层,第一个全连接层:将池化层输出的三维特征图( 5 × 5 × 16 5×5×16 5×5×16)展平为一维向量,其长度为 5 × 5 × 16 = 400 5×5×16 = 400 5×5×16=400,即第一个全连接层的输入神经元个数为 400 400 400,输出神经元个数也为 400 400 400。第二个全连接层:输入为第一个全连接层的输出,即 400 400 400个神经元,输出同样为 400 400 400个神经元。
使用Softmax函数进行分类,输出 4 4 4个类别的概率分布,最终输出 y y y。
下部分图:之前的相同,在全连接层将其转为卷积层:对于第一个全连接层,将池化层输出的 5 × 5 × 16 5×5×16 5×5×16特征图使用400个 5 × 5 × 16 5×5×16 5×5×16的过滤器展平成一维向量,其长度为 5 × 5 × 16 = 400 5×5×16 = 400 5×5×16=400,输出尺寸为 1 × 1 × 400 1×1×400 1×1×400(代入公式计算)。不再将其看作一个有400节点的集合,而是看成一个卷积层。第二个全连接层输入为 1 × 1 × 400 1×1×400 1×1×400,输出同样为 400 400 400个神经元,输出尺寸为 1 × 1 × 400 1×1×400 1×1×400变成卷积层。
通过卷积实现滑动窗口检测算法
如图,将 14 × 14 × 3 14\times14\times3 14×14×3尺寸的特征图填充成 16 × 16 × 3 16\times16\times3 16×16×3的特征图,使用大小为 5 × 5 5\times5 5×5的卷积核进行卷积…最后得到 2 × 2 × 4 2\times2\times4 2×2×4的输出。将全连接层转为卷积层后,不必将图片分割为4个部分,而是作为一张图片输入给卷积网络计算。比如图中检测了红绿黄紫四个区域,每一个区域经过一层一层的过滤器,在 2 × 2 × 4 2\times2\times4 2×2×4的输出上,左上角表示红色区域的检测结果、右上角表示绿色区域的检测结果、左下角现实黄色区域的检测结果和右下角显示紫色区域的检测结果。
在过程中可以看到有很多区域的计算都是重复的,但是卷积网络在传播过程中可以共享大量的计算,提高计算效率。
在应用时,不必在图片上连续进行卷积,而是一次性对一张图片得到所有的预测结果,如果足够幸运,神经网络可以直接识别出汽车位置。
YOLO
Bounding Box预测
使用卷积实现滑动窗口时,滑动步长如果太细腻,会消耗大量的计算资源;如果粗糙,会出现如图的情况,定位框不能完全定位目标位置。YOLO算法可以得到更精准的定位框。
对于一张100*100的图片,在图像上放个网格,这里取3*3(实际中更大)。对每一个网格使用分类和定位。
对于训练标签 y y y,第一个网格中无对象,pc=0…绿色框和右边的紫色框中都有对象,类别为汽车,这时候,取两个对象的中点,将该对象分配给包含对象中点的格子(将左边的汽车类别分配给绿色框而不是右边的紫色框,将右边的车分配给黄色框),认为紫色框中无对象…
图像输出为一个 3 × 3 × 8 3×3×8 3×3×8的张量,其中 3 × 3 3×3 3×3对应网格的数量, 8 8 8对应每个网格的标签维度( 1 1 1个 p c p_c pc + 4 4 4个边界框参数 + 3 3 3个类别概率)。
交并比
对于实际大小的定位框(红色),若网络定位的定位框,想要知道这个结果是好还是坏,计算其交并比即可。
交并比函数IoU是两个边界框交集的面积与并集的面积之比,其值介于0到1之间。IoU值为0时,表示两个边界框没有任何重叠;IoU值为1时,代表两个边界框完全重合。
对于边界框 A A A和 B B B:
- 首先计算 A A A和 B B B的交集面积 S i n t e r s e c t i o n S_{intersection} Sintersection。可以通过确定两个边界框在水平和垂直方向上的重叠区域,进而计算重叠部分的面积。比如,设 A A A的左上角坐标为 ( x A 1 , y A 1 ) (x_{A1}, y_{A1}) (xA1,yA1),右下角坐标为 ( x A 2 , y A 2 ) (x_{A2}, y_{A2}) (xA2,yA2), B B B的左上角坐标为 ( x B 1 , y B 1 ) (x_{B1}, y_{B1}) (xB1,yB1),右下角坐标为 ( x B 2 , y B 2 ) (x_{B2}, y_{B2}) (xB2,yB2)。则交集的左上角坐标为 ( m a x ( x A 1 , x B 1 ) , m a x ( y A 1 , y B 1 ) ) (max(x_{A1}, x_{B1}), max(y_{A1}, y_{B1})) (max(xA1,xB1),max(yA1,yB1)),右下角坐标为 ( m i n ( x A 2 , x B 2 ) , m i n ( y A 2 , y B 2 ) ) (min(x_{A2}, x_{B2}), min(y_{A2}, y_{B2})) (min(xA2,xB2),min(yA2,yB2)) ,根据坐标计算出交集面积。
- 接着计算 A A A和 B B B的并集面积 S u n i o n S_{union} Sunion。并集面积等于 A A A的面积 S A S_A SA加上 B B B的面积 S B S_B SB减去交集面积 S i n t e r s e c t i o n S_{intersection} Sintersection,即 S u n i o n = S A + S B − S i n t e r s e c t i o n S_{union}=S_A + S_B - S_{intersection} Sunion=SA+SB−Sintersection。
- 最后,交并比 I o U = S i n t e r s e c t i o n S u n i o n IoU = \frac{S_{intersection}}{S_{union}} IoU=SunionSintersection 。
约定IOU大于等于0.5说明检测正确。
非极大值抑制
对象检测可能存在一个问题是算法可能对同一个对象做出多次检测,可以使用非极大值抑制来检测对象一次。
在19*19的网格中,车所在的网格应该是中心点所在的网格。对于左边的车,几个框会认为它的网格中也包含车。
在右图中,对于右边的车,检测出3个概率,分别是0.9,0.6,0.7。非极大值抑制算法会找出这三个中的极大值0.9并保存,然后和这个定位框交并(IOU)程度很高的其他框0.6和0.7的被抑制。接下来继续找其他的框。找到了左边的0.8和0.7,概率最高的0.8处的框被认为是一辆车,同时抑制其他的定位框0.7,最后得到两个预测结果。
Anchor Box
目前,一个格子只能输出一个对象。想要输出多个对象,需要使用Anchor Box。
在左图中,车与人的中心点几乎在同一个位置,依靠单独的 y y y标签不能同时显示二者的存在。因此可以定义两个Anchor box,其中,Anchor box1锚定人,而Anchor box2锚定车,输出标签y由原来的扩展为2倍分别表示Anchor box1和Anchor box2。
之前,训练图像中的每个目标被分配到包含该目标中点的网格单元。这种方式简单直接,仅依据目标中点的位置来确定所属网格。
使用两个Anchor box之后,训练图像中的每个目标被不仅被分配到网格中,还被分配到与该网格单元中具有最高交并比的Anchor box所在的网格单元,对象在目标标签中的编码方式为(grid cell, anchor box)。
YOLO检测
训练集中
左侧是一张被划分为 3 × 3 3\times3 3×3 网格的图像,有一辆汽车位于右下角的网格中。标注了三种目标类别,分别是 1 - pedestrian(行人)、2 - car(汽车)、3 - motorcycle(摩托车)。
定义两种Anchor box形状分别为Anchor box1(紫色框1)和Anchor box2(紫色框2),定义标签 y y y为 3 × 3 × 2 × 8 3\times3\times2\times8 3×3×2×8的张量。 2 2 2 说明每个网格有 2 个Anchors box。上半部分是Anchor box1,下半部分是2。
对于包含汽车的网格,由于该网格内有汽车目标,且汽车的中心点就在该网格,故算法认为该网格中确实包含汽车。同时计算汽车形状与两个Anchor box的交并比,锚定到交并比高的对应的Anchor box2中,所以下半部分有值。最后输出标签 y y y。
预测时
不使用非极大值抑制时,假设一张图片被YOLO划分9个网格,这9个网格经过神经网络,每一个成为 3 × 3 × 2 × 8 3\times3\times2\times8 3×3×2×8的网络,只有在绿色框中有相关的值。
运行非极大值抑制时:
首先,对于每个网格单元,得到 2 个预测的边界框。这是基于模型在每个网格中设置多个Anchor box(这里是 2 个)来预测目标边界框的结果。
其次,去除那些预测为目标的概率较低的边界框。通过设定一个概率阈值,低于该阈值的预测被认为是不可靠的,从而被剔除,以减少后续处理的冗余和错误预测。
最后,对于每个目标类别(行人、汽车、摩托车),分别使用非极大值抑制算法生成最终的预测结果。在多个重叠的预测边界框中,只保留具有最高置信度(概率)的边界框,抑制其他重叠且置信度较低的边界框。
带区域的卷积网络
使用滑动窗口实现卷积网络分类检测时,可以在中间的图看到,滑动窗口滑动到某些区域的时候,是没有检测目标的。为了减少计算量,只在少数的网格上运行卷积网络分类。可以对图像进行图像分割算法。不同颜色代表不同的分割区域。
分割算法在图中得到一些色块(右图中蓝色、绿色等色块),在这些色块上跑分类器,看看有无对象,如果没有,继续换下一个色块。