Object Detection
深度学习的繁荣离不开大量的研究人员开发了更多更高效的算法,这一周的课程学几个小时就为了能讲清楚一篇YOLO在干什么。用的组件太多,技术就变成魔法了。
1. 问题定义
Image classification: 判断图像中有某个物体
Object Localization - Classification with localization: 判断图像在图片中,并标记出位置(矩形区域)1
Localization - Bounding Box ( b x , b y , b h , b w b_x, b_y, b_h, b_w bx,by,bh,bw)
其中, ( b x , b y ) (b_x, b_y) (bx,by)是矩形的中心区域, b h b_h bh和 b w b_w bw是高、宽在图像中的占比(不是绝对值)
目标检测的标注 Softmax + Bounding Box
y
=
[
P
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
c
4
]
y
1
=
[
1
b
x
b
y
b
h
b
w
0
1
0
0
]
y
0
=
[
0
?
?
?
?
?
?
?
?
]
y = \begin{bmatrix} P_c\\ b_x\\ b_y\\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \\ c_4 \end{bmatrix} y_1 = \begin{bmatrix} 1\\ b_x\\ b_y\\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \\ 0 \end{bmatrix} y_0 = \begin{bmatrix} 0\\ ?\\ ?\\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \end{bmatrix}
y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡Pcbxbybhbwc1c2c3c4⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤y1=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1bxbybhbw0100⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤y0=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0????????⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
P c P_c Pc表示图像中有物体, c 1 . . . c 4 c_1...c_4 c1...c4表示要探测的4类对象,当 P c = 0 P_c = 0 Pc=0时其它内容就都不关注了。
Loss (其中一种)
L
(
y
^
,
y
)
=
{
(
y
1
^
−
y
1
)
2
+
.
.
.
+
(
y
n
^
−
y
n
)
2
p
c
=
1
(
y
1
^
−
y
1
)
2
p
c
=
0
\mathcal{L}(\hat{y}, y) = \left\{\begin{matrix} (\hat{y_1} - y_1)^2 + ... + (\hat{y_n}-y_n)^2 & p_c = 1 \\ (\hat{y_1} - y_1)^2 & p_c = 0 \end{matrix}\right.
L(y^,y)={(y1^−y1)2+...+(yn^−yn)2(y1^−y1)2pc=1pc=0
2. 目标检测算法(YOLO)
其实也就是介绍了YOLO的原理。
2.1 Sliding windows detection
- 方法非常直接:使用滑动窗口在图像上移动,并依次放到ConvNet中进行判断
- 使用多个不同的步长可能能够提高性能(效果)
- 计算代价比较高
2.2 Convolutional Implementation of Sliding Windows
核心算法:降低目标检测复杂度的重要算法,让实时检测成为可能。
- 将全连接层转换成卷积层
- 卷积的滑动过程与目标检测的滑动过程是可以统一的
2.2.1 Turning FC Layer into convolutional layers
分类中的全连接层:上一层 5 × 5 × 16 5\times5\times16 5×5×16直接连接一个 400 × 1 400\times1 400×1的全连接层
卷积实现:上一层 5 × 5 × 16 5\times5\times16 5×5×16连接一个 5 × 5 5\times5 5×5的filter 400个,得到 1 × 1 × 400 1\times1\times400 1×1×400的“全连接层”,再应用 1 × 1 1\times1 1×1 filter 400个。注意这里其实是与全连接层的计算是等价的。
2.2.2 Convolution implementation of sliding windows
有了全连接层的卷积实现,再进一步得到滑动窗口的卷积实现(卷积操作本身就是一个滑动窗口移动的过程),具体地:
- 滑动窗口的大小就是filter的大小
- stride就是MAX POOL的大小
注意下图中 16 × 16 × 3 16 \times 16 \times 3 16×16×3的图像在 14 × 14 × 3 14 \times 14 \times 3 14×14×3的窗口滑动下是如何变成最右边对应的左上角元素的。
这里解决了核心大头问题,接下来还有一些工作可以继续提高效果
2.3 Bounding Box Predictions
在全局标注的基础上将问题进行了切割
- 将问题切分成网格(比如 3 × 3 3 \times 3 3×3),对于每一个网格进行标注(变成了9个标注)
- ( b h , b w ) (b_h, b_w) (bh,bw)和 ( b x , b y ) (b_x, b_y) (bx,by)的标注都是以网格单元为基础的,并且 ( b h , b w ) (b_h, b_w) (bh,bw)是可以大于1的(越过网格边界)
- 只将物体中心 ( b x , b y ) (b_x, b_y) (bx,by)所在的格子标记为1
2.4 Anchor Boxes
对于目标应用不同的Anchor Box,能更好的区分重叠的不同形状的目标。此时标注也会发生相应变化,比如下面是两个anchor box:
y
=
[
P
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
c
4
P
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
c
4
]
⇒
[
0
?
?
?
?
?
?
?
?
1
b
x
b
y
b
h
b
w
0
1
0
0
]
y = \begin{bmatrix} P_c\\ b_x\\ b_y\\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \\ c_4 \\ P_c\\ b_x\\ b_y\\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \\ c_4 \end{bmatrix} \Rightarrow \begin{bmatrix} 0\\ ?\\ ?\\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ 1 \\ b_x\\ b_y\\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \\ 0 \end{bmatrix}
y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡Pcbxbybhbwc1c2c3c4Pcbxbybhbwc1c2c3c4⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⇒⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0????????1bxbybhbw0100⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
2.5 评价指标 Intersection over Union (IoU)2
2.6 Non-max suppression
重叠的检测结果(以概率最大的为标准)中只取IoU最大的,下面是算法流程,很直观。
Each output prediction is:
y
=
[
P
c
b
x
b
y
b
h
b
w
]
y = \begin{bmatrix} P_c\\ b_x\\ b_y\\ b_h \\ b_w \end{bmatrix}
y=⎣⎢⎢⎢⎢⎡Pcbxbybhbw⎦⎥⎥⎥⎥⎤
Discard all boxes with
P
c
≤
0.6
P_c \le 0.6
Pc≤0.6
While there are any remaining boxes:
- Pick the box with largest P c P_c Pc, output that as a prediction
- Discard any remaining box with IoU ≥ 0.5 \ge 0.5 ≥0.5 with the box output in the previous step
2.7 YOLO Algorithm
把上面的组件合在一起,就是YOLO了。具体地,如果在 3 × 3 3 \times 3 3×3的网格上用2个anchor box对4个分类的预测结果大小应该是 3 × 3 × 2 × 9 3 \times 3 \times 2 \times 9 3×3×2×9 。
a 其它图片均来自课程,侵删 ↩︎