角蜂鸟现支持转换Caffe与Tensorflow(TF)模型,其他框架,如MXNet、Darknet(YOLO)、PyTorch等需要先通过其他工具转换为Caffe或TF模型。对于使用过NCS的用户,本工具的使用方式基本与NCSDK中模型转换工具相同。
转换工具基于NCSDK修改、于Python实现,已加入最新的 SungemSDK-Python ,如已下载旧版本只需更新即可使用转换工具。
转换工具位于 SungemSDK-Python 的 tool 子文件夹下。
tool的目录结构如下所示:
tool
├── Controllers # 模型解析库(从NCSDK移植)
├── Models # 模型层定义、设备参数配置、功能库等(从NCSDK移植)
├── Views # 可视化、日志输出(从NCSDK移植)
├── caffe # 简易版Caffe-SSD用于本地编译CPU版本做模型验证
└── example # Caffe、TF模型,用于转换范例
目前只测试于 Ubuntu 16.04,其他平台理论上可行。
注意:graphviz可能需要apt安装
pip3 install graphviz, pyyaml
注意:Makefile.config已根据转换工具的需求重新配置过,但仍有可能遇到Caffe编译不通过的情况。
如遇见libboost错误可参考以下解决方式:
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libboost_python-py35.so libboost_python3.so
其他编译问题可参考网上其他教程或在交流群寻求帮助。
cd caffe
make -j
make pycaffe
请参考官方 Tensorflow安装教程 。
此脚本转换Caffe或Tensorflow模型到角蜂鸟Graph模型,无需连接角蜂鸟也可使用。 使用说明如下:
python3 mvNCCompile.py network # network 为模型文件,如 *.prototxt(Caffe)* 或 *.meta(Tensorflow)*
-h # 显示帮助信息
-w WEIGHTS # 模型权重文件(Caffe), 如 *.caffemodel*
-in INPUTNODE # 输入节点名称,默认Caffe为 *data*, TF为 *input*
-on OUTPUTNODE # 输出节点名称,默认Caffe为最后一层,TF为 *output*
-o OUTFILE # 输出HS Graph路径
-s NSHAVES # 使用Movidius的Shave数量,建议为8,默认为1
-is INPUTSIZE INPUTSIZE # 更改输入网络尺寸,默认为网络输入尺寸。
范例: 在 tool 子文件夹下执行:
python3 mvNCCompile.py example/deploy.prototxt -w example/deploy.caffemodel -o example/graph_mnist -s 8
-----------
mvNCCompile v02.00, Copyright @ Movidius Ltd 2016
...
生成mnist的HS Graph: graph_mnist
此脚本用途为验证生成Graph与原模型是否输出一致。
此验证脚本机制为输入随机数或图像,通过欧式距离与排序分析转换前后模型的输出误差。
注意:模型或转换工具的错误可能导致输出结果全部为0, 会因输出一致而误判为通过验证。
因为硬件与NCSDK的限制,部分Caffe/Tensorflow的网络层或计算子不支持或实现与原模型不一致,可导致验证失败。这种情况建议检查是否原模型有自定义的非标准层,可尝试调整网络结构重新训练。
另外,因为角蜂鸟所使用的芯片全部基于半精度计算(FP16),部分网络会因此产生较大误差,尤其是较深的网络。有可能造成未通过验证但实际模型可用,可通过输出日志来自行判断。
使用说明如下:
python3 mvNCCheck.py network # network 为模型文件,如 *.prototxt(Caffe)* 或 *.meta(Tensorflow)*
-h # 显示帮助信息
-w WEIGHTS # 模型权重文件(Caffe), 如 *.caffemodel*
-in INPUTNODE # 输入节点名称,默认Caffe为 *data*, TF为 *input*
-on OUTPUTNODE # 输出节点名称,默认Caffe为最后一层,TF为 *output*
-s NSHAVES # 使用Movidius的Shave数量,建议为8,默认为1
-is INPUTSIZE INPUTSIZE # 更改输入网络尺寸,默认为网络输入尺寸。
-i IMAGE # 验证用图片,默认为随机浮点数
-S SCALE # 前处理Scale设定,默认为1
-M MEAN # 前处理Mean设定,默认为0, 在乘scale后计算
-cs [CHANNEL_SWAP] # 默认网络输入BGR [2,1,0], 可改为RGB [0,1,2]
-metric METRIC # 验证Metric,可用top1, top5, accuracy_metrics, ssd_pred_metric,适用于不同网络类型,默认为top1
范例: 在 tool 子文件夹下执行:
python3 mvNCCheck.py example/deploy.prototxt -w example/deploy.caffemodel
-----------
mvNCCompile v02.00, Copyright @ Movidius Ltd 2016
...
USB: Transferring Data...
USB: Myriad Execution Finished
USB: Myriad Connection Closing.
USB: Myriad Connection Closed.
Result: (10,)
1) 3 8.3
2) 8 4.64
3) 2 4.617
4) 5 3.217
5) 7 1.299
Expected: (10,)
1) 3 8.3
2) 8 4.637
3) 2 4.61
4) 5 3.21
5) 7 1.303
------------------------------------------------------------
Obtained values
------------------------------------------------------------
Obtained Min Pixel Accuracy: 0.14124293811619282% (max allowed=2%), Pass
Obtained Average Pixel Accuracy: 0.06709039444103837% (max allowed=1%), Pass
Obtained Percentage of wrong values: 0.0% (max allowed=0%), Pass
Obtained Pixel-wise L2 error: 0.07816364273015063% (max allowed=1%), Pass
Obtained Global Sum Difference: 0.0556640625
------------------------------------------------------------
结果显示转换后Graph与Caffe输出基本一致,误差极小,此模型可用于角蜂鸟。
此脚本用途为评估生成Graph的网络结构、在角蜂鸟上的运行速度、每层的计算量和耗时等。
使用说明如下:
python3 mvNCProfile.py network # network 为模型文件,如 *.prototxt(Caffe)* 或 *.meta(Tensorflow)*
-h # 显示帮助信息
-w WEIGHTS # 模型权重文件(Caffe), 如 *.caffemodel*
-in INPUTNODE # 输入节点名称,默认Caffe为 *data*, TF为 *input*
-on OUTPUTNODE # 输出节点名称,默认Caffe为最后一层,TF为 *output*
-s NSHAVES # 使用Movidius的Shave数量,建议为8,默认为1
-is INPUTSIZE INPUTSIZE # 更改输入网络尺寸,默认为网络输入尺寸。
范例: 在 tool 子文件夹下执行:
python3 mvNCProfile.py example/deploy.prototxt -w example/deploy.caffemodel
-----------
mvNCCompile v02.00, Copyright @ Movidius Ltd 2016
...
USB: Transferring Data...
Time to Execute : 5.75 ms
USB: Myriad Execution Finished
Time to Execute : 4.32 ms
USB: Myriad Execution Finished
USB: Myriad Connection Closing.
USB: Myriad Connection Closed.
Network Summary
Detailed Per Layer Profile
Bandwidth time
# Name MFLOPs (MB/s) (ms)
===============================================================================
0 data 0.0 935.8 0.002
1 conv1 0.6 59.7 0.658
2 pool1 0.0 220.2 0.100
3 conv2 3.2 223.5 0.829
4 pool2 0.0 149.4 0.041
5 ip1 0.8 2300.8 0.332
6 ip2 0.0 263.2 0.040
-------------------------------------------------------------------------------
Total inference time 2.00
-------------------------------------------------------------------------------
结果:
Python调用时间总计5.75毫秒,USB端输入输出计时4.32毫秒,内部模型推算时间2.00毫秒,以及详细每层占用时间。
MFLOPS为百万半精度浮点计算量。
更详细的信息可通过本目录下生成的output.gv.svg矢量图或网页output_report.html查看,验证失败时可通过此图与原模型对比检查。 对于毫秒级的小模型,如本范例中的LeNet或是用于检测的MTCNN,半数时间将会花费在交互和USB传输。
比起Caffe模型,Tensorflow更为复杂。
此教程同样适用于NCSDK。
Tensorflow在训练时生成的Checkpoint模型文件往往无法被直接转换,原因有几种:
1. 模型的存储格式不符合 。如(.pb/.ckpt/.npz),转换要求的格式为同时包含3个文件: .meta + .index + .data-00000-of-00001 。
2. 训练时使用了非部署用算子 。无法被转换工具解析或导致错误,比如说做梯度优化的种种算子。下图图1为训练时的Tensorflow Graph, 图2为部署。建议训练后重新生成图2的部署用Tensorflow模型后再进行转换。
3. 转换时需定义输出节点名称 。往往转换Caffe时不需要额外输入节点名称,因为最后一层默认为网络输出, 而在Tensorflow是必要的。查找输出节点方式为使用Tensorboard查看Graph(见下图), 找到输出节点,从右上方找到名称后即可。此TF网络输出节点名称为 UNet/Conv_end/conv1/bias_add。
在 tool 子文件夹下执行可生成对应的角蜂鸟Graph文件:
python3 mvNCCompile.py -s 8 ./example/tf_wave/wave.ckpt.meta -in input -on UNet/Conv_end/conv1/bias_add -o graph_wave
python3 mvNCProfile.py -s 8 ./example/tf_wave/wave.ckpt.meta -in input -on UNet/Conv_end/conv1/bias_add
python3 mvNCCheck.py -s 8 ./example/tf_wave/wave.ckpt.meta -in input -on UNet/Conv_end/conv1/bias_add
此模型为最新更新的一个小附赠品,为我们自训练的风格迁移模型,使用方式如下:
通过HSAPI加载模型后,首先将输入图像下采样为256x256尺寸,转换为float32类型,无需做前处理(Scale=1,Mean=0)直接调用HS的推算函数并取得结果。然后Reshape成256x256x3,调用cv2的BGR2RGB函数转换颜色,上采样回原图大小即可,效果如下:
请参考API、范例与开源代码来详细了解生成的Graph如何部署于应用中。