角蜂鸟模型转换

角蜂鸟现支持转换Caffe与Tensorflow(TF)模型,其他框架,如MXNet、Darknet(YOLO)、PyTorch等需要先通过其他工具转换为Caffe或TF模型。对于使用过NCS的用户,本工具的使用方式基本与NCSDK中模型转换工具相同。

获取模型转换工具包

转换工具基于NCSDK修改、于Python实现,已加入最新的 SungemSDK-Python ,如已下载旧版本只需更新即可使用转换工具。

转换工具位于 SungemSDK-Pythontool 子文件夹下。

tool的目录结构如下所示:

tool
├── Controllers # 模型解析库(从NCSDK移植)
├── Models      # 模型层定义、设备参数配置、功能库等(从NCSDK移植)
├── Views       # 可视化、日志输出(从NCSDK移植)
├── caffe       # 简易版Caffe-SSD用于本地编译CPU版本做模型验证
└── example     # Caffe、TF模型,用于转换范例

安装

目前只测试于 Ubuntu 16.04,其他平台理论上可行。

安装pip包(建议使用清华源)

注意:graphviz可能需要apt安装

pip3 install graphviz, pyyaml

安装Caffe-SSD CPU版(如需Caffe模型转换)

注意: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 (如需Tensorflow模型转换)

请参考官方 Tensorflow安装教程

模型转换以及评估、调试

转换 - Compile

此脚本转换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

验证 - Check

此脚本用途为验证生成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输出基本一致,误差极小,此模型可用于角蜂鸟。

评估 - Profile

此脚本用途为评估生成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传输。

关于 Tensorflow 的模型转换

比起Caffe模型,Tensorflow更为复杂。

生成用于部署的TF模型

此教程同样适用于NCSDK。

Tensorflow在训练时生成的Checkpoint模型文件往往无法被直接转换,原因有几种:
1. 模型的存储格式不符合 。如(.pb/.ckpt/.npz),转换要求的格式为同时包含3个文件: .meta + .index + .data-00000-of-00001
2. 训练时使用了非部署用算子 。无法被转换工具解析或导致错误,比如说做梯度优化的种种算子。下图图1为训练时的Tensorflow Graph, 图2为部署。建议训练后重新生成图2的部署用Tensorflow模型后再进行转换。
TF_Graph_Train TF_Graph_Deploy 3. 转换时需定义输出节点名称 。往往转换Caffe时不需要额外输入节点名称,因为最后一层默认为网络输出, 而在Tensorflow是必要的。查找输出节点方式为使用Tensorboard查看Graph(见下图), 找到输出节点,从右上方找到名称后即可。此TF网络输出节点名称为 UNet/Conv_end/conv1/bias_add。

TF_Graph_Output

范例

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函数转换颜色,上采样回原图大小即可,效果如下:

Style

Graph使用

请参考API、范例与开源代码来详细了解生成的Graph如何部署于应用中。