[論文筆記] YOLOv4


Posted by Ivan Fang on 2021-06-17

Paper Information

  • 原文:YOLOv4: Optimal Speed and Accuracy of Object Detection
  • 機構:Institute of Information Science Academia Sinica, Taiwan
  • 時間:2020 年

Background

  • YOLOv4 目的:建立一個 real time 且 high performance 的 object detector,並且只需要一張 gpu 即可做訓練。
  • 在 YOLOv4 論文中,作者實驗了很多 object detection 的技巧,也介紹了很多 object detection 的概念,可以視作半個教科書。
  • 需要注意的是,論文中提到的許多技巧(包含作者在論文中新提出的)例如,CmBN、modified SAT,都是沒有被用在 YOLOv4 上的。

Object Detection Models

  • 如圖 2 所示,現今 object detector 的架構大致可以分成 4 個部份:
    • Input:沒什麼好講的,就是圖片。
    • Backbone:用於初步提取圖片的特徵。常用的模型包括:VGG16、ResNet、EfficientNet、CSPDarknet53 等。backbone 通常會先 pretrain 在 ImageNet 上。
    • Neck:用於整合 backbone 的各層 feature map。常用的模型包括:SPP、FPN、PAN 等。
    • Head:將 neck 整合好的特徵送入 head,用於預測 bounding box (bbox)。
  • 常見的 head 可以分成 2 種:one-stage (dense) 與 two-stage (sparse)。由於 one-stage detector 在每個 grid 上都要預測是否有 bbox,因此稱為 dense。而 two-stage detector 因為有 ROI pooling 的幫助,因此只需要對 ROI 做預測即可,因次稱為 sparse。
    • Dense Prediction (one-stage):
      • RPN、SSD、YOLO、RetinaNet (anchor based)
      • CornerNet、CenterNet、MatrixNet、FCOS (anchor free)
    • Sparse Prediction (two-stage):
      • Faster R-CNN、R-FCN、Mask R-CNN (anchor based)
      • RepPoints (anchor free) 圖 2:Object Detector。

Model Architecture

  • YOLOv4 的主要架構如下:
    • Backbone:CSPDarknet53 [81]
    • Neck:SPP [25] + PAN [49]
    • Head:YOLOv3 [63]
  • Darknet53:

    • 如圖 A 所示,Darknet53 總共有 53 層 conv. layer,除去最後一層 Connected (FC,實際上是通過 1x1 的 conv. layer 實現,因此算進 53 的一員),總共 52 層 conv. layer 用於當做主體網絡。
    • 每層 conv. layer 而都包含:
      • Conv2D
      • BatchNormalization
      • LeakyReLU (但在 YOLOv4 裡選用 Mish)
    • 圖 A 的輸入尺寸為 256x256,但實際上沒有限定一定要多少。論文中是使用 512x512。 圖 A:Darknet53 架構圖。
  • CSPNet (Cross Stage Partial Network):

    • CSPNet 可以在不降低甚至增加準確度的情況下,減少 CNN 網路 10% 到 20% 的計算量。
    • 如圖 B 所示,CSPNet 就是先將 base layer 依比例 $\gamma$ 拆分成兩份,其中一份原封不動,另一份則會經過 transition,最後兩者在 concatenate 起來,再經過一次 transition。
    • 在 CSPDarketnet53 中,base layer 為每個 ResBlock Body 前的 conv. layer 的 feature map,而 transition 則為一層 conv. layer。
圖 B:CSPNet 示意圖。
  • SPP (Spatial pyramid pooling) + PAN (Path Aggregation Network):

    • 這裡引用知乎@周威的解說,如圖 C 所示。
    • SPP 的使用主要使在 process1 裡。
    • process1:

      # input shape = 19x19
      y19 = DarknetConv2D\_BN\_Leaky(512, (1,1))(darknet.output)
      y19 = DarknetConv2D\_BN\_Leaky(1024, (3,3))(y19)
      y19 = DarknetConv2D\_BN\_Leaky(512, (1,1))(y19)
      
      # SPP
      maxpool1 = MaxPooling2D(pool\_size=(13,13), strides=(1,1), padding='same')(y19)
      maxpool2 = MaxPooling2D(pool\_size=(9,9), strides=(1,1), padding='same')(y19)
      maxpool3 = MaxPooling2D(pool\_size=(5,5), strides=(1,1), padding='same')(y19)
      y19 = Concatenate()([maxpool1, maxpool2, maxpool3, y19])
      
      y19 = DarknetConv2D\_BN\_Leaky(512, (1,1))(y19)
      y19 = DarknetConv2D\_BN\_Leaky(1024, (3,3))(y19)
      y19 = DarknetConv2D\_BN\_Leaky(512, (1,1))(y19)
      
    • process2:

      # upsampling
      y19\_upsample = compose(DarknetConv2D\_BN\_Leaky(256, (1,1)), UpSampling2D(2))(y19)
      
      # input shape = 38x38
      concatenate
      y38 = DarknetConv2D\_BN\_Leaky(256, (1,1))(darknet.layers[204].output)
      y38 = Concatenate()([y38, y19\_upsample])
      
      y38 = DarknetConv2D\_BN\_Leaky(256, (1,1))(y38)
      y38 = DarknetConv2D\_BN\_Leaky(512, (3,3))(y38)
      y38 = DarknetConv2D\_BN\_Leaky(256, (1,1))(y38)
      y38 = DarknetConv2D\_BN\_Leaky(512, (3,3))(y38)
      y38 = DarknetConv2D\_BN\_Leaky(256, (1,1))(y38)
      
    • process3:

      # upsampling
      y38\_upsample = compose(DarknetConv2D\_BN\_Leaky(128, (1,1)), UpSampling2D(2))(y38)
      
      # input shape = 76x76
      y76 = DarknetConv2D\_BN\_Leaky(128, (1,1))(darknet.layers[131].output)
      y76 = Concatenate()([y76, y38\_upsample])
      
    • process4:對 process3 的輸出做 downsampling (Conv2D、filters=256、size=(3,3)、strides=(2,2)) 後,與 process2 的輸出做 concatentate。
    • process5:對 process4 的輸出做 downsampling (Conv2D、filters=256、size=(3,3)、strides=(2,2)) 後,與 process1 的輸出做 concatentate。 圖 C:YOLOv4 整體架構圖。(圖片來源:知乎@周威)
  • YOLO HEAD 1 由多層 conv. layer 所組成。最後一層為 76x76x(num_anchor*(num_classes+5))。HEAD 2、3 依此類推。

Experiments & Results

  • IOU Loss:CIOU (Complete IOU Loss)
    • $w^{gt}$、$h^{gt}$:width and height of ground truth box
    • $w$、$h$:width and height of predicted box
      $$
      L_{CIOU} = 1 - IOU(A, B) + \frac{\rho^{2}(A_{ctr}, B_{ctr})}{c^{2}} + \alpha \cdot v \
      \alpha = \frac{v}{(1 - IOU) + v} \
      v = \frac{4}{\pi^{2}}(arctan \frac{w^{gt}}{h^{gt}} - arctan \frac{w}{h})^{2}
      $$
  • Data Augmentation:Mosaic
圖 2:Mosaic Augmentation。

References


#cv #Object Detection







Related Posts

基礎 JavaScript

基礎 JavaScript

gulp

gulp

Day 89

Day 89


Comments