冰糖小新 · 2021年08月05日

【周易AIPU 仿真】使用"破小"ECS进行仿真

首先不在乎能否拿到硬件,就是玩儿[狗头]

按照教程和网上的学习线索,得到了仿真的结果;如图:

Untitled.png

R329 开发板申请Sample中的结果是一致的

predict first 5 label:
    index  231, prob 180, name: Shetland sheepdog, Shetland sheep dog, Shetland
    index  232, prob  67, name: collie
    index 1000, prob   0, name: toilet tissue, toilet paper, bathroom tissue
    index  342, prob   0, name: hog, pig, grunter, squealer, Sus scrofa
    index  340, prob   0, name: sorrel
true first 5 label:
    index  232, prob  83, name: collie
    index  231, prob  83, name: Shetland sheepdog, Shetland sheep dog, Shetland
    index  158, prob  41, name: papillon
    index  170, prob  40, name: borzoi, Russian wolfhound
    index  161, prob  39, name: Afghan hound, Afghan

Detect picture save to result.jpeg

为了检查是否真的有效,再重新做一次,把图片集和标注集换成猫猫,看能否得出不一样的结果。

ECS的配置如下:

通用计算型 | s6.medium.2 | 1vCPUs | 2GiB|60G SSD

1、 下载环境并测试:

docker pull zepan/zhouyi

docker run -i -t zepan/zhouyi /bin/bash

cd ~/demos/tflite

./run_sim.sh

python3 quant_predict.py

结果如下:
Untitled (1).png

2、下载模型

下载好预训练的ckpt,可以参考github上的

$ CHECKPOINT_DIR=/tmp/checkpoints
$ mkdir ${CHECKPOINT_DIR}
$ wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
$ tar -xvf inception_v3_2016_08_28.tar.gz
$ mv inception_v3.ckpt ${CHECKPOINT_DIR}
$ rm inception_v3_2016_08_28.tar.gz

由于docker中没有办法下载,所以将ckpt文件在主机中下载之后拷贝过去

从主机拷贝文件

docker cp ./resnet_v1_50_2016_08_28.tar.gz CID:/tmp/checkpoints

从容器拷贝文件到主机目录

docker cp CID:/tmp/checkpoints/resnet_v1_50_2016_08_28.tar.gz /root/r329-again

导出图

python3 export_inference_graph.py \
    --alsologtostderr \
    --model_name=resnet_v1_50 \
    --image_size=224 \
    --labels_offset=1 \
    --output_file=/tmp/resnet_v1_50_inf.pb

执行之后我们会遇到一个问题:

ModuleNotFoundError: No module named 'tf_slim'

先检查一下pip的版本,可以确认是来源3.6的

root@726020952f0f:~/demos/workspace/models-master/research/slim# pip -V
pip 20.2.3 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

所以直接使用pip install tf_slim安装,然后再执行一次导出图的命令。

可能出现网络不对的情况,那么重启一次docker服务不失为一种方便的解决方案。
service docker restart
docker-machine restart <machine-name>

Untitled (2).png
可以看到是生成了pb文件
Untitled (3).png
接着开始冻结

使用预训练权重冻结
python3 freeze_graph.py \
    --input_graph=/tmp/resnet_v1_50_inf.pb \
  --input_checkpoint=/tmp/checkpoints/resnet_v1_50.ckpt \
  --input_binary=true --output_graph=/tmp/resnet_v1_50_frozen.pb \
  --output_node_names=resnet_v1_50/predictions/Reshape_1

Untitled (4).png
看到是出现了冻结的pb。

3、 准备量化矫正数据集

之前是准备的几张狗狗的照片。
Untitled (5).png
但是为了对比开头说的结果,我们下载几张猫猫的照片
Untitled (6).png
打包之后放到可以区分的目录下:/root/demos/pb/dataset/output/cat-img
Untitled (7).png
生成每行都是"图片路径 label"的imagelabel.txt

ls | sort > image.txt
seq 0 9 > label.txt
paste -d ' ' image.txt label.txt > imagelabel.txt

Untitled (8).png

可以看到生成的txt还行,

我们修改一下preprocess_dataset.py开头的路径:

img_dir='./output/cat-img'

label_file='./output/cat-img/imagelabel.txt'

执行之前先查看一下npy的时间,看是否执行生效
Untitled (9).png

然后执行:
python3 preprocess_dataset.py
我们发现还是有变化的,说明执行是生效了
Untitled (10).png

4、准备一下测试集:
将猫猫图片2.jpg拷贝到gen_inputbin.py的同级目录,并重命名为1.jpg
Untitled (11).png

然后执行python gen_inputbin.py

确认input.bin也是更新了的

然后执行python gen_inputbin.py

确认input.bin也是更新了的
Untitled (12).png

5、 准备输出结果

我们先将冻结的pb从/tmp目录中cp到model目录下,

然后找到cfg文件

Untitled (13).png

把其中的input_model = ./model/frozen.pb改成

input_model = ./model/resnet_v1_50_frozen.pb

然后检查一下其他参数是否有问题

ok的话就执行

aipubuild config/resnet_50_run.cfg

同样,为了确认有效性,也可以先查看output文件时间之后再执行

Untitled (14).png

这里我们用的低配ECS可能会出现一个问题,内存不足,本人的解决方案是增加swap空间
Untitled (15).png

可以看到,其实2G应该是够的,无奈原始只有1.4G。

可以看到output是有时间上的变化的
Untitled (16).png

所以生成的output_resnet_50.bin是有效的。

把 demos/pb/config/ 里的 quant_predict.py 拿出来改改

主要是以两行:

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

然后执行python quant_predict.py
6、 输出结果,对比数据

结果如下:
Untitled (17).png
对比第一遍得到的结果确实不一样
Untitled (18).png
那么result.jpeg又是什么呢?emmmmm
Untitled (19).png
回顾一下,校准集在哪里用到了呢?我们只是简单的将校准集中的图片用于测试,如果再换一张图片会怎么样呢?

a)回顾一下imagelabel.txt的生成→dataset.npy等文件的生成,然后我们再找到resnet_50_run.cfg中的如下两个变量:

calibration_data = ./dataset/dataset.npy

calibration_label = ./dataset/label.npy

也就是说,在执行仿真阶段的时候,已经将校准集给加入了运算了。

b)再换一张图片

我们试试豪猪
Untitled (20).png
拷贝到726020952f0f:~/demos/pb/model下

docker cp test2.jpg 726020952f0f:/root/demos/pb/model

改一下gen_inputbin.py,让图片和1.jpg有所区分;
Untitled (21).png

然后执行python gen_inputbin.py

确认input.bin也是更新了的
Untitled (22).png
执行aipubuild config/resnet_50_run.cfg

然后执行python quant_predict.py

得到结果:
Untitled (23).png
哈哈哈哈,预测是仓鼠。不过至少表明预测是有在执行的。

推荐阅读
关注数
0
文章数
1
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息