下载官方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,注意改成你自己的,如下图的前三位)
$ 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文件,打开这个文件,拉到最后看到
可以找到layer_top_type=[int8]
这个类型,下个小结结果对比中会用到。
simulation仿真结果如下图所示
5.npu量化推理结果比对
cp ~/demos/pb/quant_predict.py ~/demos/nasnet/
outputfile = current_dir + '/output_nasnet_mobile.bin'
npyoutput = np.fromfile(outputfile, dtype=np.int8)
预测的前5 label在ground truth中,实际是一只小狗的照片
6.容器保存
查看正在运行的容器 docker ps
记下image name和container id
记住更改(类似与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开发板上的部署(仿真部分)