YOLO 系列模型近年来受到众多关注,原因有二:1. 实时性高,远超同时期的许多模型; 2. 代码开源程度高,作者非常乐意分享。这也使得在实践中,大家都乐意使用 YOLO 系列的模型。YOLO 系列模型属于 one-stage,end-to-end model,将图像输入到模型中,经过一系列卷积操作,即可直接回归出 bounding box 的坐标和 class probability。
- YOLO 的核心是将图像划分成 S ∗ S S*S S∗S个 grid cell,经过模型系列卷积操作后,得到 S ∗ S ∗ ( B ∗ 5 + C ) S*S*(B*5+C) S∗S∗(B∗5+C) 的特征向量,将特征向量以矩阵的形式表示,进行 Descenting Sort 和 NMS 操作,经过一系列操作后即可得到检测结果。
- YOLOv2 的核心是在 YOLO 的基础上,修改了bounding box 的预测方式,不再假设每个 grid cell 仅有一种类别存在;引进 Anchor Box,并通过 K-means 是其更符合数据中 bounding box 的形状;且作者提出新的 classification network,即 DarkNet-19。此外,作者在同一篇论文中,提出了 YOLO 9000,该模型采用了一种分类和检测的联合训练策略,可以将检测超过9000个类别的物体。
- YOLOv3 的核心是在于作者在 YOLOv2 上做出了许多改进,在 DarkNet-19 的基础上引进 ResNet 的结构,提出 DarkNet-53。
1. YOLO
2. YOLOv2
3. YOLOv3
论文题目:You Only Look Once: Unified, Real-Time Object Detection
论文作者:Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi
所属机构:University of Washington, Allen Institute for AI, Facebook AI Research
论文链接:https://arxiv.org/pdf/1506.02640.pdf
(1) 摘要
2015年,Joseph Redmon, Ali Farhadi 和 Ross Girshick(R-CNN系列论文的作者) 一起提出了 YOLO。YOLO 与 R-CNN 不同,并不使用 classifier 做 object detection,而是完全将 object detection 视为一个 regression problem。该模型不仅是 end-to-end model,还是 one-stage model。
此外,该模型的优点有以下三点:
(2) 模型结构
首先,模型将图像 resize 为 448 ∗ 448 448*448 448∗448,再将其划分为 S ∗ S S*S S∗S 个格子(若待检测物体的中心落在某个格子中,该格子负责检测该物体)。
接着,每个格子进行检测时会提供两种预测信息: 预测 B 个 bounding box 和 C 个 conditional class probabilities。其中,bounding box 信息包括:x,y,w,h,and confidence(x,y 为 bounding box 的中心坐标,相对于每个单元格左上角坐标点的偏移值;w,h 为 bounding box 的宽度与高度,该值是相对于整个图片的宽与高的比例;所以 x,y,w,h 的范围都是 [0,1])。
而confidence 由两部分组成:该格子中存在 object 的概率(存在 object,则 P ( O b j e c t ) = 1 P(Object)=1 P(Object)=1;否则,则 P ( O b j e c t ) = 0 P(Object)=0 P(Object)=0)和所预测 bounding box 与 ground truth 的 IOU(即 I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth):
所预测的 C 个 conditional class probabilities 对应着该格子在存在 object 情况下,该 object 为某种类别的概率。
故,模型的预测结果的 shape 应该为: S ∗ S ∗ ( B ∗ 5 + C ) S*S*(B*5+C) S∗S∗(B∗5+C)。
细节:
网络预测 bounding box 的步骤如下:(建议阅读参考资料中的 ‘YOLO幻灯片’)
关于网络结构:
细节:
关于 multi-part loss function:
该 loss function 由三部分组成:Coord Error,IOU Error,Class Error。前两项为 Coord Error,作者为了加大位置误差对网络的影响,引入了 λ c o o r d = 5 \lambda_{coord} = 5 λcoord=5,并且为了平衡不同大小的物体 bounding box的位置误差对网络的影响,作者将物体的大小信息 w 和 h 进行求平方根,以进行改进。中间两项为 IOU Error,作者为减小不存在物体的格子的预测误差对网络的影响,引入了 λ n o o b j = 0.5 \lambda_{noobj} = 0.5 λnoobj=0.5。最后一项为 Class Error, 作者并未对这一项进行额外改动。
(3) 实验结果.
(4) 总结
YOLO: 输入图像 → \to →将大小resize到 448 ∗ 448 448*448 448∗448 → \to →输入到网络中,得到预测结果,shape 为 S ∗ S ∗ ( B ∗ 5 + C ) S*S*(B*5+C) S∗S∗(B∗5+C) → \to →对每个 bounding box 进行阈值和NMS操作 → \to →得到最终检测结果
优点:
有待改进之处:
论文题目:YOLO9000: Better, Faster, Stronger
论文作者:Joseph Redmon, Ali Farhadi
所属机构:University of Washington, Allen Institute for AI
论文链接:https://arxiv.org/pdf/1612.08242.pdf
(1) 摘要
2016年, Joseph Redmon 和 Ali Farhadi 在YOLO 的基础上做出了一系列的改进,推出了 YOLOv2。此外,他们还提出了一种新的训练方式,使得同时使用 large classification dataset 和 small detection dataset 进行objection detection成为可能,基于这种训练方式,作者推出了 YOLO 9000, 该模型可以 detection 9000种不同的物体。
(2) 模型结构
关于Batch Normalization:
自2015年,Google 提出了 Batch Normalization 后,BN 在深度网络中的应用便开始一发不可收拾,各种变体也横空出世。
BN 可以很好的解决网络中的梯度问题(梯度消失与梯度爆炸), 减轻对参数初始化的依赖,使得训练速度提升,并增加了网络的泛化能力,可以抛弃 Dropout 等技术。
关于 High Resolution Classifier:
在 YOLO 中,作者在 ImageNet 上训练好的网络,添加后续四个 Conv layer 和两个 FC layer 后,便提高 resolution 到 448 ∗ 448 448*448 448∗448 后便直接在训练集上进行训练。在 YOLOv2 中,作者选择提高 resolution 后,依然在 ImageNet 上进行 10 EPOCH 的 fine-tuning 后,再到训练集上进行训练。
关于 Convolutional With Anchor Boxs:
在 YOLO 中,网络直接由 FC layer 在 feature map 上预测 bounding box。而在 Faster R-CNN 中,模型借助 hand-picked priors(也就是那九种 anchor box)利用 RPN 预测 bounding box 相对于 anchor box 的 offset。
在 YOLOv2 中,作者也开始采用 anchor box 的 idea。首先,作者删去了一个 pooling layer 以提高最后 feature map 的 resolution;然后, 作者 shrink 网络,使得网络处理图像的 input size 为 416 ∗ 416 416*416 416∗416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。作者观察到,大物体通常占据了图像的中间位置, 就可以只用中心的一个cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率;最后,YOLOv2 使用 conv layer进行 downsample (factor 为 32),使得最后得到的 feature map 的 shape 为 13 ∗ 13 13*13 13∗13。
利用 anchor box,虽然 YOLOv2 的 mAP 下降了一点,但是 recall 提升了很多。(原先 YOLO 每张图最多预测 7 ∗ 7 ∗ 2 = 98 7*7*2=98 7∗7∗2=98 个 bounding box,YOLOv2 可以预测 13 ∗ 13 ∗ 9 = 1521 13*13*9=1521 13∗13∗9=1521个 bounding box;加 anchor box 之前,mAP=69.5%,recall=81%;加了 anchor box 之后,mAP=69.2%,recall=88%)
并且,作者不再像 YOLO 中那样每个 grid 负责预测 grid 中物体的类别,改为每个 bounding box 预测 bounding box 中物体的类别。
关于 Dimension Cluster:
在 Faster-RCNN 中,anchor box 提供了三种 aspect ratio 和三种 scale的 anchor box(一共九种)。虽然模型会在 anchor box 的基础上进行回归以微调 bounding box,但是构造合适的 anchor box (也就是精选的先验框,hand-picked priors) 对于模型的训练仍然有着益处。
在 YOLOv2 中,相较于手工构造 anchor box,作者选择借助统计学的力量:对数据中的标注 bounding box 进行 K-Means Cluster,以此学得更好的 aspect ratio 和 scale 的 anchor box。其中,距离函数为: d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1-IOU(box,centroid) d(box,centroid)=1−IOU(box,centroid)。之所以不使用传统的欧式距离函数,是因为那样会导致 size 大的 box 相对于 size 小的 box 来说,error 更大。
最后,作者基于 recall 与模型的复杂度的权衡,选择设定 k = 5 k=5 k=5,利用 K-Means 在 VOC 2007 和 COCO 上分别得到了五种 anchor box(基本都比较‘瘦长’,COCO上得到的 anchor box 比 VOC 2007 上得到的 anchor box 变化较大)。
关于 Direct Location Prediction:
之前提到,作者在 YOLOv2 中借鉴 Faster R-CNN 中的 RPN,也采用 anchor box 进行预测 bounding box 相对于 anchor box 的 offset 。但作者指出:YOLO 使用 anchor box 会导致模型不稳定,尤其在迭代初期。
在论文中,作者给出的计算公式应该是错的,我认为减号应该改为加号:
因为在 Faster R-CNN 中的计算公式为:
作者说,这样的计算公式是没有约束的,因为 t x , t y t_x,t_y tx,ty 并没有任何约束,这就意味这最后计算的中心坐标可以落在图像上的任何位置。所以,作者放弃了这种计算公式,而采用了下面的计算公式:
其中, c x , c y c_x,c_y cx,cy 为 grid cell 的左上角坐标,计算时每个 cell 的尺度都是1, σ ( t x ) , σ ( t y ) \sigma(t_x),\sigma(t_y) σ(tx),σ(ty)也就代表着 bounding box 中心相对于 grid cell 左上角坐标的 offset。
最后,可以将式子改为如下,使得预测值的范围都在 [ 0 , 1 ] [0,1] [0,1]:
其中, ( W , H ) (W,H) (W,H)为 feature map 的大小。
关于 Fine-Grained Feature:
由于修改后的 YOLO 最后会生成 13 ∗ 13 13*13 13∗13 的 feature map,作者认为这样的粗粒度特征虽然可以胜任大尺度物体的检测,但是难以应付小物体的检测,要知道 YOLO 的缺点之一就是对小物体的检测精度低。
借鉴 SSD 的思路,作者选择利用多尺度的特征进行预测,但是与 SSD 不同,作者并没有在不同尺度上的 feature map上分别进行预测,而是将不同尺度的 feature map 进行叠加,作者称该结构为 passthrough layer,与 ResNet 中的 identity mapping 类似(‘The passthrough layer concatenates the higher resolution features with the low resolution features by stacking adjacent features into different channels instead of spatial locations, similar to the identity mappings in ResNet’)。
细节:
关于 pass-through layer,具体来说就是特征重排(不涉及到参数学习),前面 26 ∗ 26 ∗ 512 26 * 26 * 512 26∗26∗512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,其维度都是 13 ∗ 13 ∗ 512 13 * 13 * 512 13∗13∗512,然后做concat操作,得到 13 ∗ 13 ∗ 2048 13 * 13 * 2048 13∗13∗2048的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。
关于 Mutli-Scale Training:
在 YOLOv2 中,作者为了增强模型对任意 size 图像的鲁棒性,采用了多尺度输入训练的策略:每隔 10 batch,就随机选择新的size 的图像进行训练。由于 YOLOv2 的 downsample 的 factor 为 32,可选输入图像的大小为: { 320 , 352 , . . . , 608 } \{320,352,...,608\} {320,352,...,608},则最后的 feature map 的 size 分别为 { 10 , . . . , 19 } \{10,...,19\} {10,...,19}。
关于 DarkNet-19:
作者提出了一个新的 classification network,称为 DarkNet-19。在 DarkNet-19 中,作者常常在 conv layer 使用 3 ∗ 3 3*3 3∗3 的 filter,并在每次pooling layer后,使得 filter 的 channel 数量翻倍;此外,作者借鉴 Network in Network,采用了 GAP(global average pooling),用来压缩所得到的 feature map(Avgpool layer 使得网络可以处理任意 size 的图像)。
细节:
至此,作者关于 YOLOv2 的描述基本讲完了,但是对比 YOLO 就可以发现,作者没讲模型训练时如何确定先验框以及损失函数。查阅资料后,发现有人做了这方面的讲解:
关于 VOLO 9000 的细节,我建议大家阅读参考资料中的 YOLO2,我觉得这篇文章讲的比较详细,值得一看。
(3) 实验结果
论文题目:YOLOv3: An Incremental Improvement
论文作者:Joseph Redmon, Ali Farhadi
所属机构:University of Washington
论文链接:https://arxiv.org/pdf/1804.02767.pdf
(1) 摘要
YOLOv3 并非纯粹意义上的论文,用作者的话来说,是作者近一年的 Tech Report。在 YOLOv3 中,作者对 YOLOv2 做了许多改进,提升了 YOLOv2 的性能。其中,最值得注意的是,YOLOv3 使用了 ResNet 结构,提出了 DarkNet-53,并且采用 FPN (Feature Pyramid Networks for Object Detection)结构。
(2) 所做尝试
关于 Class Prediction:
作者在 YOLOv3 中,不再采用 Softmax ,而是采用 independent logistic classifers,并采用 binary cross-entroy loss。
这是由于 Softmax 不适用于存在 overlapping label 的复杂领域(如:Open Images Dataset),并且采用 independent logistic classifers 的效果并不差。
关于 Feature Extractor:
作者在 DarkNet-19 的基础上引进 ResNet 中的 building block 结构,提出了 DarkNet-53(因为其中含有 53个 conv layer)。
此外,作者还将其与 DarkNet-19,ResNet-101,ResNet-152 进行了对比:
关于 Prediction Across Scales:
(作者对这一块的描述写在 Feature Extrator 前面,但我感觉应该写在后面比较好,并且应该配上一张结合 DarkNet-53 的网络结构图)
在 YOLOv3 中,作者对 bounding box 设置了三种尺度特征,并且仍然利用 k-means 得到九个先验框,并将其划分到3个尺度特征图上,尺度更大的特征图使用更小的先验框。
除了以上所提到的各种改进,作者也列出了一些没有 work 的改进:采用 Focal Loss,采用与Faster R-CNN 相似的 IOU threshold 的策略,采用 Linear activation 预测 bounding box 的坐标
(3) 实验结果
参考资料:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink