【摘记】YOLO V4
【说在最前面的话】
YOLO V4 整合了 Weighted-Residual-Connections(WRC)
, Cross-Stage-Partial-connections(CSP)
,Cross mini-Batch Normalization(CmBN)
,Self-adversarial-training(SAT)
,Mish-activation
, Mosaic data augmentation
, DropBlock
,CIoU
满满的都是硬核操作
Contribution
该文的贡献主要有以下几点:
- 设计了一种快速而强有力的目标检测器,它使得任何人仅需一个 1080Ti 或者 2080Ti 即可训练这样超快且精确的目标检测器
- We verify the influence of SOTA bag-of-freebies and bag-of-specials methods of object detection during detector training
- 作者对一些 SOTA 方法进行了改进(含CBN、PAN,SAM)以使其更适合单GPU训练
网络结构
对于目标检测来说,在确定了 backbone 之后,需要做的就是加入额外的模块以提升感受野、更好的汇聚特征等等。所以,第一步,选择一个好的网络结构,对于目标检测器来说是十分关键。
好的检测模型需要以下几点特性:
- 更高的输入分辨率,为了更好的检测小目标
- 更多的卷积层,为了具有更大的感受野
- 更多的参数,更复杂的模型能够同时检测不同大小的目标
简单来说就是,需要选择具有更大感受野、更多参数的模型作为 backbone
而从下面的表格中可以看出,把 CSPDarkNet53 作为 YOLO V4 的 backbone 是一个不错的选择。
按照上面说的,选好了 backbone,接下来的工作就是添加一些辅助的模块。在CSPDarkNet53 的基础上,作者添加了 SPP 模块,因其可以提升模型的感受野、分离更重要的上下文信息,同时还不会导致模型推理速度的下降。此外,作者还采用 PANet 中的不同backbone 级的参数汇聚方法替代 FPN
最终,
YOLOv4 = CSPDarkNet53 + SPP + path-aggregation neck (PANet) + YOLOv3-head
Some tricks
为更好的训练目标检测模型,CNN 模型通常具有以下模块:
- Activations:ReLU、Leaky-ReLU、PReLU、ReLU6、SELU、Swish or Mish
- Bounding box regression Loss:MSE、IoU、GIoU、CIoU、DIoU
- Data Augmentation:CutOut、MixUp、CutMix
- Regularization:DropOut、DropPath、Spatial DropOut、DropBlock
- Normalization:BN、SyncBn、FRN、CBN
- Skip-connections: Residual connections, weighted residual connections, Cross stage partial connections
作者从上述模块中做出了如下的选择:**函数方面选择 Mish;正则化方面选择 DropBlock;由于聚焦在单 GPU,故而未考虑 SyncBN
其他的改进策略
为使得 YOLOv4 更适合于单 GPU,作者还进行了其他几项额外设计与改进:
- 引入一种新的数据增广方法:Mosaic 与自对抗训练
- 通过GA算法选择最优超参数
- 对现有方法进行改进以更适合高效训练和推理:改进SAM、改进PAN,CmBN