线程
总共分为三个线程,前处理、预测和后处理
'''
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()