Caffe中适配Movidius神经计算棒的无DummyData Crop层实现问题
解决Caffe适配Movidius时无需DummyData/Input层的裁剪问题
我之前在适配Movidius神经计算棒的时候也遇到过类似的麻烦——毕竟Movidius对生成类的层(比如DummyData、Input)支持确实有限。这里有几个实用的方法可以帮你完成中间输出的裁剪,完全不需要依赖这些不被支持的层:
方法1:利用现有层的输出作为Crop层的参考Blob
Crop层的核心是需要一个参考形状来对齐裁剪后的尺寸,不一定非要用DummyData或Input层生成的Blob。如果你网络里已经有某个层的输出形状和你想要裁剪后的目标形状一致(或者通过简单调整就能匹配),直接把它作为Crop层的第二个输入即可。
举个prototxt配置的例子:
# 假设你有一个已有的卷积层,其输出形状是你想要裁剪后的目标形状 layer { name: "conv_target_shape" type: "Convolution" bottom: "data" top: "conv_target_shape" # 这里的参数要保证输出形状和你裁剪后的目标一致 convolution_param { num_output: 64 kernel_size: 3 stride: 1 pad: 1 } } # 裁剪你的中间输出 layer { name: "crop_intermediate" type: "Crop" bottom: "your_intermediate_feature" # 需要裁剪的中间输出Blob bottom: "conv_target_shape" # 用现有层的输出作为参考形状 top: "cropped_feature" crop_param { # 如果需要调整裁剪的起始位置,设置offset参数,比如[0, 0, 5, 5]表示H和W维度各偏移5个像素 offset: 0 offset: 0 offset: 5 offset: 5 } }
如果现有层的形状和目标尺寸不完全匹配,可以先通过Pooling或Resize层调整它的形状,再作为Crop的参考。
方法2:用Slice层直接指定裁剪范围(完全无需参考Blob)
如果你明确知道要裁剪的具体区域(比如在H/W维度上的起始和结束索引),用Slice层是最直接的方案——它不需要任何参考Blob,只要指定要切割的轴和范围就行,而且Movidius对Slice层的支持非常好。
比如你的中间输出形状是N,C,40,50,想要裁剪H维度的10-30区域、W维度的20-40区域,配置如下:
# 第一步:裁剪H维度(轴索引为2,因为Caffe的Blob形状是[N,C,H,W],索引从0开始) layer { name: "slice_h" type: "Slice" bottom: "your_intermediate_feature" top: "slice_h_result" slice_param { axis: 2 start: 10 end: 30 } } # 第二步:裁剪W维度(轴索引为3) layer { name: "slice_w" type: "Slice" bottom: "slice_h_result" top: "final_cropped_feature" slice_param { axis: 3 start: 20 end: 40 } }
这种方法的优势是完全独立,不需要依赖任何其他层的形状,只要你清楚自己需要裁剪的区域就行。
额外注意事项
- 先在CPU/GPU模式下测试:在部署到Movidius之前,先用Caffe的CPU或GPU版本验证裁剪后的Blob形状是否符合预期,避免因为形状不匹配导致部署失败。
- 确认Movidius支持的层:Slice和基于现有参考的Crop层都是Movidius NCS支持的标准层,不用担心兼容性问题;但要避免用一些自定义层或者生成类的层。
内容的提问来源于stack exchange,提问作者Gionata Benelli
相关产品推荐
相关产品推荐

