\u200E
FastDeploy秒解模型部署难题,助力智慧农业应用快速落地
发布日期:2022-10-11T03:16:55.000+0000 浏览量:3622次

随着大数据、人工智能等数字技术在农业领域的渗透和应用,智慧农业开始从理论概念慢慢走向应用落地,我国的传统农业也逐步迈向智慧农业时代。发展智慧农业是数字乡村建设的重要内容,有助于我国破解“三农”难题,实现农业全产业链的现代化升级转型。但在AI转型实践中,农林企业往往会遇到很多技术问题,AI模型部署就是其中难度相对较高的一环。


模型部署是AI开发的“最后一公里”,但往往这最后一步成了很多产品开发团队加班加点攻关解决的难题,主要的难点有以下几个方面:

  • 难点一:硬件产品开发需要软硬件工程师协同,同时软硬件工程师还要熟悉AI开发技术栈,本来大多数农林企业中就没有完整的人才配套,懂AI的软硬件工程师更是少之又少。

  • 难点二:做落地的工程对AI工程师的技术栈要求高,除了要懂基础开发之外,还要熟悉模型转换、压缩、优化、部署上线等技术内容。

  • 难点三 :市场上开发板的品牌型号非常多,芯片架构各异,往往为了适配某种开发板而多写很多底层代码和转换模型,难度大、耗费精力多而且不一定适配成功。另外,如果项目需要更换其他型号的开发板,原本适配的代码往往不能直接迁移到其他型号的开发板上。
为了解决AI模型在落地中遇到的诸多问题,本文使用全场景AI推理部署套件FastDeploy来实现农业AI模型部署落地,并与之前使用的部署方案进行对比。

本文共分为四大版块:原部署方案FastDeploy部署方案FastDeploy+ FastAPI项目落地总结


原部署方案


本文采用苹果叶面病虫害识别分类模型作为案例,在训练完病虫害识别分类模型并完成模型转换后,我们得到模型文件(inference.pdmodel)和模型参数文件(inference.pdiparams)。原部署方案使用Paddle2ONNX + ONNX Runtime方式实现。该方案需要安装Paddle2ONNX进行模型转换,流程较多,需要自行重新开发前后处理,对于一些复杂的模型,难度极大。我们分别用ONNX Runtime和FastDeploy开发推理部署部分代码,以此对比两种方法在开发难度上的差异。
苹果叶面病虫害识别分类模型训练链接(训练好的模型可从链接中下载)

https://aistudio.baidu.com/aistudio/projectdetail/4411585?contributionType=1


项目效果



ONNX Runtime



ONNX Runtime是一种推理引擎,其主要流程如下图所示,首先我们需要将飞桨的静态图模型转换为ONNX 模型,然后加载模型并获取模型输入输出的节点名。输入图像进行放大缩小、裁剪、标准化、转置等一系列预处理操作之后输入到推理引擎,推理结束之后对输出的列表进行Softmax计算出推理预测结果的id值。
  •  安装Paddle2ONNX和ONNX Runtime
pip install paddle2onnx
pip install onnxruntime
  • 模型转换
paddle2onnx --model_dir=./inference/ \
    --model_filename=inference.pdmodel \
    --params_filename=inference.pdiparams \
    --save_file=./onnx_model/inference.onnx \
    --opset_version=10 \
    --enable_onnx_checker=True
  • 推理代码

import cv2
import numpy as np
from onnxruntime import InferenceSession

model = InferenceSession('./onnx_model/inference.onnx')
input_names = model.get_inputs()[0].name
output_names = model.get_outputs()[0].name

imageInput = cv2.imread("dataset/healthy/81935a3879e1f68e.jpg")
imageInput = np.array(cv2.resize(imageInput, (224,224)))
imageInput = (imageInput/255-[0.485, 0.456, 0.406])/[0.229, 0.224, 0.225]
imageInput = imageInput[np.newaxis,:]
imageInput = imageInput.transpose([0,3,1,2])
imageInput = imageInput.astype('float32')

batch_output = model.run(
                output_names=[output_names],
                input_feed={input_names: imageInput})[0]

def softmax(x):
    x = x.reshape(-1)
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)

for output in batch_output:
    result = softmax(np.array(output)).tolist()
    idx = np.argmax(result)
    print("Result:", idx)
  • 输出结果

Result:3


FastDeploy部署


下面使用一个部署神器FastDeploy来完成同样的部署任务(且性能甚至优于普通推理引擎)。FastDeploy目前支持飞桨PaddleClas、PaddleSeg、PaddleOCR以及PaddleDetection等套件训练的模型的C++/Python直接加载完成端到端推理,也支持PyTorch模型的推理部署,同时也可根据用户的需求灵活切换推理后端。
FastDeploy部署流程相对普通推理引擎显得非常简单,推理速度更快,直接支持飞桨训练的模型,免去了转换模型的步骤,也避免了因模型转换而导致精度损失的风险。并且FastDeploy底层封装好了常用的预处理方法和加速内核,根据不同的设备环境自动适应,通过配置文件模块化灵活组合搭配替代预处理代码,大幅减少了过程开发的代码量,只需要简单调用两个API,即可实现模型初始化和模型推理,具体的流程如下图所示。



