SSC336/SSC338/SSC30K开发笔记
文章目录
前言
SSC336/SSC338/SSC30K 包含了几种衍生型号,片内集成了0.5T@INT8的IPU,支持人工智能模型的开发和应用,本文介绍下检测网络模型转换和板端运行的方法。
SSC336D/Q,分辨率3MP@30FPS,分别内置1Gb和2Gb DDR,带0.5T AI算力。
SSC30KD/KQ,分辨率5MP@30FPS,分别内置1Gb和2Gb DDR,带0.5T AI算力。
SSC338Q,分辨率4K@20FPS,内置2Gb DDR,带0.5T AI算力。
SSC338G,分辨率4K@20FPS,外挂单颗或两颗DDR3,容量最高可达8Gb, 带1T AI算力。
SSC339G,分辨率4K@30FPS,外挂单颗或两颗DDR3,容量最高可达8Gb, 带1T AI算力
一、环境搭建:
1、自己搭建环境:
使用anaconda 建立虚拟环境,切不可直接安装在系统目录下,否则容易造成冲突,导致系统损坏。在虚拟环境下需要满足:python3.5 tensorflow-gpu1.14.0,当前使用GPU版本,运行sigmstar的工具,已经测试OK了。没有GPU就CPU版本tensorflow==1.14.0

python 3.5
TensorFlow tensorflow-gpu ==1.14.0
GPU版本:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu1.14.0 numpy1.16.4 scikit-learn Pillow h5py matplotlib psutil scikit-image keras==2.1.4 scikit-build
小工具安装完毕后再单独安装opencv. (Double requirement given: numpy==1.13.3)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python --no-build-isolation
CPU版本:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow1.14.0 numpy1.16.4
opencv-python scikit-learn Pillow h5py matplotlib psutil scikit-image keras==2.1.4 scikit-build
然后再安装以下工具
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple enum34 protobuf six cython pycocotools matplotlib scipy
numpy==1.16.4
enum34==1.1.6
protobuf>=3.8.0
six>=1.12.0
opencv-python>=3.4.0.14
tensorflow==1.14.0
cython>=0.29.13
pycocotools>=2.0.0
matplotlib>=3.0.3
scipy>=1.3.1
pillow==6.1.0
2、使用SDK带的环境:
进入 sgs_docker 环境中,在同一级目录下准备好 SGS_IPU_SDK 和 SGS_Models,如下所示:

先进入 SGS_IPU_SDK 激活环境,命令如下:
cd SGS_IPU_SDK && source cfg_env.sh
二、模型转换:
Anchor-based 类型的检测网络通常是包含后处理部分,对于后处理有两种处理方案: 方案一:使用 C 自行实现后处理代码;
方案二:使用 SGS 的标准后处理网络,将后处理转换到 Offline 模型里面; 以 SGS_Models/tensorflow/yolo_v3_7 为例。
1、开源网络模型:
这里是已经转换好的离线网络,可以直接加载使用在sigmstar的芯片上。
sourcecode\sdk\verify\mi_demo\source\ipu_release_model\open_source\dla_verify_mbnet_mbssd


目前测试过caffe_yolo_v2_fixed.sig_sgsimg.img,ssd_mobilenet_v1,可以正确识别物体。
2、转 SGS Float
(1)、网络转换:
python3 SGS_IPU_SDK/Scripts/ConvertTool/ConvertTool.py tensorflow_graphdef \
--graph_def_file SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7.pb \
--output_file SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_concat.sim \
--input_arrays input \
--output_arrays yolov3/yolo83/BiasAdd,yolov3/yolo95/BiasAdd,yolov3/yolo107/BiasAdd \
--input_shapes 1,608,608,3 \
--input_config SGS_Models/tensorflow/yolo_v3_7/input_config_concat.ini
成功转换后,会在 SGS_Models/tensorflow/yolo_v3_7 目录下生成/yolo_v3_7_concat.sim 文件。
(2)、后处理转换:
后处理代码的目录是:SGS_IPU_SDK/Scripts/postprocess/postprocess_method/,该目录下包含了很多 exmaple,这里我们需要使用 yolo_v3_7_postprocess.py

