Caffe(12)--實現YOLOv2目標檢測

https://github.com/lwplw/caffe_yolov2

DarkNet轉Caffe中有很多潛在的問題,在YOLOv1、v2、v3幾個網絡中有一些特殊的層。要在Caffe中跑YOLO,就得在Caffe中源碼實現這些層。這些層的Caffe源碼實現可以在網上找到很多。

YOLO特殊層的Caffe框架實現
YOLOv1 detection層 源碼實現
YOLOv2 route層 用concat層替換
reorg層 源碼實現
region層 源碼實現
YOLOv3 shortcut層 用eltwise層實現
route層 用concat層實現
yolo層 源碼實現

在Caffe平臺實現YOLO系列,可以分成以下兩種方式:
(1)DarkNet平臺訓練完成YOLO模型,然後將.cfg文件.weights文件通過腳本轉換爲Caffe框架下的.prototxt文件.caffemodel文件,最後在Caffe下使用轉換好的.prototxt文件.caffemodel文件進行目標檢測任務。
(2)手動寫好.prototxt模型結構文件,直接在Caffe下進行訓練,訓練完成後進行目標檢測任務。

以上兩種方式,都是以當前Caffe已經源碼實現上面那幾個特殊層爲前提。

具體按哪種方式看自己實際需求,比如,我現在是已經有在DarkNet下訓練好可用YOLOv2_tiny模型,所以我選擇將訓練好的模型轉換到Caffe再使用,而不是從頭訓練。個人感覺YOLO在原生框架DarkNet下訓練起來更方便一些,更重要的是,在Caffe實現YOLO後可以將中間參數以及輸出結果拿出來,再和DarkNet下的YOLO做對比分析,這點還是很關鍵的,相同的模型結構和權重參數,經過對比可以很清楚的知道轉換是否正確、Caffe新加層實現是否正確。

1、YOLOv1

YOLOv1主要是需要實現detection層,再就是YOLO系列中使用的激活函數是Leaky,可以選擇單獨實現,也可以用ReLU實現(配置參數)。

Leaky層源碼實現資源https://download.csdn.net/download/lwplwf/10712919
detection層源碼實現資源https://download.csdn.net/download/lwplwf/10712961

Leaky層的添加和detection層是一致的,具體實現參考:
(1)YOLOv1的Detection層實現https://blog.csdn.net/lwplwf/article/details/82788376
(2)實現YOLOv1目標檢測https://blog.csdn.net/lwplwf/article/details/82685347
注:該detection的實現不支持GPU模式,通過這裏初步瞭解Caffe下源碼實現添加新層也還是可以的。

2、YOLOv2

重點說YOLOv2的實現,YOLOv2的Caffe實現就已經很多了,網上可以找到很多個版本,都挺好的,但也都存在的不同的問題。

還不錯的幾個實現
(1)https://github.com/gklz1982/caffe-yolov2
(2)Caffe源碼:https://github.com/hustzxd/z0
相關轉換工具:https://github.com/hustzxd/z1
(3)https://github.com/marvis/pytorch-caffe-darknet-convert

上面幾個都有很大的參考價值,綜合以上和其他一些實現,踩了很多坑,總算是把這條路走下來了。

結合前人成果,整理得到目前可用的Caffe源碼:https://github.com/lwplw/caffe_yolov2,(已經包含了YOLO一些層的實現)

具體步驟如下(以YOLOv2_tiny爲例):

(1)訓練YOLOv2_tiny,在DarkNet下完成,參考官網,https://pjreddie.com/darknet/yolo/

這裏有個問題需要注意!!!

下圖中,對於YOLOv2_tiny,416*416的輸入,經過最後一個max pool(size=2,stride=1),可以看到特徵圖13*13處理後還是13*13
這就有點問題了,測試發現,Caffe中經過這一層特徵圖由13*13變成了12*12,會導致在Caffe下檢測結果的box有偏差。
在這裏插入圖片描述
在這裏插入圖片描述

解決方案:對這層max pool使用pad,由於Caffe和DarkNet對pool的處理邏輯有些差異,需要指定DarkNet中該層padding=2,Caffe種該層pad=1

去看DarkNet源碼maxpool_layer.c發現:
在這裏插入圖片描述
簡單說一下,在DarkNet中有pad和padding兩個東西,是不一樣的,重點體現在卷積層中,而對於池化層就沒那麼複雜了,用padding指定參數就行。
在這裏插入圖片描述
處理之後,經該max pool層處理特徵圖會由13*13變爲14*14,DarkNet和Caffe兩個框架下達成統一。

(2)訓練完成後得到.weights模型權重文件
可以先在DarkNet下進行測試:
測試腳本下載https://download.csdn.net/download/lwplwf/10723849

(3)模型轉換
使用腳本將.cfg文件和.weights文件轉換爲.prototxt文件和.caffemodel文件
模型轉換參考https://github.com/lwplw/darknet2caffe

(4)在Caffe框架下進行測試
1)下載caffe_yolov2源碼:https://github.com/lwplw/caffe_yolov2
2)解壓得到文件夾caffe_yolov2-master
3)編譯安裝

make all -j8
sudo make pycaffe -j8

具體參考:https://blog.csdn.net/lwplwf/article/details/82415620
編譯過程中有warning,但不影響。

4)測試
進入caffe_yolov2-master/examples/yolov2目錄下,執行命令:python detect.py
注:具體測試時使用的數據集,以及測多少張等,自行在腳本detect.py中進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章