天天看點

yolo4 coco 預訓練權重_訓練一個跑在嵌入式環境的YOLOv4模型檢測人,貓,狗

yolo4 coco 預訓練權重_訓練一個跑在嵌入式環境的YOLOv4模型檢測人,貓,狗

2020年4月,Alexey Bochkovskiy在他的Github放出了YOLO檢測模型的第四個版本:YOLOv4,比YOLOv3計算量變化不大的前提下,大幅提升了算法效果,在MS COCO資料集上[email protected]從33%提升到43.5%。

官方提供訓練好的權重檔案大小為246MB,提供了80類物體的檢測,在PC上通過CPU運作608x608尺寸推理的耗時則達到了2秒多,要在嵌入式環境運作完全無法達到實時性能要求。如果我們隻關心某幾類物體,能否進行一些優化呢?

我挑選了三類目标:人、貓、狗進行實驗。在MS COCO 2017資料集上訓練一個可以在VisionSeed(1T FP16算力)上實時運作的YOLOv4-nano模型。

MS COCO 2017包含80類不同的目标框标注,訓練集和驗證集圖檔數量如下:

+-------+--------+--------+------+------+-----+
|       |  all   | person | cat  | dog  | ... |
+-------+--------+--------+------+------+-----+
| train | 118287 |  64115 | 4114 | 4385 | ... |
| val   |   5000 |   2693 |  184 |  177 | ... |
+-------+--------+--------+------+------+-----+
           

可以看到其中包含“人”這一類的圖檔占到了訓練集的一半,是以訓練時間估計不會降低太多。

我們再來看看目标硬體平台:VisionSeed,這是一個我在騰訊優圖主導推出的,内置了NPU的攝像頭模組,售價499,NPU中有專門執行卷積、Maxpool、ReLU的加速單元,是以包含這三類運算比例高的模型能得到最大程度的提速。原版的YOLOv4模型存在NPU不支援的MISH激活函數,把所有激活函數換回硬體支援的ReLU重新訓練後,又适配了AnchorInit、候選框生成、NMS等後處理算法,我在VisionSeed上成功跑通了全尺寸的YOLOv4,以512x288的輸入分辨率進行推理耗時是464ms,雙核跑滿能跑到4fps。

進一步優化,我想到了MobileNet提出的一個機制:按比例縮減每一層的channel數量,MobileNet提出了一個alpha值,分别有0.25、0.5、0.75和1.0,例如MobileNet-0.25就是将channel數量縮減到原來的1/4,推理速度提升約4倍,模型大小則降低了16倍!

在此提出YOLOv4-nano系列,相對原版進行了兩方面改動:将所有的激活函數換成ReLU以便于NPU加速;對骨幹網絡的channel數進行按比例縮減。與YOLOv3的tiny系列不同,nano保留了骨幹網絡的各級殘差結構,網絡深度不變。并且channel縮減系數比較靈活,對于算力更弱的平台,甚至可以嘗試YOLOv4-nano-0.125

經過實驗,

YOLOv4-nano

系列在VisionSeed模組上的單幀耗時如下(512x288)

+--------------+--------+------------------+-----------------+-----------------+
|  VisionSeed  | YOLOv4 | YOLOv4-nano-0.25 | YOLOv4-nano-0.5 | YOLOv4-nano-1.0 |
+--------------+--------+------------------+-----------------+-----------------+
| time         |      - |            0.114 |           0.211 |           0.464 |
| FPS(2-cores) |      - |               15 |               8 |               4 |
| size(fp16)   |  123MB |            7.6MB |            31MB |           123MB |
+--------------+--------+------------------+-----------------+-----------------+
           

替換激活函數、縮減channel數量對算法名額有多大影響呢?經過實驗,我訓練的人貓狗三類目标檢測模型所有激活函數替換為ReLU後[email protected]從0.83降低到0.82,還算可以接受,最快的YOLOv4-nano-0.25 mAP進一步降低到0.74,相對原版降低9個百分點,但速度有了4倍的提升。

YOLOv4-nano

系列在MS COCO 2017上隻檢測人、貓、狗三類的mAP詳細名額如下:

+------------+--------+------------------+-----------------+-----------------+
|  [email protected]   | YOLOv4 | YOLOv4-nano-0.25 | YOLOv4-nano-0.5 | YOLOv4-nano-1.0 |
+------------+--------+------------------+-----------------+-----------------+
| all        |   0.83 |             0.74 |            0.78 |            0.82 |
+------------+--------+------------------+-----------------+-----------------+
| person     |   0.76 |             0.67 |            0.73 |            0.75 |
| cat        |   0.91 |             0.84 |            0.84 |            0.90 |
| dog        |   0.81 |             0.70 |            0.75 |            0.80 |
+------------+--------+------------------+-----------------+-----------------+
           

訓練過程loss和mAP變化曲線:

yolo4 coco 預訓練權重_訓練一個跑在嵌入式環境的YOLOv4模型檢測人,貓,狗

YOLOv4訓練曲線

yolo4 coco 預訓練權重_訓練一個跑在嵌入式環境的YOLOv4模型檢測人,貓,狗

YOLOv4-nano025訓練曲線

找一個連續運動視訊看看效果:

yolo4 coco 預訓練權重_訓練一個跑在嵌入式環境的YOLOv4模型檢測人,貓,狗

訓練一個跑在嵌入式環境的YOLOv4https://www.zhihu.com/video/1250918564099485696

如果你也想訓練自己感興趣目标的檢測器放到這個小模組中運作,那就開始動手吧。在上一篇文章中,配置好了Ubuntu 18.04 CUDA 10.0的編譯運作環境,為編譯最新的Darknet鋪平了道路。

我把本文描述的所有更改,以Makefile/bash腳本的形式開源到https://github.com/liangchen-harold/yolo4-nano.git(歡迎加星),按照如下方式可開箱即用:

# 安裝依賴
sudo apt install libopencv-dev

# 下載下傳我github上的YOLOv4-nano輕量級腳本,對原版配置檔案自動修改
git clone liangchen-harold/yolo4-nano
cd yolo4-nano
make install

# 下載下傳MS COCO 2017資料集,解壓縮到datasets/coco2017中,檔案夾結構如:
datasets/
└── coco2017/
    ├── annotations/
    │   ├── instances_train2017.json
    │   └── instances_val2017.json
    └── images/
        ├── train2017/
        │   ├── 000000000139.jpg
        │   └── ...
        └── val2017/
            ├── 000000000009.jpg
            └── ...


# 編輯Makefile
# 1.選擇你需要的類别,替換第5行預設的CLS=cat dog
# 2.如果需要嘗試不同的大小,調整第13行的NANO=0.25
# 更改過CLS後,一定要運作:
make data

# 開始訓練
make train

# 訓練完成後,可以輸出詳細AP資訊
make validation

# 也可以放一個test.mp4檔案後執行
make inference
           

如果你有訓練好的模型,希望放到VisionSeed中運作,可以留言附上make validation擷取的AP資訊,擷取内測資格哦~