转换命令如下:
python3 SGS_IPU_SDK/Scripts/postprocess/postprocess.py \
-n yolo_v3_7_postprocess
3、合并sim 文件:
SGS_IPU_SDK/bin/concat_net \
--mode append \
--transform SGS_IPU_SDK/cfg/CompilerConfig.txt \
--input_config SGS_Models/tensorflow/yolo_v3_7/input_config.ini \
--model1 SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_concat.sim \
--model2 SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_postprocess.sim \
--output SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_float.sim
通过 concat_net 工具,可以将前面转换的两个网络合并为一个网络,合并后的网络会直接输出最终的检测结果。
4、转 SGS Fixed:
python3 SGS_IPU_SDK/Scripts/calibrator/calibrator.py \
--input_config SGS_Models/tensorflow/yolo_v3_7/input_config.ini \
-i SGS_Models/resource/detection/coco2017_calibration_set32 \
-m SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_float.sim \
-c Detection \
-n yolo_v3_7
成 功 转 换 后 , 会 在 SGS_Models/tensorflow/yolo_v3_7 目 录 下 生 成yolo_v3_7_fixed.sim 文件,日志如下:

5、转 SGS Offline:
python3 SGS_IPU_SDK/Scripts/calibrator/compiler.py \
-m SGS_Models/tensorflow/yolo_v3_7/yolo_v3_7_fixed.sim
成 功 转 换 后 , 会 在 SGS_Models/tensorflow/yolo_v3_7 目 录 下 生 成
yolo_v3_7_fixed.sim_sgsimg.img 文件,日志如下:

接下来就可以将 offline 模型 yolo_v3_7_fixed.sim_sgsimg.img 上传到板端,进行测试了。
四、板端运行:
(1)板端的 demo 位于:sdk/verify/mi_demo/source/dla_detect 目录下,该例子是调用检测网络的示例代码,编译之后生成 prog_dla_detect 可执行文件。
(2)准备测试图像和标签文件,也可以从下面的目录获取图像和 label.txt: sdk/verify/mi_demo/source/ipu_release/open_source/dla_detect/resource
(3)将 prog_dla_detect、测试图像、mscoco_label.txt 文件拷贝到板端,板端运行还需要
ipu_firmware.bin,该文件位于板子上的/config/dla/目录下。 最后,在板子上执行下面的命令,就可以测试 Offline 模型了。
./prog_dla_detect /config/dla/ipu_firmware.bin yolo_v3_7_fixed.sim_sgsimg.img original.jpg mscoco_label.txt RGB
运行的结果如下:

代码位置:
\sourcecode\sdk\verify\mi_demo\source\dla_detect
单独编译:
sourcecode/sdk/verify/mi_demo/source
#make dla_detect
1、caffe yolo v2测试:
./prog_dla_detect /config/dla/ipu_firmware.bin open_source/dla_detect/caffe_yolo_v2_fixed.sim_sgsimg.img ./resource/009962.bmp ./resource/voc_label.txt RGB init-deinit


测试可知,用的是VOC的数据集,分类正确。可以把置信度低于0.8的排除掉。这里有个置信度0.64的干扰。

2、ssd_mobilenet_v1测试:
使用的是mscoco数据集训练的。
#./prog_dla_detect /config/dla/ipu_firmware.bin ./open_source/dla_verify_mbnet_mbssd/ssd_mobilenet_v1_fixed.sim_sgsimg.img ./resource/cat_dog_2.jpg ./resource/mscoco_label.txt RGB

检测结果:

总结
1、模型转换:
到这里,我们已经完成了检测模型的转换和板端的运行,那么对于自己的网络,如何进 行转换呢?需要做哪些准备呢?
一般来说,如果使用 C 完成后处理操作,只需和分类网络一样,进行模型的转换;如果使用 SGS 的后处理模块,需要做以下准备:
(1)准备 input_config.ini、input_config_concat.ini 文件;
(2)准备预处理脚本:根据网络完成预处理脚本编写;
(3)准 备 后 处 理 脚 本 , 目 前 支 持 yolov3 、 ssd 等 主 流 后 处 理 , 可 以 在
SGS_IPU_SDK/Scripts/postprocess/postprocess_method/找到相关的 example,用户可以自行进行修改。
(4)准备量化所需的数据集:100 张左右;
具体如何修改可以参考《SigmaStar DLA SDK 用户手册》
2、板端运行:
对于转换好的单任务分类网络,可以直接使用 dla_classify 进行前向推理,多任务分类网络,dla_classify 只能输出一个分支的结果,如果要查看所有结果,可自行进行修改。


119

被折叠的 条评论
为什么被折叠?



