屋梧舞鹜 · 2021年07月25日

【周易AIPU 仿真】Nasnet分类识别模型在R329仿真测试

下载官方docker镜像
百度云下载镜像文件(压缩包约2.9GB,解压后约5.3GB)
链接:https://pan.baidu.com/s/1yaKB...
提取码:f8dr
docker的安装网上教程很多,这里直接进入主题。加载docker

gunzip zhouyi_docker.tar.gz
sudo docker load --input zhouyi_docker.tar
sudo docker run -i -t zepan/zhouyi  /bin/bash

因为提交申请的sample例子不能用docker里带的例子,这里参考了nihui大佬的帖子,走通nasnet的测试。仿照官方例子,首先建立我们自己的文件夹目录
cd ~/demos
mkdir nasnet&& cd nasnet
mkdir dataset # 存放数据集
mkdir config # 存放配置文件
mkdir model # 存放预训练模型和参数

1.导出tensorflow pb

https://github.com/tensorflow/tensorflow/tree/v1.15.0 下载TF 1.15。

1.1安装slim模块

tensorflow/models这个仓库,所有的model放一起,整个下下来1.1G。我们只想要部分文件夹,我们下载model这个文件夹下的research/slim到本地

cd model
$ git init #初始化
$ git remote add origin  https://github.com/tensorflow/models.git # 增加远端的仓库地址
$ git config core.sparsecheckout true # 设置Sparse Checkout 为true 
$ echo "research/slim" >> .git/info/sparse-checkout # 将要部分clone的目录相对根目录的路径写入配置文件
$ git pull origin master #pull下来代码

我是在Ubuntu下载然后通过docker cp 拷贝过去的

cd models/research/slim
python setup.py install --user

1.2导出网络结构和预训练的权值参数

https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models下载 NASNet-A_Mobile_224 对应的 checkpoint 压缩包,解压拷贝到 docker 里的 /root/demos/nasnet/model/

$ docker cp nasnet-a_mobile_04_10_2017 444:/root/demos/nasnet/model #Ubuntu拷贝到docker下(444为我这边的dock id,注意改成你自己的,如下图的前三位)

d.png

$ cd models/research/slim
$ python3 export_inference_graph.py --alsologtostderr --model_name=nasnet_mobile --image_size=224 --output_file=/root/demos/nasnet/model/nasnet_mobile_inf.pb

配合 checkpoint 导出权值参数frozen.pb文件

$ cd tensorflow-1.15.0/tensorflow/python/tools
$ python3 freeze_graph.py --input_graph=/tmp/nasnet_mobile_inf.pb --input_checkpoint=/root/demos/nasnet/model/nasnet-a_mobile_04_10_2017/model.ckpt --input_binary=true --output_graph=/root/demos/nasnet/model/nasnet_mobile_frozen.pb --output_node_names=final_layer/predictions

2.数据集

这里下载1000类的1000张图片
https://github.com/nihui/imagenet-sample-images
生成每行都是图片路径 label的imagelabel.txt

ls imagenet-sample-images | sort > image.txt
seq 0 999 > label.txt
paste -d ' ' image.txt label.txt > imagelabel.txt

把 demos/pb/dataset/ 里的 preprocess_dataset.py 拿出来改改开头
cp /root/demos/pb/dataset/preprocess_dataset.py /root/demos/nasnet/dataset/https://github.com/tensorflow/models/blob/master/research/slim/preprocessing/preprocessing_factory.py得知,mnasnet 预处理采用 inception_preprocessing,即把 0~255 调整为 -1~1

img_dir='./imagenet-sample-images/'
label_file='./imagelabel.txt'

#RESNET PARAM
input_height=224
input_width=224
input_channel = 3

mean = 127.5
var = 127.5

从 1000 张图生成 dataset.npy 和 label.npy 文件

python preprocess_dataset.py

3.准备 input.bin

把 demos/pb/model/ 里的 gen_inputbin.py 拿出来改改
cp /root/demos/pb/model/gen_inputbin.py /root/demos/nasnet/config
mean 和 val 是不能照着模型的预处理写的,必须要写 mean=127.5 var=1 才可以,似乎npu总是输入 -127~127 范围的数值

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

img_name = "../result.jpeg"

测试图片偷懒,就直接用 demos 的 result.jpeg(注意拷贝的路径),于是 output_ref.bin 就复用了,执行这个脚本,生成 mnasnet 所需的 input.bin

python gen_inputbin.py

4.仿真文件配置

从官方步骤可知,aipubuild build.cfg 会生成 aipu.bin 放在板子上跑,aipubuild run.cfg 是直接在仿真器里跑,所以这次就直接配置 run.cfg 就可以了.把 demos/pb/config/ 里的 resnet_50_run.cfg 拿出来改改

$ cp ~/demos/pb/config/resnet_50_run.cfg ~/demos/nasnet/config/nasnet_mobile_run.cfg

注意路径

[Common]
mode=run

[Parser]
model_name = nasnet_mobile 
detection_postprocess = 
model_domain = image_classification
output = final_layer/FC/BiasAdd
input_model = ../model/nasnet_mobile_frozen.pb
input =input
input_shape = [1,224,224,3]
output_dir = ./

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

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

执行 aipubuild 运行仿真

aipubuild nasnet_mobile_run.cfg

输出log,并输出 output_nasnet_mobile.bin 结果文件,是仿真器npu跑出来的结果
注意 Start to check IR: /tmp/AIPUBuilder_1627198730.2299416/nasnet_mobile_int8.txt
是ir文件,打开这个文件,拉到最后看到
b.png
可以找到layer_top_type=[int8]这个类型,下个小结结果对比中会用到。
simulation仿真结果如下图所示
c.png

5.npu量化推理结果比对

cp ~/demos/pb/quant_predict.py ~/demos/nasnet/

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

a.png
预测的前5 label在ground truth中,实际是一只小狗的照片
result.jpeg

6.容器保存

查看正在运行的容器 docker ps记下image name和container id
e.png
记住更改(类似与GitHub commit)

docker commit -m "upgrade" zepan/zhouyi zhouyi_nasnet:1.0

导出镜像为压缩文件

docker save -o ./zhouyi-nas.tar zhouyi_nasnet:1.0

参考致谢:
谢谢nihui大佬的帖子,参考帮助很大
https://aijishu.com/a/1060000000219310 一篇折腾r329的记录

https://aijishu.com/a/1060000000219298 基于MobileNetV2的水果分类模型在R329开发板上的部署(仿真部分)

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