神经网络与深度学习——笔记4
一、目标检测——YOLO算法
1.YOLOv1实现思想
YOLO的实现思想是将整个图片输入网络,在输出层对边缘框和所属类别进行回归,即将目标定位与目标类别预测在一个神经网络中实现。
2.YOLOv1网络结构
YOLOv1的网络结构如图1-1所示[1],输入图像大小为 48 × 48 × 3 48 \times 48 \times 3 48×48×3,经过24个卷积层和2个全连接层(第一个全连接层4096个输出,第二个全连接层1470个输出)后再reshape得到网络的输出为 7 × 7 × 30 7 \times 7 \times 30 7×7×30的特征图,最后经过识别过程得到检测结果,其中卷积层包含 1 × 1 1 \times 1 1×1和 3 × 3 3 \times 3 3×3两种卷积核。
具体实现方式为:
(1) 首先将图像分割为
S
×
S
S \times S
S×S个网格(Grid Cell),若某个对象的中心在这个网格中,则该网格用来预测这个对象,每个网格只能预测一个对象,故对象类别数最多为
S
×
S
S \times S
S×S个,YOLOv1中
S
=
7
S=7
S=7。
(2) 每个网格需要预测 B B B个边缘框(Bounding Box),每个边缘框包含5个元素 ( x , y , w , h , c ) T {\left( {x,y,w,h,c} \right)^T} (x,y,w,h,c)T,前四个为待回归的框的位置,第五个用来衡量所预测边缘框中含有对象的置信度,同时为了区分多类对象,通过类别条件概率衡量边缘框所包含对象属于每个类别 C i C_i Ci的概率。YOLOv1中 B = 2 B=2 B=2,使用的数据集为Pascal VOC有20类对象,每个网格只有一组类别条件概率,故属于同一个网格的的 B B B个边缘框具有相同的类别条件概率,故最终网络的输出为 S × S × ( B × 2 + C ) = 7 × 7 × ( 5 × 2 + 20 ) S \times S\times (B \times 2 + C)=7 \times 7 \times (5 \times 2 + 20) S×S×(B×2+C)=7×7×(5×2+20)的特征图。
(3)通过非极大值抑制(NMS)去除多余的边缘框,得到最终的检测结果。
3.YOLOv1实现细节
训练阶段
(1)归一化
在边缘框回归的
x
,
y
,
w
,
h
x,y,w,h
x,y,w,h均为归一化后的结果,其中
x
,
y
x,y
x,y为边缘框的中心相对于对应的网格边界的偏移量,如图1-2所示假定每个网格的长度为
L
L
L,预测的边缘框中心坐标为
(
x
c
,
y
c
)
({x_c},{y_c})
(xc,yc),所在网格左上角坐标为
(
x
a
,
y
a
)
({x_a},{y_a})
(xa,ya),则归一化后的坐标为
(
x
c
−
x
a
L
,
y
c
−
y
a
L
)
( {{{x_c} - {x_a}} \over L},{{{y_c} - {y_a}} \over L})
(Lxc−xa,Lyc−ya);
w
,
h
w,h
w,h为边缘框相对于整个图片的比例,假定边缘框的宽高分别为
w
i
,
h
i
w_i,h_i
wi,hi,图片大小为
M
×
M
M \times M
M×M则归一化后的边缘框宽和高分别为
w
=
w
i
M
,
h
=
h
i
M
w = {{{w_i}} \over M},h = {{{h_i}} \over M}
w=Mwi,h=Mhi
(2)相关概率计算
单个边缘框所含对象的置信度
c
=
Pr
(
O
b
j
e
c
t
)
×
I
O
U
p
r
e
d
t
r
u
t
h
c = \Pr (Object) \times IO{U_{pred}^{truth}}
c=Pr(Object)×IOUpredtruth当某个对象的中心落在一个网格中,则该网格的
P
r
(
O
b
j
e
c
t
)
=
1
Pr (Object)=1
Pr(Object)=1,否则为0;第二项
I
O
U
p
r
e
d
t
r
u
t
h
IO{U_{pred}^{truth}}
IOUpredtruth为预测边缘框与标注的边缘框之间的交并比。
类别条件概率 Pr ( C l a s s i ∣ O b j e c t ) \Pr (Clas{s_i}|Object) Pr(Classi∣Object)即为边缘框中对象属于某类的概率,属于同一个网格的边缘框该值相等。
(3)损失函数计算
损失函数的计算如图1-3所示,主要由三项构成即坐标损失,置信度损失,分类损失。
1)坐标损失为预测的边缘框与标注的边缘框之间的偏差,
1
i
j
o
b
j
{1^{obj}_{ij}}
1ijobj表示第
i
i
i个网格中的
j
j
j个预测边缘框是否对该对象负责,即当标注的中心点位于某网格内且属于该网格的某预测的边缘框与标注的边缘框之间
I
O
U
IOU
IOU值为所在网格边缘框中最大时取
1
i
j
o
b
j
=
1
{1^{obj}_{ij}}=1
1ijobj=1,否则为0(即若标注框中心点位于该网格内,使与标注框的交并比大的预测框参与坐标损失训练,另一个预测框不参与坐标损失训练;若无标注框中心点位于该网格类,该网格的两个预测框均不参与坐标损失训练)。
2)置信度损失的求解既包含了预测边缘框包含对象时的置信度偏差也包含了预测边缘框不包含对象(包括标注框中心位于该网格内时与标注框 I O U IOU IOU值较小的边缘框与无标注框中心位于该网格内时该网格所对的两个边缘框)时的偏差。当网格 i i i中的第 j j j个预测框对该对象负责时( 1 i j o b j = 1 {1^{obj}_{ij}}=1 1ijobj=1),用上面的置信度损失,而不对该对象负责时( 1 i j n o o b j = 1 {1^{noobj}_{ij}}=1 1ijnoobj=1),用下面的置信度损失;其中 C i C_i Ci为标签值,该边缘框对对象负责时 C i = 1 C_i=1 Ci=1,否则 C i = 0 C_i=0 Ci=0, C ^ i \hat C_i C^i为网络输出的该边缘框的置信度。
3)分类损失为预测的分类概率与标签值的偏差。当标注框中心位于网格内,该网格会有一个对应的类别 c c c,有标签值 p i ( c ) = 1 {p_i}(c) = 1 pi(c)=1,对其余类别 p i ( c ) = 0 {p_i}(c) = 0 pi(c)=0, p ^ i ( c ) {\hat p_i}(c) p^i(c)为网络输出的分类概率;其中 1 i o b j {1^{obj}_{i}} 1iobj表示有无标注框中心点位于网格 i i i中,若有则 1 i o b j = 1 {1^{obj}_{i}}=1 1iobj=1否则为0。
损失函数中 λ c o o r d {\lambda _{coord}} λcoord与 λ n o o b j {\lambda _{noobj}} λnoobj两个系数用来控制权重。通常来说对于对对象负责的边缘框(参与回归的边缘框)应给予较大权重 λ c o o r d {\lambda _{coord}} λcoord,同时对于那些不对对象负责的边缘框不应该抛弃,应赋予一个较少的权重 λ n o o b j {\lambda _{noobj}} λnoobj,YOLOv1中两者取值分别为5和0.5;对 w i w_i wi和 h i h_i hi开根号为了平衡大框和小框对损失函数的影响。
预测阶段
(4)非极大值抑制
将每个边缘框所对的类别条件概率与每个边缘框所含对象置信度相乘得到分类置信度分数(Class Specific Confidence Score)即
Pr
(
C
l
a
s
s
i
∣
O
b
j
e
c
t
)
×
Pr
(
O
b
j
e
c
t
)
×
I
O
U
p
r
e
d
t
r
u
t
h
\Pr (Clas{s_i}|Object)\times\Pr (Object) \times IO{U_{pred}^{truth}}
Pr(Classi∣Object)×Pr(Object)×IOUpredtruth最终得到
7
×
7
×
2
=
98
7 \times 7 \times 2=98
7×7×2=98组分数(对应98个边缘框),每组分数中有20个分数对应不同对象,即每行为不同边缘框对于某对象的得分,如图1-4所示
首先处理第一类对象的边缘框,通过设定阈值,将得分低于阈值的边缘框的分数置为0(即排除一些明显不可能的框),然后将处理后的结果按得分进行降序排列,接下来进行非极大值抑制,如图1-5所示:
1)选择得分最高的为某对象的边缘框预测记为 b b ∗ bb^* bb∗,但同时需要抑制其它与 b b ∗ bb^* bb∗靠的较近的边缘框(将其分数置为0)。将该行得分次大的边缘框与 b b ∗ bb^* bb∗计算 I O U IOU IOU值,若结果大于阈值(如0.5)将该边缘框分数置为0。同样的方法处理其余得分大于0且小于最高得分的边缘框,直到处理完毕该行其余所有边缘框。如图1-6所示,经过该步骤的处理 b b 1 , b b 2 bb1,bb2 bb1,bb2得到抑制,但有些边缘框与 b b ∗ bb^* bb∗的 I O U IOU IOU值小于阈值,这些框没有得到抑制(如 b b 3 , b b 4 bb3,bb4 bb3,bb4),需要进一步处理。
2)将经过1)处理后的分数中次大的作为
b
b
∗
bb^*
bb∗,然后按照1)中的方法继续处理,得到新的分数序列。
b
b
3
,
b
b
4
bb3,bb4
bb3,bb4仍然需要抑制,此时相当于利用
b
b
3
bb3
bb3抑制
b
b
4
bb4
bb4。
3)重复2)直到没有可抑制的边缘框。
4)处理第二类对象的边缘框
…
\dots
…
5)在每个边缘框
b
b
i
bb_i
bbi所对的
20
×
1
20\times1
20×1张量中,找出得分最高(>0)的的所对的索引,确定对象类别,绘制相应的边缘框;如果最高得分为0,则舍弃该边缘框。
二、语义分割——FCN法
1.反卷积与反池化
反卷积与反池化是常见的上采样方式
反卷积可以增大输入高宽,常用于语义分割中。对于一个卷积核大小为
K
×
K
K \times K
K×K填充为
P
P
P,步长为
S
S
S的反卷积,具体步骤如下:
(1)在行列之间插入
S
−
1
S-1
S−1行和列的0
(2)输入图像填充
K
−
P
−
1
K-P-1
K−P−1(填充0)
(3)将卷积核上下左右翻转
(4)用变换后的卷积核做正常卷积(
S
=
1
S=1
S=1,
P
=
0
P=0
P=0)
例如对于一个
2
×
2
2 \times 2
2×2的输入图像,卷积核大小为
2
×
2
2 \times 2
2×2,且
P
=
0
P=0
P=0,
S
=
2
S=2
S=2,具体实现步骤如图2-1所示,其中插入的列和行为黑色值所示,填充为红色所示。
反池化是池化的逆操作,池化保留了主要信息,要想通过反池化恢复全部信息只能通过补位来最大程度还原信息,常用的反池化方式主要有反最大池化和反平均池化,具体实现如图2-2所示。
2.全卷积网络(FCN)
FCN的主要思路是将传统的CNN中的全连接层换成卷积层,最终得到二维的热图(heatmap),然后通过上采样(反卷积)将图像恢复至原大小,后接Softmax获得每个像素点的分类信息,具体示意图如图2-3所示。
对原图像进行卷积conv1、pool1后原图像缩小为1/2;之后对图像进行第二次conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的特征图;接着继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的特征图;最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7(通常用
1
×
1
1\times1
1×1的卷积将通道数变为类别数),卷积后图像大小依然为原图的1/32。此时有多种选择方案:
(1)可以直接对conv7后的1/32热图进行32倍上采样将图像大小恢复为原图大小,得到 N N N张图片( N N N为包含背景类的物体类别数),故每个像素有 N N N个参数,对这些参数做Softmax预测,可以得到每个像素的预测类别,该方法即为FCN-32s。
(2)也可以对conv7后的1/32热图进行2倍上采样得到1/16的特征图,与conv4、pool4后的1/16特征图进行叠加(通道数不同需要采用 1 × 1 1\times1 1×1将通道数变为 N N N),对叠加后的特征图进行16倍上采样恢复至原图大小,再对每个像素进行Softmax预测,该方式为FCN-16s。
(3)也可以对(2)中叠加后的特征图先进行2倍上采样得到为原图大小1/8的特征图,接着与conv3、pool3后的特征图进行叠加(通道数不同需要采用 1 × 1 1\times1 1×1将通道数变为 N N N),再对叠加后的特征图进行8倍上采样恢复至原图大小,同样对每个像素进行Softmax预测,该方式为FCN-8s。
由于FCN-8s进行了更多次的特征融合,所以分割的准确率最高,其次是FCN-16s,FCN-32只利用了conv5中卷积核提取的特征,故准确率最低,图2-4为不同方式的分割效果。
三、风格迁移
1.实现思路
首先初始化待合成的图像(可用随机噪声初始化),采用一个训练好的神经网络用于提取内容图像、风格图像、合成图像的特征,该神经网络参数在训练过程中不需要更新,待更新参数为待合成图像,如图3-1所示,含三个卷积层的神经网络,可以选择其中的某些层为的输出作为内容特征或风格特征,图中选择一、三层的输出为风格特征,第二层的输出为内容特征,并计算前向传播中(实线箭头)相应的内容损失和样式损失,再通过反向传播(虚线箭头)更新参数。
2.损失函数定义
内容代价函数
J
c
o
n
t
e
n
t
(
C
,
G
)
=
∥
a
[
l
]
(
C
)
−
a
[
l
]
(
G
)
∥
2
2
{J_{content}}(C,G) = {\left\| {{a^{[l](C)}} - {a^{[l](G)}}} \right\|_2^2}
Jcontent(C,G)=
a[l](C)−a[l](G)
22其中
a
[
l
]
(
C
)
{a^{[l](C)}}
a[l](C)为内容图像在神经网络
l
l
l层的输出,
a
[
l
]
(
G
)
{a^{[l](G)}}
a[l](G)为合成图像在神经网络
l
l
l层的输出。
风格代价函数
J
s
t
y
l
e
(
S
,
G
)
=
∑
l
λ
[
l
]
J
s
t
y
l
e
[
l
]
(
S
,
G
)
=
1
(
2
n
h
[
l
]
n
w
[
l
]
n
c
[
l
]
)
2
∑
k
∑
k
′
(
G
k
k
′
[
l
]
(
S
)
−
G
k
k
′
[
l
]
(
G
)
)
{J_{style}}(S,G) = \sum\limits_l {{\lambda ^{[l]}}{J_{style}^{[l]}}(S,G)}= {1 \over {{{(2{n_h^{[l]}}{n_w^{[l]}}{n_c^{[l]}})}^2}}}\sum\limits_k {\sum\limits_{{k{'}}} {({G_{k{k^{'}}}^{[l](S)}} - } } {G_{k{k^{'}}}^{[l](G)}})
Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)=(2nh[l]nw[l]nc[l])21k∑k′∑(Gkk′[l](S)−Gkk′[l](G))
其中
n
h
[
l
]
n_h^{[l]}
nh[l]、
n
w
[
l
]
n_w^{[l]}
nw[l]、
n
c
[
l
]
n_c^{[l]}
nc[l]分别为神经网络第
l
l
l层特征图的高宽及通道数,
G
k
k
′
[
l
]
(
S
)
G_{k{k^{'}}}^{[l](S)}
Gkk′[l](S)、
G
k
k
′
[
l
]
(
G
)
G_{k{k^{'}}}^{[l](G)}
Gkk′[l](G)分别表示内容图像和合成图像在神经网络第
l
l
l层的特征图
k
k
k和
k
′
k{'}
k′通道间的相关性,且有
G
k
k
′
[
l
]
(
X
)
=
∑
i
=
1
n
h
[
l
]
∑
j
=
1
n
w
[
l
]
(
a
i
,
j
,
k
[
l
]
(
X
)
⋅
a
i
,
j
,
k
′
[
l
]
(
X
)
)
{G_{kk'}}^{[l](X)} = \sum\limits_{i = 1}^{{n_h^{[l]}}} {\sum\limits_{j = 1}^{{n_w^{[l]}}} {({a_{i,j,k}^{[l](X)}} \cdot } } {a_{i,j,k'}^{[l](X)}})
Gkk′[l](X)=i=1∑nh[l]j=1∑nw[l](ai,j,k[l](X)⋅ai,j,k′[l](X))
即第
l
l
l层通道
k
k
k与通道
k
′
k{'}
k′特征图之间对应元素相乘后再相加。总的代价函数为
J
(
G
)
=
α
J
c
o
n
t
e
n
t
(
G
)
+
β
J
s
t
y
l
e
(
G
)
J(G) = \alpha {J_{content}}(G) + \beta {J_{style}}(G)
J(G)=αJcontent(G)+βJstyle(G)
α
\alpha
α、
β
\beta
β为权重系数。
四、人脸识别
1.实现思路
将原有多分类问题转化为二分类问题,具体来说需要训练一个神经网络,对于输入的图片得到一个相应输出(不是Softmax的分类结果) f ^ ( A ) \hat f(A) f^(A),同时数据库中有多个待比对人脸(预存人脸),其输出可以预先通过训练好的网络得到 f ( i ) ( A ) f ^{(i)} (A) f(i)(A),通过计算 f ^ ( A ) \hat f(A) f^(A)与每个 f ( i ) ( A ) f ^{(i)} (A) f(i)(A)的相似度函数,记录遍历过程中相似程度最大的值,在遍历结束后与预先设定的阈值进行比较,得出预测结果,完成人脸识别。
2.损失函数定义
希望同一个人的两张照片间相似度函数值尽可能小,不同人之间的两张图片间相似度函数值尽可能大。即对于待检测照片
A
(
i
)
A^{(i)}
A(i),正样本
P
(
i
)
P^{(i)}
P(i),负样本
N
(
i
)
N^{(i)}
N(i)间的关系为:
∥
f
(
A
(
i
)
)
−
f
(
P
(
i
)
)
∥
2
2
−
∥
f
(
A
(
i
)
)
−
f
(
N
(
i
)
)
∥
2
2
≤
0
{\left\| {f(A^{(i)}) - f(P^{(i)})} \right\|_2^2} - {\left\| {f(A^{(i)}) - f(N^{(i)})} \right\|_2 ^2}\le 0
f(A(i))−f(P(i))
22−
f(A(i))−f(N(i))
22≤0
⇒
∥
f
(
A
(
i
)
)
−
f
(
P
(
i
)
)
∥
2
2
−
∥
f
(
A
(
i
)
)
−
f
(
N
(
i
)
)
∥
2
2
+
α
≤
0
,
α
≥
0
⇒
L
(
A
(
i
)
,
P
(
i
)
,
N
(
i
)
)
=
max
(
∥
f
(
A
(
i
)
)
−
f
(
P
(
i
)
)
∥
2
2
−
∥
f
(
A
(
i
)
)
−
f
(
N
(
i
)
)
∥
2
2
+
α
,
0
)
⇒
J
(
A
,
P
,
N
)
=
∑
i
=
1
m
L
(
A
(
i
)
,
P
(
i
)
,
N
(
i
)
)
\begin{gather*} \begin{array}{l} \Rightarrow {\left\| {f(A^{(i)}) - f(P^{(i)})} \right\|_2 ^2}- {\left\| {f(A^{(i)}) - f(N^{(i)})} \right\|_2^2} + \alpha \le 0,\alpha \ge 0\\ \Rightarrow L(A^{(i)},P^{(i)},N^{(i)}) = \max ({\left\| {f(A^{(i)}) - f(P^{(i)})} \right\|_2^2} - {\left\| {f(A^{(i)}) - f(N^{(i)})} \right\|_2^2} + \alpha ,0)\\ \Rightarrow J(A,P,N) = \sum\limits_{i = 1}^m {L({A^{(i)}},{P^{(i)}},{N^{(i)}})} \end{array} \end{gather*}
⇒
f(A(i))−f(P(i))
22−
f(A(i))−f(N(i))
22+α≤0,α≥0⇒L(A(i),P(i),N(i))=max(
f(A(i))−f(P(i))
22−
f(A(i))−f(N(i))
22+α,0)⇒J(A,P,N)=i=1∑mL(A(i),P(i),N(i))
五、循环神经网络
1.文本预处理与词嵌入
文本处理步骤如下:
(1)首先进行文本切分。将文本切割为单词序列(词元)。
(2)统计词频。建立一个空的字典(关键字为单词,值为词频),遍历单词序列,更新字典;根据词频对字典降序排列,并将词频索引化(1,2
…
\dots
…),对于字典中不存在的单词编码为0。
(3)进行独热编码。将每个单词所对的索引转换为独热码。
对于一个原始文本可能会有多行,首先需要按行对原始文本进行文本处理,将每一条索引行转化为数字索引列表,同时每行的长度不同,需要对文本进行剪切或填充完成文本预处理。
由于采用了独热编码,使每个单词的独热向量维度过高,可以通过词嵌入将独热向量映射为低维向量,即 x i = P T × e i {x_i} = {P^T} \times {e_i} xi=PT×ei对于一个 v v v维的独热向量 e i e_i ei经过一个 d × v d \times v d×v维的参数矩阵 P T P^T PT映射为 d d d为的向量,且 d < < v d<<v d<<v,该方式即为词嵌入。
2.循环神经网络(RNN)
RNN主要用于处理序列数据,网络结构如图5-1所示,t时刻的输出不仅与此刻的输入有关也与t-1时刻该层的输出有关,即 h t = σ ( A ⋅ [ h t − 1 x t ] ) {h_t} = \sigma (A \cdot \left[ \begin{array}{l} {h_{t - 1}}\\ {x_t} \end{array} \right]) ht=σ(A⋅[ht−1xt])
参考文献
[1]:Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection; proceedings of the 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Seattle, WA, F 2016
Jun 27-30, 2016 [C]. 2016