前言
本文结构:
- 目标定位
- 特征点检测
- 目标检测
- 滑动窗口的卷积实现
- bounding box预测
- 交并比
- 非极大值抑制
- anchor boxes
- yolo算法
- 候选区域
目标定位
定义:分类+定位
一个cnn网络可以用softmax输出检测的可能的结果,若想定位图片中某个物体的位置,可以让神经网络多输出几个单元,即一个边界框。具体就是让神经网络再多输出4个数字,标记为
b
x
,
b
y
,
b
h
,
b
w
b_x,b_y,b_h,b_w
bx,by,bh,bw,这四个数字是被检测对象的边界框的参数化表示。
目标标签y的定义如下:
这是一个向量,第一个组件
p
c
p_c
pc表示是否含有对象,如果对象属于前三类(行人,汽车,摩托车),则
p
c
p_c
pc=1,且
c
1
,
c
2
,
c
3
,
c
4
c_1,c_2,c_3,c_4
c1,c2,c3,c4表示该对象属于1-3类中的哪一类,且输出被检测对象的边框界参数
b
x
,
b
y
,
b
h
,
b
w
b_x,b_y,b_h,b_w
bx,by,bh,bw。如果是背景,则图片中没有要检测的对象,则
p
c
p_c
pc=0,。
特征点检测
可以通过输出图片上特征点的(x,y)坐标。
举个例子,假设正在构建一个人脸识别应用,希望算法可以给出眼角的具体位置,眼角坐标为(x,y),可以让神经网络的最后一层多输出两个数字
l
1
x
,
l
2
x
l_{1x},l_{2x}
l1x,l2x,作为眼角的坐标值。如果希望算法给出两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来表示这四个眼角,对神经网络稍做修改,输出第一个特征点
(
l
1
x
,
l
1
y
)
(l_{1x},l_{1y})
(l1x,l1y),第二个特征点
(
l
2
x
,
l
2
y
)
(l_{2x},l_{2y})
(l2x,l2y),依此类推,这四个脸部特征点的位置就可以通过神经网络输出。
目标检测
**内容:**首先用样本集训练cnn网络,再在测试图片上,选择大小事宜的窗口,合适的步行长度,从左到右、从上到下滑动。每个窗口区域都送入之前训练好的cnn进行识别判断。
举个例子:构建一个汽车检测算法,首先是标签训练集x和y来训练cnn网络,输出y,0或1表示图片中有汽车或没有汽车,然后在测试图片上选择大小事宜的窗口,合适的步行长度,从左到右、从上到下滑动,对每个窗口区域送入之前训练好的cnn来进行识别判断。以此来实现滑动窗口目标检测。如下图所示:
假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片下方这个窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。
重复上述操作,不过这次选择一个更大的窗口,截取更大的区域,并输入给卷积神经网络处理,你可以根据卷积网络对输入大小调整这个区域,然后输入给卷积网络,输出0或1。
再以某个固定步幅滑动窗口,重复以上操作,遍历整个图像,输出结果。
然后第三次重复操作,这次选用更大的窗口。
这种算法就是滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分裂,判断里面有没有汽车。
缺点:
1、计算成本大,不灵活:因为在图片中剪切出太多小方块,卷积网络要一个个地处理。如果选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能,反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
滑动窗口的卷积实现
为了构建滑动窗口的卷积应用,
步骤:
1、将全连接层转变为卷积层;
- 与上层尺寸一致的滤波算子进行卷积运算
2、使用该网络参数与结构进行运算;
举个例子:假设卷积网络经过池化层后得到一个5x5x16的图像,然后得到400个单元的全连接层,再添加一个全连接层,最后通过softmax单元输出y。对5x5x16的图像,用5x5x16的过滤器来进行卷积,输出1x1x16,假设应用400个这样的5x5x16的过滤器,则得到1x1x400的输出。
再添加另外一个卷积层,用的是400个1x1的过滤器,输出1x1x400,最后经由1x1x4过滤器处理,得到一个softmax激活值,通过卷积网络,最终得到1x1x4的输出层。
优点:
不管原始图片多大,只需要进行一次cnn正向计算,因为共享了很多重复计算,节约运算成本。
bounding box预测
有时滑动窗口不能完全涵盖目标,为了得到更精准的边界框。
目标标签y的定义如下:
解决办法:yolo算法,取两个对象的中点,然后将这个对象分配给包含对象中点的格子,所以左边的汽车就分配到这个格子上(编号4),这辆condor中点在这里,分配给这个格子(编号6)。对于这里9个格子中任何一个,你都会得到一个8维输出向量,所以目标输出尺寸是3x3x8。
yolo算法步骤:
1、首先将原始图片分割成nxn网格
2、然后利用卷积形式实现滑动窗口算法的思想,对该原始图片构建cnn网络
3、如果目标中心坐标不在当前网格内,则当前网格pc=0,否则pc=1。
交并比
为了评价对象检测算法的准确性。
交并比函数做的是计算两个边界框交集和并集之比。
一般约定0.5是阈值,用来判断预测的边界框是否正确。
非极大值抑制
为了确保你的算法对每个对象只检测一次。
这个算法这样做,首先看看每次报告每个检测结果相关的概率
p
c
p_c
pc,首先看概率最大的那个,这个例子中是0.9,然后就说这是最可靠的检测,用高亮标记,就说这里找到了一辆格子,之后,非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,输出就会被抑制。
步骤:
1、剔除pc值小于阈值的所有网格
2、选取pc值最大的网格,利用iou,摒弃与该网格交叠较大的网格
3、对剩下的网格,重复步骤2
anchor boxes
为了一个格子检测出多个对象。
假设有这样一张图片,行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中,anchor box思路是,预先定义两个不同形状的anchor box或者anchor box形状,预测结果和这两个anchor box关联起来,可能会用更多的anchor box,要5个甚至更多。所以要用的向量是重复两次的:
y
=
[
p
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
p
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
]
T
y=[p_c b_x b_y b_h b_w c_1 c_2 c_3 p_c b_x b_y b_h b_w c_1 c_2 c_3]^T
y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3]T
yolo算法
对上诉算法的整合,网格结构如下:
1、对于每个网格,得到2个预测边界框
2、剔除小概率预测网格
3、对于每个物体,使用非极大值抑制生成最终预测框
例子:训练一个算法去检测三种对象,行人、汽车、摩托车,需要显示指定完整的背景类别,这里有3个类别标签,如果要用两个anchor box,那么输出y就是3x3x2x8,其中3x3表示3x3个网络,2是anchor box数量,8是向量维度,8实际上先是5
(
p
c
b
x
b
y
b
h
b
w
)
(p_c b_x b_y b_h b_w)
(pcbxbybhbw),再加上类别的数量
(
c
1
c
2
c
3
)
(c_1 c_2 c_3)
(c1c2c3)。要构造训练集,需要遍历9个格子,然后构成对应的目标向量y。
遍历9个格子,遍历3x3网格的所有位置,得到这样一个向量,得到一个16维向量,最终输出尺寸是3x3x2x8。先遍历9个格子,遍历3x3网格的所有位置,再对每个类别单独运行非极大值抑制。
候选区域
purpose:避免对无用区域的扫描。
做法:先对原始图片进行分割算法处理,然后只对分割后的图片中的块进行目标检测。【候选区域+softmax分类】
如何选出候选区?运行图像分割算法,分为了找出可能存在对象的区域,运用分割算法得到一个色块,选择这样的边界框然后在这个色块上运行分类器,看看有没有东西。
R-CNN算法:滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。
Fast R-CNN算法:利用卷积实现滑动窗算法,得到候选区域,再将候选区域输入到训练好的网络中,得到分类结果。
Faster R-CNN算法:用卷积对图像进行分割来获得候选区域色块,进一步提高运行速度。
注:大多数Faster R-CNN算法实现还是比yolo算法慢很多。