pytorch-YOLOv3移植到寒武纪

pytorch-YOLOv3移植到寒武纪

参考
新建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大小

    • image-20210716225352098
  • 如此依赖便算是配置好了,运行./inference.sh应该就可以成功了

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰子奶糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值