文章目录
机器学习、深度学习、相关论文
目标定位(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)=(ypre1−y1)2+(ypre2−y2)2...+(ypre8−y8)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
<
=
0.6
p_c<=0.6
pc<=0.6
然后while循环操作:
- 选择最大的概率 p c p_c pc检测
- 抛弃与最大概率的检测
l
o
U
>
=
0.5
loU>=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。
训练算法如下:
- 将图像切分为3x3x2x8的训练结果集
- 预测
- 非极大值抑制
关于算法的详细实现,将有一个课后练习来实践一下。
候选区域
这里涉及对象检测的另一类算法,通过图像分割算法分割不同色块,对色块进行对象检测。R-CNN、Fast R-CNN先选出带区域的卷积网络,不再对所有的滑动窗运行检测算法。