pytorch-YOLOv3移植到寒武纪
参考
- 1、Darknet2Caffe 大概步骤
- 2、ChenYingpeng/darknet2caffe
- 3、基于Docker的Caffe编译(CUDA11的makefile版)
- caffe的编译是用我的这个博客,只用到caffe编译部分:
- 4、官方镜像园
- 5、ImportError:No module named builtins
新建docker
-
裸机也可以哈,但是实验室的服务器不太好乱搞,就用了docker
-
#!/bin/bash export MY_CONTAINER="darknet2caffe" num=`sudo docker ps -a|grep "$MY_CONTAINER"|wc -l` echo $num echo $MY_CONTAINER if [ 0 -eq $num ]; then sudo docker run --gpus all \ --ipc=host \ -it \ --privileged \ --name $MY_CONTAINER \ -v $PWD/caffe-env:/home/caffe-env \ -w /home/caffe-env \ 4d1a8aaef572 \ /bin/bash echo $MY_CONTAINER else sudo docker start $MY_CONTAINER sudo docker exec -w /home/R2CNN -ti $MY_CONTAINER /bin/bash fi
-
主体逻辑其实十分简单,查看有没有容器名相同的容器,有的话直接start&exec,没有就run一个,并制定映射目录和工作目录
-
4d1a8aaef572是我自己保存的caffe镜像,并没有上传,cuda11的话可以用这个代替:0ec3cd91fe0b,纯净的cuda11,然后看一下基于Docker的Caffe编译(CUDA11的makefile版)配置
make caffe
-
我直接复制了一份基于Docker的Caffe编译(CUDA11的makefile版)配置好的caffe来make,省去了很多配置的时间,大概指令就是:
-
make all make runtest make pycaffe
-
如果遇到
ImportError: No module named caffe
的话,可能是没有指定caffe的地址export PYTHONPATH=/your-caffe-root/caffe/python:$PYTHONPATH
caffe扩展
-
根据ChenYingpeng/darknet2caffe的readme中提到
-
#1、Copy caffe_layers/mish_layer/mish_layer.hpp,caffe_layers/upsample_layer/upsample_layer.hpp into include/caffe/layers/. #2、Copy caffe_layers/mish_layer/mish_layer.cpp mish_layer.cu,caffe_layers/upsample_layer/upsample_layer.cpp upsample_layer.cu into src/caffe/layers/. #3、Copy caffe_layers/pooling_layer/pooling_layer.cpp into src/caffe/layers/.Note:only work for yolov3-tiny,use with caution. #4、Add below code into src/caffe/proto/caffe.proto. / 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; # 注意这里指的是在LayerParameter里面加上下面两行,149和150可以自定只要caffe.proto.里面没有就行 ++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 # 注意这里指的是加上新类,caffe原本没有Upsample,需要加上 ++message UpsampleParameter{ ++ optional int32 scale = 1 [default = 1]; ++} # 这个是给YOLO-tiny用的 // Message that stores parameters used by MishLayer ++message MishParameter { ++ enum Engine { ++ DEFAULT = 0; ++ CAFFE = 1; ++ CUDNN = 2; ++ } ++ optional Engine engine = 2 [default = DEFAULT]; ++}
-
然后重新编译,可以大胆的用-j8来加速
-
pip install torch
- 由于是py2,因此从官方镜像园中找一个适合py27的torch.whl直接本地pip即可
- torchvision的话等待pytorch安装完成之后再直接
pip install torchvision
即可安装兼容的版本 - 可能会遇到:
ImportError:No module named builtins
,这时候pip install future
即可
转换结果修改
-
在寒武纪中的caffe的配置方式有稍许不同
-
layer { bottom: "layer70-conv" top: "layer71-upsample" name: "layer71-upsample" type: "Upsample" upsample_param { scale: 2 } } # 这个层相当于Upsample层,原本参数是scale: 2,但是这里需要换成上采样的结果(前两维),这就需要稍微根据网络计算一下了,YOLO v3一共有两处,改法相同 layer { bottom: "layer70-conv" top: "layer71-upsample" name: "layer71-upsample" type: "Interp" interp_param { height: 50 width: 50 } }
-
由于转换得来的prototxt没有yolo层,于是在inference中得自己做后处理,由于我的模型是剪枝过的模型,layer层数与一般的YOLO不同,这里是写死的,于是需要对应改一下层名,以及anchor大小
-
如此依赖便算是配置好了,运行
./inference.sh
应该就可以成功了