目标检测 YOLO 系列: 开宗立派 YOLO v1
- 目标检测 YOLO 系列: 开篇
- 目标检测 YOLO 系列: 开宗立派 YOLO v1
- 目标检测 YOLO 系列: 更快更准 YOLO v2
- 目标检测 YOLO 系列: 持续改进 YOLO v3
- 目标检测 YOLO 系列: 你有我有 YOLO v4
- 目标检测 YOLO 系列: 快速迭代 YOLO v5
- 目标检测 YOLO 系列:你有我无 YOLOX
作者:Joseph Redmon,Santosh Divvala , Ross Girshick , Ali Farhadi
发表时间:2015
Paper 原文:You Only Look Once:Unified, Real-Time Object Detection
1 网络结构
先来看看 YOLO V1 的网络结构,如下图(来自目标检测 YOLO)所示。这里 backbone 是基于 GoogleNet 修改的。
具体来说,这里的 GoogLeNet modification(20 layers)就是采用 1×1 卷积层加 3×3 卷积层替换了 GoogLeNet 中的 Inception 模块,然后去掉了第二层 1x1 的卷积层和最后的 fc 层,更多关于 GoogLeNet 的介绍可以参考 CV 经典主干网络 (Backbone) 系列: GoogLeNet V1 到 V4。
YOLO v1 的具体结构如下。整个网络有 24 个卷积层,2 个全连接层, 4 个 pooling 层,整个网络 的 stride 为 64。
另外除了最后一层使用线性激活函数之外,其他层都使用 Leaky ReLU 激活函数,关于激活函数可以参考深度神经网络中常用的激活函数的优缺点分析。
index | kernal size | feature map size |
---|---|---|
input | - | 3x448x448 |
conv1 | 64x3x7x7-S_2-P_3 | 64x224x224 |
pool1 | 2x2-S_2 | 64x112x112 |
conv2 | 192x3x3-S_1-P_1 | 192x112x112 |
pool2 | 2x2-S_2 | 192x56x56 |
conv3 | 128x1x1-S_1-P_0 | 128x56x56 |
conv4 | 256x3x3-S_1-P_1 | 256x56x56 |
conv5 | 256x1x1-S_1-P_0 | 256x56x56 |
conv6 | 512x3x3-S_1-P_1 | 512x56x56 |
pool3 | 2x2-S_2 | 512x28x28 |
conv7 | 256x1x1-S_1-P_0 | 256x28x28 |
conv8 | 512x3x3-S_1-P_1 | 512x28x28 |
conv9 | 256x1x1-S_1-P_0 | 256x28x28 |
conv10 | 512x3x3-S_1-P_1 | 512x28x28 |
conv11 | 256x1x1-S_1-P_0 | 256x28x28 |
conv12 | 512x3x3-S_1-P_1 | 512x28x28 |
conv13 | 256x1x1-S_1-P_0 | 256x28x28 |
conv14 | 512x3x3-S_1-P_1 | 512x28x28 |
conv15 | 512x1x1-S_1-P_0 | 512x28x28 |
conv16 | 1024x3x3-S_1-P_1 | 1024x28x28 |
pool4 | 2x2-S_2 | 1024x14x14 |
conv17 | 512x1x1-S_1-P_0 | 512x14x14 |
conv18 | 1024x3x3-S_1-P_1 | 1024x14x14 |
conv19 | 512x1x1-S_1-P_0 | 512x14x14 |
conv20 | 1024x3x3-S_1-P_1 | 1024x14x14 |
conv21 | 1024x3x3-S_1-P_1 | 1024x28x28 |
conv22 | 1024x3x3-S_2-P_1 | 1024x7x7 |
conv23 | 1024x3x3-S_1-P_1 | 1024x7x7 |
conv24 | 1024x3x3-S_1-P_1 | 1024x7x7 |
fc1 | - | 4096x1 |
fc2 | - | 1470x1 |
跳出具体的网络结构,我们从全局的观点来看看 YOLO v1 的结构。
从结构可以看出,YOLO v1 的整体结构很清晰,输入图片(448x448x3)经过 24 conv + 2 fc 后得到的 feature map size 为 1470x1,然后做了一个 reshape 操作,将 1470x1 reshape 为 7x7x30,所有的操作都没有什么特别之处。
只是为什么要做这个 reshape 操作了,这就是非常关键的一步了。具体可以参考下面的网络原理部分。
2 网络原理
上面已经提到, YOLO V1 中将检测任务视作一个回归任务,即 location 和分类的结果都是通过回归的方式得到。那么 YOLO V1 到底是如何工作的呢?
-
- 输入的图像被划分成 S×S 个网格单元。对于图像上出现的每一个目标,有一个网格单元(目标的中心落入的那个单元格)负责预测它。
-
- 每一个网格单元预测 B 个 bbox 以及 C 类概率。每个 bbox 预测结果有 5 个组成部分,分别是 ( x , y , w , h , c o n f i d e n c e ) (x,y,w,h,confidence) (x,y,w,h,confidence),其中 ( x , y ) (x,y) (x,y) 坐标代表 bbox 的中心的坐标值,坐标值是相对于对应的网格单元而言的,左上顶点坐标记为 0, 右下坐标记为 1(记住,如果框的中心不在网格单元内,那么这个单元格不负责检测这个目标),这些坐标被归一化到 0 到 1 之间。 ( w , h ) (w,h) (w,h) 框的尺寸也被归一化为 [ 0 , 1 ] [0,1] [0,1](相对于图像的大小)。confidence 的值,表示预测的 bbox 包含一个目标的置信度。计算公式为: P r ( O b j e c t ) × I O U ( p r e d , t r u t h ) Pr(Object)×IOU(pred, truth) Pr(Object)×IOU(pred,truth),从公式可以理解这个置信度衡量了两个方面:一个是 bbox 是否包含物体,另一个是 bbox 对于物体的位置预测的准确率(IOU)。如果一个 bbox 不包含物体,那么 P r ( O b j e c t ) Pr(Object) Pr(Object) 为 0, 即置信度为 0;如果一个 bbox 包含物体,那么 P r ( O b j e c t ) Pr(Object) Pr(Object) 为 1,置信度就是 bbox 和 ground truth box 的 IOU 值了。最后从 B 个 bbox 中选择 confidence 最大的那个作为最后的预测结果。
-
- 每个网格单元还需要预测出分类的结果, P r ( C l a s s ( i ) ∣ O b j e c t ) Pr(Class(i) | Object) Pr(Class(i)∣Object)。如果总共有 C 类目标,那么每个网格单元将预测出目标属于每一类的概率。下面的例子中 S = 3,B = 2, C = 3。
- 每个网格单元还需要预测出分类的结果, P r ( C l a s s ( i ) ∣ O b j e c t ) Pr(Class(i) | Object) Pr(Class(i)∣Object)。如果总共有 C 类目标,那么每个网格单元将预测出目标属于每一类的概率。下面的例子中 S = 3,B = 2, C = 3。
-
- 预测的时候输入一张图片,假设 S = 7,B = 2,C = 20,那么最后将得到 49 个 cell,每个 cell 对应 2 个 bbox,即 98 个bbox,每个 cell 对应输出一个 30(2x5+20)维的 tensor。98(7x7x2) 个 bbox, 对应输出 98 个 confidence 值。这里定义 class-specific confidence score 如下,这个 confidence score 将用来进行 NMS 操作。比如每个类别按照 confidence score 从大到小排序,对于同一个类别,如果 IOU 大于 0.5 就丢掉它对应的 bbox(避免重复检测同一个物体)。这里的 NMS 主要是针对预测较大的物体时,有可能出现多个区域预测同一个物体的情况。
c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U ( p r e d , t r u t h ) confidence = Pr(Object)*IOU(pred, truth) confidence=Pr(Object)∗IOU(pred,truth)
c o n f i d e n c e _ s c o r e = P r ( C
- 预测的时候输入一张图片,假设 S = 7,B = 2,C = 20,那么最后将得到 49 个 cell,每个 cell 对应 2 个 bbox,即 98 个bbox,每个 cell 对应输出一个 30(2x5+20)维的 tensor。98(7x7x2) 个 bbox, 对应输出 98 个 confidence 值。这里定义 class-specific confidence score 如下,这个 confidence score 将用来进行 NMS 操作。比如每个类别按照 confidence score 从大到小排序,对于同一个类别,如果 IOU 大于 0.5 就丢掉它对应的 bbox(避免重复检测同一个物体)。这里的 NMS 主要是针对预测较大的物体时,有可能出现多个区域预测同一个物体的情况。