首先不在乎能否拿到硬件,就是玩儿[狗头]
按照教程和网上的学习线索,得到了仿真的结果;如图:
和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
结果如下:
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>
可以看到是生成了pb文件
接着开始冻结
使用预训练权重冻结
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
看到是出现了冻结的pb。
3、 准备量化矫正数据集
之前是准备的几张狗狗的照片。
但是为了对比开头说的结果,我们下载几张猫猫的照片
打包之后放到可以区分的目录下:/root/demos/pb/dataset/output/cat-img
生成每行都是"图片路径 label"的imagelabel.txt
ls | sort > image.txt
seq 0 9 > label.txt
paste -d ' ' image.txt label.txt > imagelabel.txt
可以看到生成的txt还行,
我们修改一下preprocess_dataset.py开头的路径:
img_dir='./output/cat-img'
label_file='./output/cat-img/imagelabel.txt'
执行之前先查看一下npy的时间,看是否执行生效
然后执行:python3 preprocess_dataset.py
我们发现还是有变化的,说明执行是生效了
4、准备一下测试集:
将猫猫图片2.jpg拷贝到gen_inputbin.py的同级目录,并重命名为1.jpg
然后执行python gen_inputbin.py
确认input.bin也是更新了的
然后执行python gen_inputbin.py
确认input.bin也是更新了的
5、 准备输出结果
我们先将冻结的pb从/tmp目录中cp到model目录下,
然后找到cfg文件
把其中的input_model = ./model/frozen.pb
改成
input_model = ./model/resnet_v1_50_frozen.pb
然后检查一下其他参数是否有问题
ok的话就执行
aipubuild config/resnet_50_run.cfg
同样,为了确认有效性,也可以先查看output文件时间之后再执行
这里我们用的低配ECS可能会出现一个问题,内存不足,本人的解决方案是增加swap空间
可以看到,其实2G应该是够的,无奈原始只有1.4G。
可以看到output是有时间上的变化的
所以生成的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、 输出结果,对比数据
结果如下:
对比第一遍得到的结果确实不一样
那么result.jpeg又是什么呢?emmmmm
回顾一下,校准集在哪里用到了呢?我们只是简单的将校准集中的图片用于测试,如果再换一张图片会怎么样呢?
a)回顾一下imagelabel.txt的生成→dataset.npy等文件的生成,然后我们再找到resnet_50_run.cfg中的如下两个变量:
calibration_data = ./dataset/dataset.npy
calibration_label = ./dataset/label.npy
也就是说,在执行仿真阶段的时候,已经将校准集给加入了运算了。
b)再换一张图片
我们试试豪猪
拷贝到726020952f0f:~/demos/pb/model下
docker cp test2.jpg 726020952f0f:/root/demos/pb/model
改一下gen_inputbin.py,让图片和1.jpg有所区分;
然后执行python gen_inputbin.py
确认input.bin也是更新了的
执行aipubuild config/resnet_50_run.cfg
然后执行python quant_predict.py
得到结果:
哈哈哈哈,预测是仓鼠。不过至少表明预测是有在执行的。