安装FastDeploy

FastDeploy提供了预编译的包进行安装,直接使用如下命令即可完成安装。 如果在Windows下结合Visual Studio使用,可以参考该文档完成配置:
https://github.com/PaddlePaddle/FastDeploy/tree/develop/docs/quick_start)
# FastDeploy分CPU和GPU版本,根据设备情况选择安装其中一个即可
pip install fastdeploy-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
#pip install fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
模块化配置文件(直接复用训练阶段的配置文件即可)。
  • 推理代码

import fastdeploy as fd
import cv2

model = fd.vision.classification.PaddleClasModel(
                        model_file = 'inference/inference.pdmodel',
                        params_file = 'inference/inference.pdiparams',
                        config_file = 'inference.yml')

img = cv2.imread('dataset/healthy/81935a3879e1f68e.jpg')
result = model.predict(img)
print(result)
  • 输出结果

ClassifyResult(
    label_ids: 3, #该标签和AI Studio项目中制作的AI数据集标签有关系,表示健康图片
    scores: 0.888799, 
)
完成AI推理模型后,简单地读取labelmap文件,然后找到映射关系,即完成了苹果叶面病虫害识别分类任务的推理部分。

我们将推理得到的label ID和labelmap映射文件对应,得到分类id映射的中文名,再将结果进行可视化。

from PIL import Image, ImageDraw, ImageFont

# 得到分类id
labelId = result.label_ids[0]
# 读取labelmap映射文件
with open("dataset/labels_chinese.txt", 'r') as o:
    labelmap = o.readlines()
label = labelmap[labelId].replace('\n', '')

image = Image.fromarray(img)
vis = ImageDraw.Draw(image)
font = ImageFont.truetype(font='simhei.ttf',size=150)
vis.rectangle([(0,0), (1000, 200)], fill="green")
vis.text((200, 30), label, fill=(255, 255, 255), font=font)
image.show()
  • 输出结果



FastDeploy+FastAPI
项目落地




最后再结合FastAPI把输入输出固定成变量,写成可以通过内网或者外网IP能够访问的服务化API接口。

import cv2
from fastapi import FastAPI, File, UploadFile
import tempfile
import uvicorn
import fastdeploy as fd

app = FastAPI()

#初始化模型
model = fd.vision.classification.PaddleClasModel(
                        model_file = 'inference/inference.pdmodel',
                        params_file = 'inference/inference.pdiparams',
                        config_file = 'inference.yml')

@app.post("/image/")
async def get_image(file: UploadFile = File(...)):
    # 接收前端上传的图片
    img = await file.read()
    tempfileName = tempfile.NamedTemporaryFile(suffix='.jpg', delete=False)
    tempfileName.write(img)
tempfileName.close()

    # 使用FastDeploy推理
    img = cv2.imread(tempfileName.name)
    result = model.predict(img)
    labelId = result.label_ids[0]

    # 读取labelmap文件查找映射的中文名
    with open("dataset/labels_chinese.txt"'r', encoding="utf-8"as o:
        labelmap = o.readlines()
label = labelmap[labelId].replace('\n''')

    if label == '健康叶片':
        status = 'primary'
    else:
        status = 'warn'

return {"disease": label, "status": status}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

通过API测试工具,模拟前端上传一张健康叶片的图片测试,查看接口返回的效果:

在测试结果中可以看到程序成功地返回了正确的分类结果,并且从右边的响应时间来看,在Intel CPU i5-6200U笔记本的环境下,FastDeploy的整体推理速度还是非常快的(如果进一步优化IO,整体速度会提升更多)。


总结


从上面两种推理部署方案可以明显看出,FastDeploy的推理部署代码开发量和代码难度都远小于普通推理引擎的推理代码。苹果叶面病害识别分类模型全程包括推理部署代码都在Windows 11环境下开发,代码一行未改顺利地迁移到Linux服务器和树莓派环境下部署上线。
全场景AI推理部署工具箱FastDeploy,目前已经支持TensorRT、OpenVINO、ONNX Runtime、Paddle Inference后端,正在集成Paddle Lite、RKNN等推理引擎。模型支持种类丰富,支持包括飞桨、PyTorch等生态热门模型60+(例如CV领域YOLOv7、PP-YOLOE+等;NLP领域UIE等),并且提供x86 CPU、GPU、ARM CPU、NPU等部署Demo。开发者利用FastDeploy实现一次训练、一个模型、一套代码、多端部署,大大降低了部署门槛和提高了开发效率,快速走完AI模型落地“最后一公里”,把更多的精力放到其他业务代码和工程集成上。

更多模型部署使用

https://github.com/PaddlePaddle/FastDeploy/examples

往期精彩

火箭发动机喷流的“监察队长”:基于飞桨探索火箭发动机真空羽流流场的快速计算

开发者说论文|让谣言无处遁形:基于飞桨完成社交媒体谣言的互动分析和验证




关注【飞桨PaddlePaddle】公众号

获取更多技术内容~