实例分割solov2部署(pytorch-caffe-D)
运行环境
• 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推理时间指标对比
- 点赞
- 收藏
- 关注作者
评论(0)