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...