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。
- Dense Prediction (one-stage):
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
- YOLO V4 — 网络结构解析(特详细!) - 知乎 (zhihu.com)
- YOLO V4 — 损失函数解析(特详细!) - 知乎 (zhihu.com)
- [25] Spatial pyramid pooling in deep convolutional networks for visual recognition.
- [49] Path aggregation network for instance segmentation.
- [63] YOLOv3: An incremental improvement.
- [81] CSPNet: A new backbone that can enhance learning capability of cnn.