前言
步骤缺一不可。否则需要用很长的时间去找答案。
一、在树莓派上安装paddlelite库
在树莓派上安装paddlelite的库,需要和百度AI Studio上paddlelite的版本一致。
我手头有编译好的paddlelite的whl文件,直接pip安装即可。可以私信我要。是2.8的版本。
二、以下均在AI Studio上的操作
1.安装paddlelite库
在百度AI Studio上输入 !pip install paddlelite==2.8
这个库的版本要和安装在树莓派的一致。
2.导出完整模型文件
!paddlex --export_inference --model_dir=output/mobilenetv2/best_model --save_dir=./inference_model
前提是你的项目已经安装了paddlex和paddlepaddle,这两个的具体版本是你的项目决定的。
其中,--model_dir=output/mobilenetv2/best_model
表示你项目当前保存的模型文件途径,需要根据实际情况修改。
--save_dir=./inference_model
表示你要存下来的完整模型文件途径。建议可以不修改这个途径。
3.输出nb模型
!paddle_lite_opt --model_file=inference_model/inference_model/model.pdmodel --param_file=inference_model/inference_model/model.pdiparams --optimize_out_type=naive_buffer --valid_targets=arm --optimize_out=output
output是你最终产生的nb模型文件名称,可以根据实际情况修改。把这个nb模型下载到树莓派。
3.树莓派部署
接下去就是部署到树莓派上的代码。python代码实现。
from paddlelite.lite import *
import cv2
import numpy as np
import sys
import time
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
# 加载模型
def create_predictor(model_dir):
config = MobileConfig()
config.set_model_from_file(model_dir)
predictor = create_paddle_predictor(config)
return predictor
#图像归一化处理
def process_img(image, input_image_size):
origin = image
img = origin.resize(input_image_size, Image.BILINEAR)
resized_img = img.copy()
if img.mode != 'RGB':
img = img.convert('RGB')
img = np.array(img).astype('float32').transpose((2, 0, 1)) # HWC to CHW
img -= 127.5
img *= 0.007843
img = img[np.newaxis, :]
return origin,img
# 预测
def predict(image, predictor, input_image_size):
#输入数据处理
input_tensor = predictor.get_input(0)
input_tensor.resize([1, 3, input_image_size[0], input_image_size[1]])
image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGRA2RGBA))
origin, img = process_img(image, input_image_size)
image_data = np.array(img).flatten().tolist()
input_tensor.set_float_data(image_data)
#执行预测
predictor.run()
#获取输出
output_tensor = predictor.get_output(0)
print("output_tensor.float_data()[:] : ", output_tensor.float_data()[:])
res = output_tensor.float_data()[:]
return res
# 展示结果
def post_res(label_dict, res):
print(max(res))
target_index = res.index(max(res))
print("结果是:" + " " + label_dict[target_index])
if __name__ == '__main__':
# 初始定义
label_dict = {0:"xihongshi", 1:"changquezi", 2:"bocai", 3:"huluobo"}
image = "./test_pic/001.jpg"
model_dir = "./output.nb"
image_size = (224, 224)
# 初始化
predictor = create_predictor(model_dir)
# 读入图片
image = cv2.imread(image)
# 预测
res = predict(image, predictor, image_size)
# 显示结果
post_res(label_dict, res)
cv2.imshow("image", image)
cv2.waitKey()
label_dict = {0:"xihongshi", 1:"changquezi", 2:"bocai", 3:"huluobo"}
image = "./test_pic/001.jpg"
model_dir = "./output.nb"
这几行代码需要根据自己情况修改。以上代码使用Paddle-Lite——基于python API部署PaddlePaddle的自定义模型并实现视频流和单张图片的预测该博文的代码。
总结
这是《PaddleX2.0快速上手-MobileNetV2图像分类》中的《MobileNetV2图像分类》的例程,然后转树莓派上可运行的nb模型。学习的话百度这个题目即可。