paddle-lite部署

编译安装paddlelite

github源码地址
官方教程:Linux x86 环境下编译适用于 Linux x86 的库—(但是,该教程的编译指令之中,没有加–with_python=ON,必须加上才会生成.whl文件

树莓派4b学习笔记六:以源码编译的方式安装Paddlelite

编译时,加上 --with_python=ON, 即可生成.whl安装包
./lite/tools/build_linux.sh ./lite/tools/build_linux.sh --with_python=ON

编译时的其他选项
–arch: (armv8|armv7|armv7hf) arm版本,默认为armv8
–toolchain: (gcc|clang) 编译器类型,默认为gcc
–with_extra: (OFF|ON) 是否编译OCR或NLP相关模型的kernel&OP,
默认为OFF,只编译CV模型相关kernel&OP
–with_python: (OFF|ON) 是否编译python预测库, 默认为 OFF
–with_cv: (OFF|ON) 是否编译CV相关预处理库, 默认为 OFF
–with_log: (OFF|ON) 是否输出日志信息, 默认为 ON

例如,笔者环境为linux/x-86/python3.8,那么编译之后,在目录/workspace/Paddle-Lite/build.lite.linux.x86.gcc/inference_lite_lib/python/install/dist下有一个文件paddlelite-19f2aa47e-cp38-cp38-linux_x86_64.whl

据传,飞腾平台的编译不能采用交叉编译,必须在飞腾平台上编译才可运行。

推理的基本流程

Paddle-Lite——基于python API部署PaddlePaddle的自定义模型并实现视频流和单张图片的预测

Paddle-Lite端侧部署

python 调用paddlelite进行推理的官方示例

示例: PP-PicoDet的部署

PP-PicoDet

下面,笔者以PP-PicoDet的部署为例,描述推理模型的部署流程

第一步, 导出模型

cd PaddleDetection
python tools/export_model.py -c configs/picodet/picodet_s_320_coco_lcnet.yml
-o weights=https://paddledet.bj.bcebos.com/models/picodet_s_320_coco_lcnet.pdparams
–output_dir=output_inference
###笔者猜测,内部使用了paddle.jit.save(),该函数直接对动态图生成三个文件:
---- 存储的模型结构 Program 文件的后缀为 .pdmodel ,
---- 存储的持久参数变量文件的后缀为 .pdiparams ,
---- 同时这里也会将一些变量描述信息存储至文件,文件后缀为 .pdiparams.info ,这些额外的信息将在fine-tune训练中使用。

  • 参数说明:
    如无需导出后处理,请指定:-o export.benchmark=True(如果-o已出现过,此处删掉-o)或者手动修改runtime.yml 中相应字段。
    如无需导出NMS,请指定:-o export.nms=False或者手动修改runtime.yml 中相应字段。

  • 预测模型会导出到output_inference/目录下,分别为infer_cfg.yml, model.pdiparams, model.pdiparams.info, model.pdmodel。 模型导出具体请参考文档PaddleDetection模型导出教程

  • 如果PP-PicoDet已经有导出的模型,则该步骤可省略。下载的模型为.tar文件,里边正好是四个文件(infer_cfg.yml, model.pdiparams, model.pdiparams.info, model.pdmodel)。

第二步, 转换模型至 paddlelite
Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合调度、Kernel优选等方法,使用Paddle-Lite的opt工具可以自动对inference模型进行优化,优化后的模型更轻量,模型运行速度更快。

  • 首先,安装paddlelite,指令如下:
    pip install paddlelite #也可以离线安装编译所得的paddlelite
    安装paddlelite之后,系统就有了paddle_lite_opt工具,可以在命令行运行paddle_lite_opt指令。

  • 然后,转换模型至Paddle Lite格式:
    paddle_lite_opt参数说明如下:
    在这里插入图片描述
    –model_file表示inference模型的model文件地址,–param_file表示inference模型的param文件地址;optimize_out用于指定输出文件的名称(不需要添加.nb的后缀)。
    更详细的paddle_lite_opt工具使用说明请参考使用opt转化模型文档

  • 转换示例:示例一
    该示例中,-model_dir没有模型文件的后缀,且没有提及–param_file,这是应为–model_dir指向的是模型导出后的整个文件夹,里边包含了model.pdmodel和model.pdiparams等四个文件。

# FP32
paddle_lite_opt --model_dir=output_inference/picodet_s_320_coco_lcnet --valid_targets=arm --optimize_out=picodet_s_320_coco_fp32
# FP16
paddle_lite_opt --model_dir=output_inference/picodet_s_320_coco_lcnet --valid_targets=arm --optimize_out=picodet_s_320_coco_fp16 --enable_fp16=true

  • 转换示例:示例二
    ----最终在output_inference/picodet_s_320_coco/文件夹下生成model.nb 和 infer_cfg.json的文件。
    ----optimize_out 参数为优化后模型的保存路径,无需加后缀.nb;–model_file 参数为模型结构信息文件的路径,有后缀.pdmodel,–param_file 参数为模型权重信息文件的路径,有后缀.pdiparams
# 进入PaddleDetection根目录
cd PaddleDetection_root_path

# 将预训练模型导出为inference模型
python tools/export_model.py -c configs/picodet/picodet_s_320_coco.yml \
              -o weights=https://paddledet.bj.bcebos.com/models/picodet_s_320_coco.pdparams --output_dir=output_inference

# 将inference模型转化为Paddle-Lite优化模型
# FP32
paddle_lite_opt  --valid_targets=arm --model_file=output_inference/picodet_s_320_coco/model.pdmodel --param_file=output_inference/picodet_s_320_coco/model.pdiparams --optimize_out=output_inference/picodet_s_320_coco/model
# FP16
paddle_lite_opt  --valid_targets=arm --model_file=output_inference/picodet_s_320_coco/model.pdmodel --param_file=output_inference/picodet_s_320_coco/model.pdiparams --optimize_out=output_inference/picodet_s_320_coco/model --enable_fp16=true

# 将inference模型配置转化为json格式
python deploy/lite/convert_yml_to_json.py output_inference/picodet_s_320_coco/infer_cfg.yml

第三步,编写python代码进行推理
参考:Paddle-Lite——基于python API部署PaddlePaddle的自定义模型并实现视频流和单张图片的预测

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:"metal", 1:"paper", 2:"plastic", 3:"glass"}
    image = "./test_pic/images_orginal/glass/glass300.jpg"
    model_dir = "./trained_model/ResNet50_trash_x86_model.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()

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值