基于 MobileNetV2 的图像分类
1. 配置 Docker 开发环境
参考 这里 配置好 Docker 开发环境后,再回到这里继续下一步
2. 在 Docker 中准备工作目录
创建并进入 mobilenet_v2
工作目录,注意是与 tpu-mlir
同级的目录
# mkdir mobilenet_v2 && cd mobilenet_v2
下载官网的 MobileNet 模型:
git clone https://github.com/shicai/MobileNet-Caffe.git
将克隆的 MobileNet-Caffe
目录下的模型文件、 tpu-mlir
工具链目录下的图片文件放入当前目录下
# cp MobileNet-Caffe/mobilenet_v2_deploy.prototxt .
# cp MobileNet-Caffe/mobilenet_v2.caffemodel .
# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ .
# cp -rf ${TPUC_ROOT}/regression/image/ .
这里的 ${TPUC_ROOT}
是环境变量,对应 tpu-mlir
目录,是在前面配置 Docker 开发环境中 source ./tpu-mlir/envsetup.sh
这一步加载的
创建并进入 work
工作目录,用于存放编译生成的 MLIR
、cvimodel
等文件
# mkdir work && cd work
3. MobileNet-Caffe 模型转换
提示
Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 ONNX 系列 和 Caffe 模型,目前不支持 TFLite 模型。在量化数据类型方面,支持 BF16 格式的量化 和 INT8 格式的非对称量化
模型转换步骤如下:
- Caffe 模型转换成 MLIR
- 生成量化需要的校准表
- MLIR 量化成 INT8 非对称 cvimodel
Caffe 模型转换成 MLIR
模型输入是图片,在转模型之前我们需要了解模型的预处理。如果模型用预处理后的 npz 文件做输入,则不需要考虑预处理。预处理过程用公式表达如下($x$代表输入): $$ y = (x-mean)\times scale $$
本例中的模型是 BGR 输入, mean
和 scale
分别为 103.94
,116.78
,123.68
和 0.017
,0.017
,0.017
,模型转换命令如下:
model_transform.py \
--model_name mobilenet_v2 \
--model_def ../mobilenet_v2_deploy.prototxt \
--model_data ../mobilenet_v2.caffemodel \
--input_shapes [[1,3,224,224]] \
--resize_dims=256,256 \
--mean 103.94,116.78,123.68 \
--scale 0.017,0.017,0.017 \
--pixel_format bgr \
--test_input ../image/cat.jpg \
--test_result mobilenet_v2_top_outputs.npz \
--mlir mobilenet_v2.mlir
运行成功效果示例
转成 MLIR 模型后,会生成一个 mobilenet_v2.mlir
文件,该文件即为 mlir 模型文件,还会生成一个 mobilenet_v2_in_f32.npz
文件和一个 mobilenet_v2_top_outputs.npz
文件,是后续转模型的输入文件