1. 程式人生 > >深度學習目標檢測 caffe下 yolo-v1 yolo-v2 vgg16-ssd squeezenet-ssd mobilenet-v1-ssd mobilenet-v12-ssd

深度學習目標檢測 caffe下 yolo-v1 yolo-v2 vgg16-ssd squeezenet-ssd mobilenet-v1-ssd mobilenet-v12-ssd

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格式 ;

      基於上述換成的模型引數的基礎上進行訓練;

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檔案

2、預訓練模型權重檔案可下載VGG_ILSVRC_16_layers_fc_reduced.caffemodel  

點選開啟連結  casdn上也有

2.2、squeezeNet-SSD

我的 github參考 點選開啟連結

參考原作者 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程式碼  點選開啟連結

含有網路的前部分的 權重檔案這裡需要重新編譯 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卷積起始就是分組卷積的特殊情況,當分組數量等於 輸入資料的通道數量時。
shuffle_channel層 ,還添加了 DW卷積層 其實這裡可以不用,
就用普通的卷積層代替,新增一個group引數,且數值為 上一層的輸出通道數量