xingxing · 2021年07月18日

【周易AIPU 仿真】R329 AIPU仿真vgg16

0x00 背景

新一轮白嫖板子活动开始了,好耶。这次白嫖的板子是矽速科技的R329开发板,R329是全志科技的一款芯片,搭载了ARM 中国的AIPU,正好借这次活动来体验一下,下面开始。

0x01 搭建环境

官方只提供了linux版本的sdk,因此我们在ubuntu下面开发

linux 版本:ubuntu 18.04

python环境:anaconda 4.9.2

先来创建所需要的python环境:

conda create -n r329 python=3.6
conda activate r329

创建工作目录

mkdir -p r329/workspace/sdk
cd r329/workspace

0x02 获取模型

https://github.com/tensorflow...,在这个链接下随便下载一个,这里我们下载vgg_16。在工作区下面创建目录vgg_16,把文件拷贝进去并解压,这个是预训练的权重数据。

mkdir vgg_16
tar -vxf vgg_16_2016_08_28.tar.gz
rm vgg_16_2016_08_28.tar.gz

接下来冻结模型

克隆TensorFlow的model备用

git clone https://github.com/tensorflow/models.git

导出推理图

cd models/research/slim/
python export_inference_graph.py \
--alsologtostderr \
--model_name=vgg_16 \
--image_size=224 \
--labels_offset=1 \
--output_file=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16_inf.pb

在vgg_16_model目录下看到生成的pb文件,用netron.app在线查看导出的图结构,这里可以查看输出名称:vgg_16/fc8/squeezed,这个冻结模型时会用到。

冻结模型

clone tensorflow源码

git clone https://github.com/tensorflow/tensorflow.git

冻结

cd tensorflow/tensorflow/python/tools
python freeze_graph.py \
--input_graph=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16_inf.pb \
--input_checkpoint=/home/zyx/r329/workspace/vgg_16/vgg_16_model/vgg_16.ckpt \
--input_binary=true --output_graph=/home/zyx/r329/workspace/vgg_16/vgg_model/frozen.pb \
--output_node_names=vgg_16/fc8/squeezed

可能会报如下错误:

ImportError: cannot import name 'py_checkpoint_reader'

修改freeze_graph.py文件:

#from tensorflow.python.training import py_checkpoint_reader
import tensorflow as tf
reader = tf.train.NewCheckpointReader(input_checkpoint)

这里的修改有点奇葩,因为我这个环境安装过TensorFlow1.15,所以可以这么临时修改。

在vgg_16_model目录下看到frozen.pb文件说明冻结成功了。

0x03 准备数据校准集

创建preprocess_vgg_16_dataset文件夹。

这里我们偷个懒,因为这些模型都是1000分类的,所以数据校准集直接拿sdk里面的,我们修改一下py脚本重新运行即可,把Zhouyi\_Compass/AI610-SDK-r0p0-00eac0/AI610-SDK-1003-r0p0-eac0/user-case-example/tf/preprocess_resnet_50_dataset目录下的文件直接复制到preprocess_vgg_16_dataset文件夹下。

input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 1

生成dataset.npy label.npy

python preprocess_dataset.py

0x04 生成input.bin

直接拿zepan docker里的py脚本

sudo docker cp 9b0bb35c2608:/root/demos/tflite/model/gen_inputbin.py .
sudo chmod 777 gen_inputbin.py

我们随便找一张1000分类里面有的图片

1.JPEG

修改脚本输入图片

执行脚本生成input.bin文件用于模型的输入

python gen_inputbin.py

0x05 构建可执行的模型并在仿真器上跑起来

先把AI610-SDK-1002-r0p0-eac0/simulator的仿真器目录拷贝到sdk目录下。

根据官方sdk文档,首先创建个cfg文件用于仿真模型,把Zhouyi_Compass/AI610-SDK-r0p0-00eac0/AI610-SDK-1003-r0p0-eac0/user-case-example/tf/config目录下的resnet_50_run.cfg文件拷贝到vgg_16/config目录下并修改成如下内容:

vgg_16_run.cfg

[Common]
mode=run

[Parser]
model_name = vgg_16
detection_postprocess = 
model_domain = image_classification
output = vgg_16/fc8/squeezed
input_model = ./vgg_16_model/frozen.pb
input = input
input_shape = [1,224,224,3]

[AutoQuantizationTool]
model_name = vgg_16
quantize_method = SYMMETRIC
ops_per_channel = DepthwiseConv
calibration_data = ./preprocess_vgg_16_dataset/dataset.npy
calibration_label = ./preprocess_vgg_16_dataset/label.npy
preprocess_mode = normalize
quant_precision=int8
reverse_rgb = False
label_id_offset = 0

[GBuilder]
inputs=./vgg_16_model/input.bin
simulator=../sdk/simulator/bin/aipu_simulator_z1
outputs=output_vgg_16.bin
profile= True
target=Z1_0701

在sdk下创建build目录,把构建工具拷贝过来,工具目录AI610-SDK-1003-r0p0-eac0

安装build-tools AIPUBuilder,使用清华的pip源:

pip install AIPUBuilder-3.0.175-cp36-cp36m-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/

将动态库添加到环境变量

export LD_LIBRARY_PATH=../sdk/simulator/lib:${LD_LIBRARY_PATH}

执行 aipubuild 开始仿真

aipubuild ./config/vgg_16_run.cfg

看到下面的log说明成功了

[INFO]:AIPU START RUNNING: BIN[0]
[INFO]:TOTAL TIME: 42.229991s. 
[INFO]:SIMULATOR EXIT!
[I] [main.cpp  : 135] Simulator finished.
Total errors: 0,  warnings: 0

0x06 验证仿真的结果

从zepan的docker镜像里直接拷贝出quant_predict.py脚本

sudo docker cp 9b0bb35c2608:/root/demos/tflite/quant_predict.py .
chmod 777 quant_predict.py

修改脚本,我们只留下预测部分

outputfile = current_dir + '/output_vgg_16.bin'
npyoutput = np.fromfile(outputfile, dtype=np.int8)

结果:

(tf_1_15) zyx@zyx-B360M:~/r329/workspace/vgg_16$ python quant_predict.py 
predict first 5 label:
    index    0, prob 127, name: tench, Tinca tinca
    index    1, prob 127, name: goldfish, Carassius auratus
    index  758, prob 125, name: reel
    index   27, prob 121, name: eft
    index  389, prob 113, name: barracouta, snoek
Detect picture save to result.jpeg

我们输入图片是金鱼,可以看到结果还是不错的。
工程文件全部打包上传到百度云(文件有点大):链接: 链接: https://pan.baidu.com/s/1UxD6... 密码: gciu

推荐阅读
关注数
7443
内容数
92
人工智能边缘计算软硬件解决方案,提供高性能、低成本、低功耗、易使用的硬件选型方案.
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息