《神经网络与深度学习》学习笔记(4)目标检测综述、YOLO、语义分割概述、FCN、风格迁移、人脸识别、视觉应用展望
目录
前言
作者目前为某高校在读研究生,本文是应《神经网络与深度学习》课程的授课教师要求撰写的课程总结,如有纰漏欢迎指正。本文内容主要是对参考文献[1]和授课教师课程PPT的归纳与分析,因此使用了上述文献的部分内容,若存在侵权恳请联系作者及时删除。
1 目标检测综述
目标检测是在给定的图片中精确找到物体所在位置,并标注出物体的类别。物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,并且物体还可以是多个类别,如图1-1 [ 2 ] ^{[2]} [2]所示。
自从2012年AlexNet被提出以来,深度学习方法的准确率逐渐超越了DPM等传统图像处理方法。随后RCNN、YOLO [ 2 ] ^{[2]} [2]等优异的基于深度学习的目标检测算法竞相出现,目标检测领域进入了快速发展阶段。目标检测发展路线如图1-2 [ 3 ] ^{[3]} [3]所示。
RCNN以及大多数传统图像处理方法均采用滑动窗口对图像进行处理,如图1-3所示。这类滑动窗口方法也存在一定的缺点。首先,当图像像素较多时,滑动次数太多,计算太慢。其次,由于目标大小不同、图片宽度和高度不相同、比例不相同等原因,每一个滑动位置需要用很多框。
根据对于上述问题的分析,可以对滑动窗口方法进行一定的改进。由于一般图片中的大多数位置都不存在目标,因此可以先确定那些更有可能出现目标的位置,再针对性地对存在目标的区域进行处理。上述方法也被称为两步法,但是经过改进滑动窗口方法依旧非常费时。此时YOLO作为一步法的代表应运而生,它能够兼顾检测的速度与正确率。
2 YOLO
2.1 YOLO概述
YOLO作为一种非常具有代表性的一步算法,也继承了其主要特点,即无需像RCNN一样生成候选框,可以直接预测得到结果。这使得YOLO具有两步法所不具备的快速性。由于YOLO所具有的优异的性能,自从其被提出以来,研究员们开发出了大量的变种,并应用到了各类领域,其主要分支见图2-1。随着版本的迭代YOLO的性能也逐渐增强。
YOLO的基本思想是将目标检测问题转化成回归和分类问题。需要将图像分成若干个网格单元(grid cell),再预测出每个网格中潜在的目标的大小和位置,最后通过非极大值抑制等方法对包围框进行筛选,网格划分及目标预测见图2-2。
YOLO存在的常见问题及解决如下。问题1:有一个框里有多个,有个多个框里有一个,怎么办?答:多个框里有一个目标,取目标中心点所在框;一个框里有多个,暂不能解决。问题2:多类目标怎么办?答:使用独热编码扩展类别数。问题3:小目标怎么办?答:使用单独网络拟合小目标,即设置多个bounding box。
YOLO的结构如图2-3
[
2
]
^{[2]}
[2]所示。网络结构包含24个卷积层和2个全连接层;其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和2个全连接层。
若对网络进行编译可以得到如图2-4所示的概略图。
YOLO的输入:YOLO v1在PASCAL VOC数据集上进行训练,因此输入图片为
448
×
448
×
3
448\times448\times3
448×448×3。实际应用中若需要使用其它尺寸,则需要resize或切割成要求尺寸。
YOLO模型处理:将图片分割为
S
2
S^{2}
S2个grid
(
S
=
7
)
(S = 7)
(S=7),每个网格单元(grid cell)的大小都是相等的,如图2-5
[
2
]
^{[2]}
[2];每个网格单元都可以检测是否包含目标;YOLO v1中,每个网格单元只能检测出一种物体(大小可以不同)。
YOLO网络输出是一个 7 × 7 × 30 7\times7\times30 7×7×30的张量。对应 7 × 7 7\times7 7×7个网格单元。每个网格单元对应2个包围框(bounding box),预测不同大小和宽高比,对应检测不同目标。每个包围框包含5个分量,分别是物体的中心位置 ( x , y ) (x, y) (x,y)和它的高 ( h ) (h) (h) 、宽 ( w ) (w) (w) ,以及这次预测的置信度 ( c ) (c) (c)。在图2-6 [ 2 ] ^{[2]} [2]中,每个框代表1个预测的包围框,框的粗细代表不同的置信度,框越粗代表置信度越高。
YOLO模型输出:在这个例子中,图片被分成了49个单元格,每个单元格预测2个包围框,因此图2-7中共包含98个包围框。
2.2 YOLO处理细节
YOLO的包围框:如上文,设共有
S
2
S^{2}
S2个网格单元,每个网格单元的包围框个数为𝐵,分类器可以识别出𝐶种不同的物体,那么所有整个ground truth的长度为
S
×
S
×
(
B
×
5
+
C
)
S\times S\times(B \times 5 + C)
S×S×(B×5+C)。YOLO v1中,这个数量是30;YOLO v2和以后版本使用了自聚类的anchor box为包围框, v2版本为
B
=
5
B = 5
B=5, YOLO v3中
B
=
9
B = 9
B=9。
归一化:四个关于位置的值,分别是
x
,
y
,
h
x, y, h
x,y,h和
w
w
w如图2-8,均为整数,实际预测中收敛慢。因此,YOLO对数据进行了归一化,使其限定在在0-1的范围内。
置信度与IOU:YOLO置信度计算公式见式
C
=
P
r
(
o
b
j
)
∗
I
O
U
t
r
u
t
h
p
r
e
d
(2.1)
C = Pr(obj) * IOU^{pred}_{truth} \tag{2.1}
C=Pr(obj)∗IOUtruthpred(2.1)其中,
P
r
(
o
b
j
)
Pr(obj)
Pr(obj)是一个网格单元存在物体的概率;
I
O
U
t
r
u
t
h
p
r
e
d
IOU^{pred}_{truth}
IOUtruthpred是预测的包围框和真实物体位置包围框的交集面积与并集面积之比,示意图如图2-9。
训练值(ground truth):
P
r
(
o
b
j
)
Pr(obj)
Pr(obj)的ground truth如下图所示,其中,三个目标中点对应格子为1;其它为0。
YOLO的训练数据与网络输出结构如图2-11所示。
2.3 YOLO损失函数
YOLO的损失函数见式(2.2)
L
=
λ
c
o
o
r
d
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
o
b
j
[
(
x
i
−
x
^
i
)
2
+
(
y
i
−
y
^
i
)
2
]
边界框中心点的损失
+
λ
c
o
o
r
d
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
o
b
j
[
(
w
i
−
w
^
i
)
2
+
(
h
i
−
h
^
i
)
2
]
边界框宽高损失
+
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
o
b
j
(
C
i
−
C
i
^
)
2
置信度损失(包括物体)
+
λ
n
o
o
b
j
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
n
o
o
b
j
(
C
i
−
C
i
^
)
2
置信度损失(不包括物体)
+
∑
i
=
0
S
2
1
i
o
b
j
∑
c
∈
c
l
a
s
s
e
s
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
类别损失
(2.2)
\begin{aligned} L = {\lambda_{coord}}& {\sum_{i=0}^{S^{2}}{\sum_{j=0}^{B}{\mathbb{1}^{obj}_{ij}\big[(x_{i}-\hat{x}_{i})^{2}+(y_{i}-\hat{y}_i)^{2}\big]}}}\textbf{\textcolor{red}{边界框中心点的损失}}\\ +{\lambda_{coord}}& {\sum_{i=0}^{S^{2}}{\sum_{j=0}^{B}{\mathbb{1}^{obj}_{ij} \Bigg[\Big(\sqrt{w_i}-\sqrt{\hat{w}_i}\Big)^{2} + \bigg(\sqrt{h_i}-\sqrt{\hat{h}_i}\bigg)^{2}\Bigg]}}}\textbf{\textcolor{orange}{边界框宽高损失}}\\ +& {\sum_{i=0}^{S^{2}}{\sum_{j=0}^{B}{\mathbb{1}^{obj}_{ij}}\Big({C_{i}}-\hat{C_{i}}\Big)^2}}\textbf{\textcolor{blue}{置信度损失(包括物体)}}\\ +{\lambda_{noobj}}&{\sum_{i=0}^{S^{2}}{\sum_{j=0}^{B}{\mathbb{1}^{noobj}_{ij}}\Big({C_{i}}-\hat{C_{i}}\Big)^2}}\textbf{\textcolor{green}{置信度损失(不包括物体)}}\\ +&\sum_{i=0}^{S^2}{\mathbb{1}^{obj}_{i}{\sum_{c\in classes}{\big(p_i(c)-\hat{p}_i(c)\big)^{2}}}}\textbf{\textcolor{purple}{类别损失}}\\ \end{aligned} \tag{2.2}
L=λcoord+λcoord++λnoobj+i=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]边界框中心点的损失i=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]边界框宽高损失i=0∑S2j=0∑B1ijobj(Ci−Ci^)2置信度损失(包括物体)i=0∑S2j=0∑B1ijnoobj(Ci−Ci^)2置信度损失(不包括物体)i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2类别损失(2.2)其中,
1
i
j
o
b
j
\mathbb{1}^{obj}_{ij}
1ijobj代表当前网格单元中有无物体,有则为1,无则为0;第2项要开根号是为了让误差更显著,保证回归精度;在文献[2]中,
λ
c
o
o
r
d
=
5
\lambda_{coord} = 5
λcoord=5,
λ
n
o
o
b
j
=
0.5
\lambda_{noobj} = 0.5
λnoobj=0.5,是为了平衡正负样本。
2.4 YOLO非极大值抑制
如图2-12,YOLO直接输出的张量中保留了过多的边界框,即预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,如何解决个问题呢?解决这个问题的方法就是非极大值抑制(NMS)。
非极大值抑制的核心思想是,选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。算法的要点有:
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对于剩余的边界框;
- 选择具有最高概率的边界框并将其作为输出预测;
- 计算 “作为输出预测的边界框”,与其他边界框的相关联IoU值;舍去IoU大于阈值的边界框;其实就是舍弃与“作为输出预测的边界框” 很相近的框框;
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃。
2.5 YOLO训练
YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测。训练中采用了drop out和数据增强来防止过拟合。YOLO的最后一层采用线性激活函数(因为要回归边界框位置),其它层都是采用Leaky ReLU激活函数,见式(2.3)。
ϕ
(
x
)
=
{
x
,
i
f
x
>
0
0.1
x
,
o
t
h
e
r
w
i
s
e
(2.3)
\phi(x) = \begin{cases} x &,{\rm{if}}{\ }x>0\\ 0.1x &,\rm{otherwise}\\ \end{cases} \tag{2.3}
ϕ(x)={x0.1x,if x>0,otherwise(2.3)
3 语义分割概述
语义分割是为了找到同一画面中的不同类型目标区域。图像检测任务通常被分为:目标检测、语义分割、实例分割等,示意图如图3-1所示。
其中区别在于,目标检测任务希望通过矩形框大致标记出物体在图像中所在位置;语义分割则是需要将图像根据目标物体的类别划分成不同的区域,但是不区分相同类别的不同物体;实例分割则是在语义分割的基础上进一步区分属于同一类别的不同物体。
传统的滑动窗口算法由于滑动次数太多,因此计算太慢、重复计算太多,目前逐渐被语义分割等算法所取代。语义分割等算法的目标是对图中每一个像素进行分类,并得到对应标签,如图3-2所示。
在近十年中图像分割算法取得了飞速的发展,期间涌现出了众多性能优异的网络,发展时间线如图3-3所示。在2014年Jonathan Long等人
其中,在2014年Jonathan Long等人提出了首个端对端的针对像素级预测的全卷积网络(Fully Convolutional Networks, FCN),其基本结构如图3-4
[
4
]
^{[4]}
[4]所示。在当年和其它方法相比,其具有突出的性能。
4 FCN
4.1 FCN网络结构
FCN的具体结构如图4-1所示。其网络结构分为两个部分:全卷积部分和反卷积部分。全卷积部分借用了一些经典的CNN网络,并把最后的全连接层换成卷积,用于提取特征,形成热点图;反卷积部分则是将小尺寸的热点图上采样得到原尺寸的语义分割图像。
4.2 FCN相关基本概念
与传统卷积神经网络相比FCN增加了
1
×
1
1\times1
1×1卷积、反池化和反卷积的概念。
1
×
1
1\times1
1×1卷积的主要作用是调整张量的维数、尺寸,其工作原理如图4-2所示。
反池化(上池化)、反卷积可以看作是池化、卷积的逆运算,其中反池化的工作原理如图4-3所示。
4.3 FCN具体实现
从上文中,我们了解到FCN网络结构分为全卷积部分和反卷积部分。其中全卷积部分与传统的神经网络类似,结构如图4-4所示。
而反卷积部分则采用了如图4-5所示的跳级结构。
根据上述基本结构,可以构造出如下FCN网络。
上述网络训练完成后可以预测出与图4-9类似的结果。
4.4 FCN评价指标
FCN常用的评价指标如下:
全局精度(Global Accuracy)
∑
i
n
i
i
∑
i
t
i
(4.1)
\frac{\sum_i{n_{ii}}}{\sum_i{t_{i}}} \tag{4.1}
∑iti∑inii(4.1)平均精度(Mean Accuracy)
1
n
c
l
s
⋅
∑
i
n
i
i
t
i
(4.2)
\frac{1}{n_{cls}} \cdot \sum_i{\frac{n_{ii}}{t_i}} \tag{4.2}
ncls1⋅i∑tinii(4.2)平均交并比(Mean IOU)
1
n
c
l
s
⋅
∑
i
n
i
i
t
i
+
∑
j
n
i
j
−
n
i
i
(4.3)
\frac{1}{n_{cls}} \cdot \sum_i{\frac{n_{ii}}{{t_i} + \sum_j{n_{ij}} - n_{ii}}} \tag{4.3}
ncls1⋅i∑ti+∑jnij−niinii(4.3)其中,
n
i
j
n_{ij}
nij表示类别i被预测成类别j的像素个数;
n
c
l
s
n_{cls}
ncls表示目标类别个数(包含背景);
t
i
=
∑
j
n
i
j
t_i=\sum_j{n_{ij}}
ti=∑jnij表示目标类别i的总像素个数(真实标签)。
4.5 FCN标注工具
Labelme是一款常见的可以用于语义分割数据集制作的标注工具,其基本界面如图4-10所示,网址为https://github.com/wkentaro/labelme。
EISeg也是一款常用的标注工具,其基本界面如图4-11所示,网址为https://github.com/PaddlePaddle/PaddleSeg。
5 风格迁移
风格迁移是指将一张图像的风格应用在另一张图像之上,如图5-1
[
1
]
^{[1]}
[1]所示。因此需要两张输入图像,一张风格图像(Style image),一张内容图像(Content image),输出为合成图像(Synthesized image)。 我们将使用神经网络修改内容图像,使得其在风格上接近风格图像。
风格迁移的实现如图5-2
[
1
]
^{[1]}
[1]所示。首先,需要初始化合成图像,例如初始化为内容图像。 该合成图像是风格迁移过程中唯一需要更新的变量,即迭代所需的模型参数。 其次,需要选用一个预训练网络来抽取图像的特征,即无须在训练中更新模型参数。 这个深度卷积神经网络凭借多层逐级抽取图像的特征,可以选取其中指定层的输出作为内容特征或风格特征。如下图所示,这里选取的预训练的神经网络共含有3层卷积层,其中第二层输出内容特征,第一层和第三层输出风格特征。
与常规的神经网络类似,需要首先通过前向传播计算风格迁移的损失函数,再通过反向传播迭代更新模型参数。其中常用的损失函数由内容损失、样式损失、总变差损失这三部分组成。最后,当模型训练结束时,我们输出风格迁移的模型参数,即得到最终的合成图像。
内容损失与线性回归中的损失函数类似,内容损失通过平方误差函数衡量合成图像与内容图像在内容特征上的差异。平方误差函数的两个输入均为extract_features函数计算所得到的内容层的输出。
def content_loss(Y_hat, Y):
return F.mse_loss(Y_hat, Y)
样式损失也一样通过平方误差函数衡量合成图像与样式图像在样式上的差异。
def gram(X):
num_channels, n = X.shape[1], X.shape[2] * X.shape[3]
X = X.view(num_channels, n)
return torch.matmul(X, X.t()) / (num_channels * n)
总变差损失:由于有时我们学到的合成图像里面可能带有大量高频噪点,即有特别亮或者特别暗的颗粒像素。一种常用的降噪方法是总变差降噪(total variation denoising)。假设 表示坐标为
(
i
,
j
)
(i,j)
(i,j)的像素值,降低总变差损失如式(5.1)所示。
∑
i
,
j
∣
x
i
,
j
−
x
i
+
1
,
j
∣
+
∣
x
i
,
j
−
x
i
,
j
+
1
∣
(5.1)
\sum_{i, j}|x_{i, j}-x_{i+1,j}|+|x_{i, j}-x_{i,j+1}|\tag{5.1}
i,j∑∣xi,j−xi+1,j∣+∣xi,j−xi,j+1∣(5.1)
def tv_loss(Y_hat):
return 0.5 * (F.l1_loss(Y_hat[:, :, 1:, :],
Y_hat[:, :, :-1, :]) +
F.l1_loss(Y_hat[:, :, :, 1:],
Y_hat[:, :, :, :-1]))
总的样式迁移的损失函数即内容损失、样式损失和总变差损失的加权和。通过调节这些权值超参数,我们可以权衡合成图像在保留内容、迁移样式以及降噪三方面的相对重要性。
content_weight, style_weight, tv_weight = 1, 1e3, 10
def compute_loss(X, contents_Y_hat, styles_Y_hat, contents_Y, styles_Y_gram):
# 分别计算内容损失、风格损失和全变分损失
contents_l = [content_loss(Y_hat, Y) * content_weight for Y_hat, Y in zip(
contents_Y_hat, contents_Y)]
styles_l = [style_loss(Y_hat, Y) * style_weight for Y_hat, Y in zip(
styles_Y_hat, styles_Y_gram)]
tv_l = tv_loss(X) * tv_weight
# 对所有损失求和
l = sum(10 * styles_l + contents_l + [tv_l])
return contents_l, styles_l, tv_l, l
小结:样式迁移常用的损失函数由3部分组成:内容损失使合成图像与内容图像在内容特征上接近,样式损失令合成图像与样式图像在样式特征上接近,而总变差损失则有助于减少合成图像中的噪点。可以通过预训练的卷积神经网络来抽取图像的特征,并通过最小化损失函数来不断更新合成图像。用格拉姆矩阵表达样式层输出的样式。
6 人脸识别
最早的人脸识别网络结构如下,在人脸验证任务中需要将输入图像与数据库中的照片逐一验证。
上述传统人脸检测算法具有一次性学习(One-Shot Learning)的局限性。因此Siamese网络应运而生,双输入Siamese网络结构如图6-2所示。
其中,定义相似度函数为:
d
(
X
1
,
X
2
)
=
∣
∣
f
(
X
1
)
−
f
(
X
2
)
∣
∣
2
2
(6.1)
d(X_1, X_2)=||f(X_1)-f(X_2)||_2^2 \tag{6.1}
d(X1,X2)=∣∣f(X1)−f(X2)∣∣22(6.1)输出Softmax神经元为:
y
^
=
σ
(
∑
k
=
1
128
w
i
∣
f
(
x
(
i
)
)
k
−
f
(
x
(
j
)
)
k
∣
+
b
)
(6.2)
\hat{y} = \sigma\Bigg({\sum_{k=1}^{128}{w_i\Big|{f(x^{(i)})_k-f(x^{(j)})_k}\Big|+b}}\Bigg) \tag{6.2}
y^=σ(k=1∑128wi
f(x(i))k−f(x(j))k
+b)(6.2)也可采用均方形式。
训练目的:通过训练神经网络,我们希望同一人的两张照片间的相似度函数值尽可能小,不同人的两张片间的相似度函数值尽可能大,下以此为目标制作训练集、定义Loss函数如下:
L
o
s
s
(
A
,
P
,
N
)
=
max
(
∥
f
(
A
)
−
f
(
P
)
∥
2
2
−
∥
f
(
A
)
−
f
(
N
)
∥
2
2
+
α
,
0
)
(6.3)
Loss(A, P, N) = \max{(\Vert {f(A) -f(P)}\Vert_2^2-\Vert {f(A) -f(N)}\Vert_2^2+\alpha,0)} \tag{6.3}
Loss(A,P,N)=max(∥f(A)−f(P)∥22−∥f(A)−f(N)∥22+α,0)(6.3)其中,A表示待测照片;P表示同一照片;N表示不同照片。
定义代价函数如下:
J
=
∑
i
=
1
m
L
(
A
(
i
)
,
P
(
i
)
,
N
(
i
)
)
(6.4)
J = \sum_{i=1}^m{L(A^{(i)},P^{(i)},N^{(i)})} \tag{6.4}
J=i=1∑mL(A(i),P(i),N(i))(6.4)
最后,利用人脸验证实现人脸识别。对于训练完毕的神经网络,输入照片,通过简单的for循环语句遍历数据库中存储的所有照片,依次通过相似度函数进行计算,记录遍历过程中相似程度最大的值,在遍历结束后与预先设定的阈值进行比较,得出预测结果,完成人脸识别。
7 视觉应用展望
目前,ChatGPT、AI绘画等生成式人工智能应用爆火,成为了舆论焦点。生成式人工智能也逐渐成为了热门研究方向。
生成对抗网络(GANs, Generative Adversarial Networks)是由Ian Goodfellow等人在2014年的Generative Adversarial Networks一文中提出的。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。生成对抗网络的整体结构如图7-1所示。
生成对抗网络(GAN)的初始原理十分容易理解,即构造两个神经网络,一个生成器,一个鉴别器,二者互相竞争训练,最后达到一种平衡(纳什平衡)。GAN 启发自博弈论中的二人零和博弈,GAN 模型中的两位博弈方分别由生成式模型(Generativemodel,G)和判别式模型(Discriminative model,D)充当。其中生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个类似真实训练数据的样本,追求效果是越像真实样本越好;判别模型 D 是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D 输出大概率,否则,D 输出小概率。
生成对抗网络生成的人脸的效果如图7-2所示:
参考文献
[1] 阿斯顿·张.动手学深度学习[M].北京:人民邮电出版社,2023:85-389.
[2] Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[A]. IEEE. 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)[C]. Piscataway: IEEE, 2016:779-788.
[3] Zou Z, Shi Z, Guo Y, et al. Object Detection in 20 Years: A Survey[J/OL]. https://ui.adsabs.harvard.edu/abs/2019arXiv190505055Z, 2019-05-16.
[4] Long, Jonathan, Shelhamer, et al. Fully Convolutional Networks for Semantic Segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017.