一步一步教你如何将 yolov3/yolov4 转为 caffe 模型
實(shí)際工作中,目標(biāo)檢測 yolov3 或者 yolov4 模型移植到 AI 芯片中,經(jīng)常需要將其先轉(zhuǎn)換為 caffe1.x 模型,大家可能或多或少也有這方面的需求。例如華為海思 NNIE 只支持caffe1.x 模型,所以 yolov3/yolov4 模型要想在海思芯片上部署,轉(zhuǎn)換為 caffe1.x 模型是必須的。
今天,專門給大家寫一下將? yolov3/yolov4 模型轉(zhuǎn)為 caffe 模型的詳細(xì)步驟。
0.?系統(tǒng)環(huán)境
Ubuntu 16.04
cuda?9.x
1. 部署 caffe 環(huán)境
常規(guī)的方法是下載 caffe 的源碼,進(jìn)行編譯安裝。但是,這種方法比較復(fù)雜,不太容易成功。更簡單的方法是直接下載 caffe1.x 的docker 鏡像。這種方法需要你提前在 Ubuntu 里安裝了 nvidia-docker。
打開 docker hub 網(wǎng)站:
https://registry.hub.docker.com/
搜索 caffe,看到這個(gè)鏡像:
點(diǎn)擊進(jìn)去,看到該鏡像的下拉命令:
打開 Ubuntu 終端,輸入上面的下拉命令,將 caffe 的 docker 鏡像下載下來。
下載完成之后,終端輸入命令:
就可以看到已下載的 caffe 鏡像了。
為鏡像創(chuàng)建容器:
這里我們給該容器起的名字是 caffe,大家可以自由設(shè)置,根據(jù)?`sudo docker ps -a` 這條命令來查看各個(gè)容器。
這樣,我們就進(jìn)入了 caffe1.x 的 docker 容器之內(nèi)了。
該容器已部署好了 caffe1.x,caffe1.x 路徑為:
2. caffe 源碼修改
因?yàn)楣俜?caffe1.x 框架不支持 yolo3/yolov4 的 upsample 層,所以需要手動(dòng)增加 upsample 層,對 caffe 源碼進(jìn)行修改。
克隆 GitHub 上的轉(zhuǎn)換工具項(xiàng)目:
將?darknet2caffe/caffe_layers/mish_layer?下的?mish_layer.hpp?文件和 darknet2caffe/tree/master/caffe_layers/upsample_layer 下的?upsample_layer.hpp? 拷貝到容器的路徑:/opt/caffe/include/caffe/layers??下。
將?darknet2caffe/caffe_layers/mish_layer?下的?mish_layer.cpp、mish_layer.cu?文件和 darknet2caffe/tree/master/caffe_layers/upsample_layer 下的?upsample_layer.cpp、upsample_layer.cu? 拷貝到容器的路徑:/opt/caffe/src/caffe/layers/??下。
將?darknet2caffe/caffe_layers/pooling_layer?下的?pooling_layer.cpp?拷貝到容器的路徑:/opt/caffe/src/caffe/layers/??下。
然后,打開容器內(nèi)的 caffe 文件:/opt/caffe/src/caffe/proto/caffe.proto。按照如下說明修改相應(yīng)字段的程序。
// LayerParameter next available layer-specific ID: 147 (last added: recurrent_param) message LayerParameter {optional TileParameter tile_param = 138;optional VideoDataParameter video_data_param = 207;optional WindowDataParameter window_data_param = 129; ++optional UpsampleParameter upsample_param = 149; //added by chen for Yolov3, make sure this id 149 not the same as before. ++optional MishParameter mish_param = 150; //added by chen for yolov4,make sure this id 150 not the same as before. }// added by chen for YoloV3 ++message UpsampleParameter{ ++ optional int32 scale = 1 [default = 1]; ++}// Message that stores parameters used by MishLayer ++message MishParameter { ++ enum Engine { ++ DEFAULT = 0; ++ CAFFE = 1; ++ CUDNN = 2; ++ } ++ optional Engine engine = 2 [default = DEFAULT]; ++}其中,++ 表示該行是增加的內(nèi)容。
3. caffe 重新編譯
修改完 caffe 的一些源碼之后,需要對 caffe 重新編譯。
進(jìn)入?/opt/caffe/build 目錄,輸入以下命令:
make clean make all -j8 make pycaffe -j8caffe 重新編譯之后,就可以對 yolov3/yolov4 模型進(jìn)行 caffe 轉(zhuǎn)換了。
4.?模型轉(zhuǎn)換
準(zhǔn)備好我們已有的 yolov3 模型的配置文件和權(quán)重文件,例如:yolov3.cfg 和 yolov3.weights。在?darknet2caffe?目錄下,輸入以下命令:
python darknet2caffe.py ./yolov3.cfg ./yolov3.weights ./yolov3.prototxt ./yolov3.caffemodel如果輸出類似下面的語句,則證明轉(zhuǎn)換成功!
其中,yolov3.prototxt 和 yolov3.caffemodel 為轉(zhuǎn)換后的 caffe 模型。
至此,yolov3/yolov4 轉(zhuǎn)換為 caffe 模型完成!
AI 角:機(jī)器人遛彎
總結(jié)
以上是生活随笔為你收集整理的一步一步教你如何将 yolov3/yolov4 转为 caffe 模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国十大穷光蛋排行榜
- 下一篇: 体验C++20新特性的最简便方法