实例分割solov2部署(pytorch-caffe-D)

举报
糖糖糖@糖 发表于 2021/10/12 19:28:45 2021/10/12
【摘要】  运行环境• D芯片:D310• GPU:M40 torch>caffe• Baseline: https://github.com/xxradon/PytorchToCaffe• pytorch_to_caffe.py定义了torch到caffe的替换操作• pytorch_to_caffe.py具体替换操作的实现:• layer_param.py定义了torch到caffe参数的转换...

 运行环境
• D芯片:D310
• GPU:M40


 torch>caffe
• Baseline: https://github.com/xxradon/PytorchToCaffe
• pytorch_to_caffe.py定义了torch到caffe的替换操作


• pytorch_to_caffe.py具体替换操作的实现:

• layer_param.py定义了torch到caffe参数的转换


 Solov2采坑记录
• Caffe中不支持torch.linspace(),torch.meshgrid()
原始torch代码如下,即对一个featuremap进行密集网格划分,得到归一化的x,y坐标,拼接到featuremap上。

caffe算子要求所有输入是由前面网络传递的(已存在的),除了卷积操作的weight,bias;Scale操作的weight,bias参数等,支持生成
这里我们分以下几步实现该功能:
首先构建1w11和1h11维度的等分矩阵

将等分矩阵通过与全1矩阵的点乘操作,维度自动扩展,再将维度变换成最终形态,即1wch1w11 = 1wch>1chw,1hcw1h11=1hcw>1chw
全1矩阵的维度为1chw,通过已有特征的卷积实现,此处不能torch.ones(),caffe不支持。


另:原始troch转caffe的mul只实现了等维度矩阵点乘,这里维度自动扩充的点乘需用caffe中的scale实现,添加如下

• 插值相关操作F. interpolate()
上采样插值:
om算子用unsample替代,仅支持scale_factor整数倍上采样,不支持size格式;上采样方式为nearest,不支持其他
下采样插值:
用max_pooling或avg_pooling替换。Pooling操作支持长宽kernel,pad,stride不一致。
原始torch到caffe参数的转换仅支持长宽参数一致,需要更改参数传递部分代码如下

• 布尔索引

om算子不支持布尔索引,可利用relu实现,更改为:
heat = heat*F.relu(heat - hmax + 1e-7) * 1e7
矩阵加减一个数可以仿照上面mul的scale实现
• 动态卷积
这里我们只涉及卷积核为1 * 1,步长为1的卷积。输入seg_preds为[1,c,h,w],卷积核kernel_preds为[in_c,out_c,1,1],这次由于out_c不定,因此不能转om

思考卷积过程,可以将上面操作转化为矩阵相乘如下:

• Caffe不支持所有切片操作,需转化为对应维度的split操作


 结果对比
表 solov2推理时间指标对比

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。