使用Flask完成paddledetection的接口化部署

发布时间 2023-03-23 11:02:47作者: Arisf

由于paddledetection官方没有给出可供自定义更改的推理程序,每次使用都需要输入命令行

python ***.py

于是根据资料,编写自定义的推理程序,并使用py-flask框架实现模型的http接口部署

部署前需要将模型进行推理导出,导出教程详见官方文档

1、clone PaddleDetection源码至本地项目

git clone https://github.com/PaddlePaddle/PaddleDetection.git

2、引入源码中需要的工具类

from PaddleDetection.deploy.python.infer import Detector, visualize_box_mask

3、详细代码

# 推理Flask接口化
import osimport requests
from PIL import Image
from io import BytesIO

import cv2
import numpy as npfrom flask import Flask, request, jsonify
from flask_cors import CORS
from PaddleDetection.deploy.python.infer import Detector, visualize_box_mask model_dir = r"inference_model2/yolov3_darknet53_500e_voc" # 模型路径 save_path = r"E:/output/" # 推理结果保存路径 # 推理参数设置 detector = Detector( model_dir, device='GPU', run_mode='paddle', trt_min_shape=1, trt_max_shape=1280, trt_opt_shape=640, trt_calib_mode=False, cpu_threads=1, enable_mkldnn=False, enable_mkldnn_bfloat16=False, output_dir=save_path, threshold=0.1) def infer_start(img_path, img_name): # 读取网络图片 # cv2无法直接读取网络图片,将PIL.Image转换成OpenCV格式 response = requests.get(img_path) response = response.content BytesIOObj = BytesIO() BytesIOObj.write(response) img = Image.open(BytesIOObj) # ********结束******** frame = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) print("***********INFER START!***********") results = detector.predict_image([frame[:, :, ::-1]], visual=False) # 保存图片有问题,不开启 # ********处理list返回值******** rs = visualize_box_mask(frame, results, detector.pred_config.labels, detector.threshold) im = rs[0] label_rs = rs[1] # ********处理list返回值结束******** im = np.array(im) cv2.imwrite(os.path.join(save_path) + img_name.replace(':', '_'), im) # cv2保存图片 return label_rs app = Flask(__name__) CORS(app, resources=r'/*') @app.route('/infer', methods=['POST']) def main(): image_url = request.args.get("image") # 获得图片路径URL img_name = os.path.split(image_url)[1] # 获取图片名称 # os.path.join在Windows下拼接会显示'\\'而非'/',使用replace替换路径中的'\\' save_rs = (os.path.join(os.getcwd(), save_path, img_name)).replace('\\', '/').replace(':', '_') print("接收到的图片地址:" + image_url) result = infer_start(image_url, img_name) # return result print("***********INFER END!***********") return jsonify({'code': 200, 'save_path': save_rs, 'message': result}) app.run(port=8000)

注:

1、该代码使用PIL.Image库将网络图片转化为cv2格式,解决了cv2无法直接读取http协议图片的问题,如无该需求,请直接使用cv2读取本地图片。

2、如不需要Flask接口部署,直接在main()方法调用infer_start()即可

3、该源码在引用中修改了源码PaddleDetection中infer.py程序中的visualize_box_mask()方法,用于获得更多的返回信息,请根据源码自定义修改此处代码,用于获取所需要的结果