1、caffe下yolo系列的實現
1.1 caffe-yolo-v1
我的github代碼 點擊打開鏈接
參考代碼 點擊打開鏈接
yolo-v1 darknet主頁 點擊打開鏈接
上面的caffe版本較老。對新版的cudnn支持不好,可能編譯出錯,需要修改 cudnn.hpp頭文件在次進行編譯,
修改後的cudnn.hpp文件,可在我的github主頁找到。
步驟:
0、voc數據集轉換成 caffe下數據庫格式文件,上述github也有記錄;
1、可以根據yolov1-cfg網絡配置文件寫出caffe的網絡配置文件prototex格式 ;
2、使用模型參數轉換工具,將yolov1.weights 轉換成 caffemodel格式 ;
3、可以使用 測試網絡gnet_test.prototxt 訓練配置成參數gnet_solver.prototxt 訓練網絡gnet_train.prototxt
基於上述換成的模型參數的基礎上進行訓練;
4、注意原作者給出的 yolov1.weights yolov1-cfg是 在voc數據集上訓練的,目標種類20;
1.2 caffe-yolo-v2
我的github代碼 點擊打開鏈接
參考代碼 點擊打開鏈接
yolo-v2 darknet主頁 點擊打開鏈接
步驟上述 yolo-v1-caffe的步驟類似。
需要注意的是,原作者給出的有好多種網絡框架以及對應的網絡參數權重文件
常用的是 基於voc數據集(20類) 和 coco數據集(80類)不過這些的網絡主題沒什麼區別,主要是最後幾層網絡分類輸出是類別數量不同,卷積核數量有所不同。
1.3 caffe-yolo-v3 後面補上
2、SSD目標檢測框架
2.1、原作者VGG16-SSD
我的github代碼 點擊打開鏈接
原作caffe代碼 點擊打開鏈接
VGG16框架 以及SSD結構請參考上述github以及網絡資源和論文等資料
步驟:
0、創建符合ssd的訓練圖片數據庫文件
參考原作caffe代碼
./data/VOC0712/create_list.sh
1、使用作者提供的 ssd_pascal.py 文件生成基於pascal VOC數據集的 VGG16-SSD目標檢測的
一系列配置文件,包括訓練、測試、檢測網絡框架prototex文件
以及訓練參數文件 ssd_33_solver.prototxt
還有 目標檢測腳本 ssd_detect.py
2、預訓練模型權重文件可下載VGG_ILSVRC_16_layers_fc_reduced.caffemodel 點擊打開鏈接 casdn上也有
3、使用 VGG_VOC0712_SSD_300x300.sh 腳本進行訓練
2.2、squeezeNet-SSD
我的 github參考 點擊打開鏈接
SqueezeNet-V1 V2 原作者caffe參考 點擊打開鏈接
參考原作者 VGG16-SSD 的網絡配置文件以及 squeezeNet的網路配置文件
寫出自己的 squeezeNet-SSD配置文件。
注意 網絡的前部分 squeezeNet的各層名字應該與 squeezeNet的網路配置文件相同,
這樣可以基於 squeezeNet的權重文件進行訓練。
2.3、MobileNet-SSD
我的 github參考 點擊打開鏈接
MobileNet
步驟:
參考原作者 VGG16-SSD 的網絡配置文件以及 MobileNet 的網路配置文件
寫出自己的 MobileNet-SSD配置文件。這也有V1和V2版本
注意點與上面的一樣。
2、4 shuffleNet-ssd
參考:
shuffleNet caffe代碼 點擊打開鏈接
含有網絡的前部分的 權重文件
shufflenet-ssd 點擊打開鏈接
我修改後的shufflenet-ssd 點擊打開鏈接
這裏需要重新編譯 caffe-ssd 源碼,添加
-
通道重排層的 三個文件 :
-
shuffle_channel_layer.cpp
-
shuffle_channel_layer.cu
-
shuffle_channel_layer.hpp
修改 caffe.proto文件
-
message LayerParameter {
-
...
-
optional ShuffleChannelParameter shuffle_channel_param = 164;
-
...
-
}
-
...
-
message ShuffleChannelParameter {
-
optional uint32 group = 1[default = 1]; // The number of group
-
}
重新編譯
-
make clean
-
make all -j
-
make pycaffe
這裏需要注意的是:
組通道卷積DW卷積起始就是分組卷積的特殊情況,當分組數量等於 輸入數據的通道數量時。
有的 shufflenet 除了添加了
shuffle_channel層 ,還添加了
DW卷積層 其實這裏可以不用,
就用普通的卷積層代替,添加一個group參數,且數值爲 上一層的輸出通道數量