操作系统:Ubuntu
版 本:20.04 LTS (18.04也一样)
假定当前目录:/root/demo/pb
模 型 文 件 : mobilenet_v1_1.0_224_frozen.pb
docker环境准备
- 更新包并安装一些必须的软件
sudo apt update
- 安装一些必须的组件
sudo apt install apt-transport-https ca-certificates curl gnupg unzip lsb-release
- 添加 Docker 官方的 GPG key到本地
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置使用稳定版 stable repo.
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
如果要使用 nightly 或者 test repo. 把上面命令中的 stable 替换即可
- 再次更新源并安装docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
- 上面命令完成后,使用以下命令进行一下测试
sudo docker run hello-world
如果返回如下图中的信息,说明docker环境安装成功了,如果未成功请按上面步骤重新尝试。
仿真环境搭建
- 仿真镜像获取,如果访问国外网络速度很好,可以直接用以下命令从docker官方Hub摘取镜像。镜像挺大请耐心等待完成
sudo docker pull zepan/zhouyi
- 如果访问国外网络速度不好,可以使用下载百度网盘中的仿真镜像文件,然后本地载入。
链接:https://pan.baidu.com/s/1yaKBPDxR\_oakdTnqgyn5fg 提取码:f8dr
3.解压镜像并导入到本地,注意镜像文件路径
gunzip zhouyi_docker.tar.gz
sudo docker load --input zhouyi_docker.tar
- 用以下命令检查是否导入成功,如果执行结果中出现下图所示内容,说明导入成功了
docker images
- 使用以下命令创建仿真环境
docker run -itd -v /root/data:/root/data --name zhouyi zepan/zhouyi /bin/bash
其中 zhouyi 是使用镜像创建的容器名,可以根据需要设置
-v /root/data:/root/data
为了方便文件的传输,使用以上参数把宿主中的 /root/data/ 目录映射到新创建的仿真环境中,也就是说当我们把文件上传到宿主 /root/data/ 下时,仿真环境中的 /root/data/目录下就会有相应的文件,无须再用 docker cp 命令逐个复制
其中 -d 参数是指定容器在后台运行,也就是说关闭当前窗口,容器一样在运行。
关闭窗口后如果我们想再次进行仿真环境,可以使用以下命令
docker attach zhouyi
其中 zhouyi 就是是创建时的容器名或者窗口的 ID(下图红框中),可以用以下命令获取
docker ps
仿真环境测试及模型量化
- 容器仿真环境验证。使用以下命令查看已经启动的容器
docker ps
如果执行结果中有上图中标红的内容,我们可以直接附加到已运行容器
docker attach zhouyi
如果容器没有运行,可以使用以下命令先启动
docker start zhouyi
当终端中出现上图中的内容时,说明已经进入到窗口仿真环境了
此时我们选切换到示例目录,此处使用的是pb格式模型,
cd /root/demos/pb
此时我们执行环境验证命令
aipubuild config/resnet_50_run.cfg
根容器分配到的配置,此命令消耗时间从长短不同,命令执行完成即说明环境正常,此时屏幕内容应类似如下图
仿真环境验证无误,下面可以根据需要进行相应的模型量化了
- 网络输出名字的获取,所需工具 Netron(开源) 点此下载
用Netron打开模型文件,拖动到最底部,如图点一下输出层,有个弹出层
其中name就是输出层的名字
3.制作用于量化的矫正数据集和标签
准备一定数量的样本图片放在目录下
/root/demos/pb/dataset1/sample
然后把所有图片和对应的标签写到文件,每行一个,
格式为
图片名 空格 标签
1.jpg 0
2.jpg 0
.....
3.jpg 1
4.jpg 2
把以上内容保存到
/root/demos/pb/dataset1/sample_label.txt
把示例生成矫正数据集脚本复制到目录
cp /root/demos/pb/dataset/preprocess_dataset.py /root/demos/pb/dataset1/preprocess_dataset.py
主要修改下面几个地方
img_dir='./sample/'
label_file='./sample_label.txt'
#RESNET PARAM
input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 127.5
然后执行脚本生成矫正样本数据集和标签
cd ./dataset1
python3 ./preprocess_dataset.py
执行完成后在 dataset1 目录下会生成以下两个文件
- 准备量化时测试用文件input_cup.bin
修改 gen_inputbin.py 文件
vim ./model/gen_inputbin.py
主要是图片的文件路径,在此我们用一张杯子的图片做输入
input_height=224
input_width=224
input_channel = 3
mean = [127.5, 127.5, 127.5]
var = 1
img_name = "./cup.jpeg"
......
fw = open("input_cup.bin", "wb")
fw.write(data)
fw.close()
print("save to input.bin OK")
执行以下命令生成 input_cup.bin 文件
python3 gen_inputbin.py
运行结果如下说明生成成功
- 模型量化配置文件
在此使用的已经固化好的PB模型 【mobilenet-v1-1.0-224.pb】,首先我们创建一个量化配置文件,我们复制示例配置文件然后修改即可。也可以用自己导出的模型,导出模型 ,
cp config/resnet_50_run.cfg config/mobilenet-v1-1.0-224.cfg
然后我们用vim进行修改此配置文件,关于vim的基本操作在此不多说了。
vim config/mobilenet-v1-1.0-224.cfg
几处需要修改的地方如下图中标红之处
[Common]
# 仿真环境用run 真实环境 build
mode=run
[Parser]
# 目前根据观察量化时一些中间文件会用,应该可以随意
model_name = mobilenet_v1
# 根据名字猜测为检测模型量化时后处理相关
detection_postprocess =
# 分类模型 image_classification 同理猜测检测模型 image_detection
model_domain = image_classification
# 网络的输出名名字,具体请看下一小节内部
output = MobilenetV1/Predictions/Reshape_1
# 待量化模型文件的路径
input_model = ./model/mobilenet_v1_1.0_224_frozen.pb
# 待量化模型的网络输入名称
input = input
# 待量化模型的内乡输入大小
input_shape = [1,224,224,3]
# 输出文件存入目录
output_dir = ./
[AutoQuantizationTool]
# 目前根据观察量化时一些中间文件会用,应该可以随意,和上面的保持一致
model_name = mobilenet_v1
# 根据字面猜测量化方式
quantize_method = SYMMETRIC
# OP相关,具体目前未知
ops_per_channel = DepthwiseConv
# 用于量化矫正的样本集
calibration_data = ./dataset1/dataset.npy
# 用于量化矫正的样本集标签
calibration_label = ./dataset1/label.npy
# 预处理方式,归一化
preprocess_mode = normalize
# 量化类型 int8
quant_precision=int8
# 是否交换RB通道,主要看模型输入是BGR还是RGB
reverse_rgb = False
# 标签偏移量
label_id_offset = 0
[GBuilder]
# 量化完成测试用输入文件
inputs=./model/input_cup.bin
# 模拟器? 未知
simulator=aipu_simulator_z1
# 量化完成测试输入文件对应的输出结果
outputs=output_mobilenet_v1_1.0.bin
# 猜测是量化时收集一些性能相关数据
profile= True
# 版本号? 猜测
target=Z1_0701
对于 【mobilenet-v1-1.0-224.pb】 修改后的文件内容如下
[Common]
mode=run
[Parser]
model_name = mobilenet_v1
detection_postprocess =
model_domain = image_classification
output = MobilenetV1/Predictions/Reshape_1
input_model = ./model/mobilenet_v1_1.0_224_frozen.pb
input = input
input_shape = [1,224,224,3]
output_dir = ./
[AutoQuantizationTool]
model_name = mobilenet_v1
quantize_method = SYMMETRIC
ops_per_channel = DepthwiseConv
calibration_data = ./dataset1/dataset.npy
calibration_label = ./dataset1/label.npy
preprocess_mode = normalize
quant_precision=int8
reverse_rgb = False
label_id_offset = 0
[GBuilder]
inputs=./model/input_cup.bin
simulator=aipu_simulator_z1
outputs=output_mobilenet_v1_1.0.bin
profile= True
target=Z1_0701
- 在仿真环境中执行量化
cd /root/demos/pb
aipubuild config/mobilenet-v1-1.0-224.cfg
如果不出现红色日志,说明量化成功了,此时会得到标红的量化参数
同时在当前目录下也会得到量化运行结果文件
output_mobilenet_v1_1.0_224.bin
- 量化结果对比
首先修改上面生成的量化测试用文件input_cup.bin
vim ./quant_predict.py
主要修改以下文件路径
input_path = './model/input_cup.bin'
然后可以执行查看结果
python3 ./quant_predict.py
由截图可以看出预测结果top1【cup】是一致的,概率prob大小范围不同是因为
在用原始模预测时被缩放到0至1了
检测模型尝试
由于目前没有找到相关的说明文档,所以仅只是初步尝试
- yolo-v3-tiny
由日志可以看出模型解析部分没有问题,但量化时出了错
- ssd_mobilenet_v1_coco
由日志可以看模型解析时就出错了,有些OP不支持
如果有机会收到板子再继续尝试吧
相关文件下载
本文提到的所有文件及代码,可以从这里下载: z1.zip (提取码: 8hs2)