PaddlePaddle——多线程并行预处理、预测、后处理

线程

总共分为三个线程,前处理、预测和后处理

'''
Descripttion: 
version: 
Author: Irving.Gao
Date: 2022-01-04 22:44:42
LastEditors: Irving.Gao
LastEditTime: 2022-01-19 15:00:59
'''
import cv2
import numpy as np
import time
import threading

from Lib.PaddleDetection_Inference_Lib import Paddle_Detection

# --------------------------配置区域--------------------------
infer_img_size = 320        # 自定义模型预测的输入图像尺寸
use_model_img_size = True   # 是否使用模型默认输入图像尺寸,默认为True
use_gpu = True              # 是否使用GPU
gpu_memory = 500            # GPU的显存
use_tensorrt = False        # 是否使用TensorRT
precision_mode = "fp16"
filter_mode = True
# 模型文件路径
model_folder_dir = "..\model\ppyolo_tiny_650e_coco"
# -----------------------------------------------------------

class MultiTheard:
    def __init__(self, cap, paddle_infer):
        self.cap = cap
        self.paddle_infer = paddle_infer
        self.result = None
        self.last_result = None

    def thread_init(self):
        _, image = self.cap.read()
        self.paddle_infer.init(image.shape[1],image.shape[0])
        t1 = threading.Thread(target=self.proprocess_thread, args=(self.cap,))
        t2 = threading.Thread(target=self.infer_thread)
        t3 = threading.Thread(target=self.post_thread)
        return [t1, t2, t3]

    def thread_start(self):
        thread_list = self.thread_init()
        for thread in thread_list:
            thread.start()
            time.sleep(1)

    def proprocess_thread(self, cap):
        while True:
            start = time.time()
            _, self.image = cap.read()
            self.proprocess_image = self.paddle_infer.preprocess(self.image)
            # print("FPS pro:", 1/(time.time()-start), "/s")

    def infer_thread(self):
        while True:
            start = time.time()
            self.result = self.paddle_infer.predict(paddle_infer.predictor, [paddle_infer.infer_im_shape, self.proprocess_image, paddle_infer.scale_factor])[0]
            print("FPS infer:", 1/(time.time()-start), "/s")

    def post_thread(self):
        while True:
            if type(self.result) == "<class 'numpy.ndarray'>":
                if self.result == self.last_result:
                    continue
            start = time.time()
            post_image, object_list = self.paddle_infer.object_filter_show(self.image, self.result, threshold=0.3)
            self.last_result = self.result
            try:
                print("FPS post:", 1/(time.time()-start), "/s")
            except ZeroDivisionError:
                pass
            cv2.imshow("image", post_image)
            if cv2.waitKey(1) & 0xFF == ord('q') or cv2.waitKey(1) == 27:
                cv2.destroyAllWindows()
                break
        self.cap.release()
            

if __name__ == '__main__':
    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    paddle_infer = Paddle_Detection(model_folder_dir=model_folder_dir, use_model_img_size=use_model_img_size, 
                                    infer_img_size=infer_img_size, use_gpu=use_gpu, filter_mode=filter_mode, 
                                    gpu_memory=gpu_memory, use_tensorrt=use_tensorrt, precision=precision_mode)
    mt = MultiTheard(cap, paddle_infer)
    mt.thread_start()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值