1、ResNet50结构
2 residual block
一般将输入
a
i
a^i
ai放到两层卷积之后,并且在relu之前。resnet50某一个残差块如下图:
z
i
+
1
=
w
i
+
1
∗
a
i
+
b
i
+
1
z^{i+1}=w^{i+1}*a^i+b^{i+1}
zi+1=wi+1∗ai+bi+1
a
i
+
1
=
r
(
z
i
+
1
)
a^{i+1}=r(z^{i+1})
ai+1=r(zi+1)
a
i
+
2
=
r
(
z
i
+
2
+
a
i
)
a^{i+2}=r(z^{i+2}+a^i)
ai+2=r(zi+2+ai)
=
r
(
w
i
+
2
a
i
+
1
+
b
i
+
2
+
a
i
)
=r(w^{i+2}a^{i+1}+b^{i+2}+a^i)
=r(wi+2ai+1+bi+2+ai)
如果
w
i
+
2
=
0
w^{i+2}=0
wi+2=0,
b
i
+
2
=
0
b^{i+2}=0
bi+2=0,
r
(
)
r()
r()为relu激活函数,那么
a
i
+
2
=
a
i
a^{i+2}=a^i
ai+2=ai,因此当网络比较深时,信息依然能传过来,至少不损害精度,经过训练后甚至可以提高精度。
在实现时需要注意的是:
- 若 z i + 2 z^{i+2} zi+2与 a i a^i ai的维度不同,那么可以 w s w_s ws转化为相同的维度,或是将少的维度补0.
3. 浅层包含更多的细节特征,深层包含更多的语义特征。
4. roi pooling和roi align
roi pooling
- 缺点:有两处量化处理:1. 将原图roi坐标映射到feature map中的坐标,可能会有小数。2. 每个bin的大小,可能会有小数。
- roi pooling每个bin的大小计算方法之一为:
假设roi大小为10x10,roi之后的大小为3x3, ⌊ 10 / 3 ⌋ = 3 \lfloor 10/3 \rfloor=3 ⌊10/3⌋=3,所以3x2+4=10,前两个bin的大小为3,最后一个为4. - 过程如下图所示。
roi align
不需要以上两个量化处理。过程如下图所示,假设每个bin包含4个采样点。
图像平移与旋转
设图像某像素变换前坐标为
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0),变换后的作标为
(
x
,
y
)
(x,y)
(x,y)。
1 平移
x轴方向上平移
t
x
t_x
tx,y轴方向上平移
t
y
t_y
ty,则:
x
=
x
0
+
t
x
x=x_0+t_x
x=x0+tx
y
=
y
0
+
t
y
y=y_0+t_y
y=y0+ty
使用矩阵表示:
$$
2 旋转
设逆旋转角度为
θ
\theta
θ,将
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)用极坐标表示为:
x
0
=
r
c
o
s
α
x_0=rcos\alpha
x0=rcosα
y
0
=
r
s
i
n
α
y_0=rsin\alpha
y0=rsinα
旋转后:
x
=
r
c
o
s
(
α
+
θ
)
=
x
0
c
o
s
θ
−
y
0
s
i
n
θ
x=rcos(\alpha+\theta)=x_0cos\theta-y_0sin\theta
x=rcos(α+θ)=x0cosθ−y0sinθ
y
=
r
s
i
n
(
α
+
θ
)
=
x
0
s
i
n
θ
−
y
0
c
o
s
θ
y=rsin(\alpha+\theta)=x_0sin\theta-y_0cos\theta
y=rsin(α+θ)=x0sinθ−y0cosθ