paddlelite模型部署

问题描述

对完成训练的paddlehub的可用模型(人脸检测)进行转换,使其能够部署在paddlelite环境下,已完成x86架构linux(ubuntu)中的模型部署

环境配置

linux下配置个新的conda环境用来测试,需要添加opencv模块和paddlelite模块

1
2
3
4
conda create --name test python=3.7
conda activate test
pip install paddlelite
pip install opencv-python==4.5.1.48

模型转换

有python脚本和shell脚本两种方式,分别用于windows环境和linux环境

  • python脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from paddlelite.lite import *

# 1. 创建opt实例
opt = Opt()
# 2. 指定输入模型地址
opt.set_model_dir(r"models\ultra_light_fast_generic_face_detector_1mb_640\ultra_light_fast_generic_face_detector_1mb_640")
# 3. 指定转化类型: arm、x86、opencl、xpu、npu
opt.set_valid_places("x86")
# 4. 指定模型转化类型: naive_buffer、protobuf
opt.set_model_type("naive_buffer")
# 4. 输出模型地址
opt.set_optimize_out(r"models\new_models\ultra_light_fast_generic_face_detector_1mb_640")
# 5. 执行模型优化
opt.run()
  • bash命令,需要先切换到安装paddlelite的环境
1
paddle_lite_opt --model_dir=./ultra_light_fast_generic_face_detector_1mb_640/ultra_light_fast_generic_face_detector_1mb_640 --optimize_out=./new_models/ultra_light_fast_generic_face_detector_1mb_640 --optimize_out_type=naive_buffer --valid_targets=x86

模型转换

通过模型转换获得一个以nb为后缀的模型文件

模型的加载与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from paddlelite.lite import *
import cv2
import numpy as np

image_path = "./faces/0.jpg"
image_orig = cv2.imread(image_path)

# 人脸模型输入要求 640*480
c, h, w = 3, 480, 640
# 归一化
image_data = cv2.cvtColor(image_orig, cv2.COLOR_BGR2RGB)
image_data = cv2.resize(image_data, (w, h))
image_mean = np.array([127, 127, 127])
image_data = (image_data - image_mean) / 128.0
image_data = np.transpose(image_data, [2, 0, 1])
image_data = image_data.reshape([1, c, h, w]).astype('float32')

config = MobileConfig()
config.set_model_from_file('ultra_light_fast_generic_face_detector_1mb_640.nb')
predictor = create_paddle_predictor(config)

input_tensor = predictor.get_input(0)
input_tensor.from_numpy(image_data)
predictor.run()

# 有几个输出接几个,人脸检测模型有两路输出
output_tensor_0 = predictor.get_output(0)
output_tensor_1 = predictor.get_output(1)
output_data_0 = output_tensor_0.numpy()[0]
output_data_1 = output_tensor_1.numpy()[0]