Caffe(12) 實現YOLOv2目標檢測

2021-08-28 22:51:04 字數 3204 閱讀 8170

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新加層實現是否正確。

yolov1主要是需要實現detection層,再就是yolo系列中使用的啟用函式是leaky,可以選擇單獨實現,也可以用relu實現(配置引數)。

leaky層原始碼實現資源

detection層原始碼實現資源

leaky層的新增和detection層是一致的,具體實現參考:

(1)yolov1的detection層實現

(2)實現yolov1目標檢測

注:該detection的實現不支援gpu模式,通過這裡初步了解caffe下原始碼實現新增新層也還是可以的。

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

還不錯的幾個實現

(1)(2)caffe原始碼:

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

結合前人成果,整理得到目前可用的caffe原始碼:已經包含了yolo一些層的實現)

具體步驟如下(以yolov2_tiny為例):

(1)訓練yolov2_tiny,在darknet下完成,參考官網,

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

下圖中,對於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模型權重檔案

(3)模型轉換

使用指令碼將.cfg檔案和.weights檔案轉換為.prototxt檔案和.caffemodel檔案

模型轉換參考

(4)在caffe框架下進行測試

2)解壓得到資料夾caffe_yolov2-master

3)編譯安裝

make all -j8

sudo make pycaffe -j8

具體參考:

編譯過程中有warning,但不影響。

4)測試

進入caffe_yolov2-master/examples/yolov2目錄下,執行命令:python detect.py

注:具體測試時使用的資料集,以及測多少張等,自行在指令碼detect.py中進行修改。

YOLO v2 檢測原理

v2版本的優化目標 改善召回率,提公升定位精度,保證分類準確度。yolov2相比yolov1的改進 v2在每乙個卷積之後增加了bn層,提高了網路訓練的速度,加快了收斂,消除了對其他正則化的依賴,且正則化效果更好,使調參更簡單,即使去掉dropout層也不會產生過擬合。v1先使用224 224的解析度...

YOLOV2演算法筆記

yolov2演算法詳解部落格 一 better 1.對每一層都做了歸一化 2.先利用分類資料對網路進行訓練,然後遷移學習。3.不再和yolov1那樣直接 bounding box,yolov2中開始利用ancher box,4.dimension clusters,利用k means聚類的方式,發現...

Yolo v2 多版本安裝

1 vs2015 opencv3.2 geforce gt 1030 c 編譯 github vs2015安裝 opencv3.2配置 cuda選擇9.0,cudnn配套 配置和編譯 雙擊 darknet master build darknet darknet.sln 如果沒有gpu採用darkn...