from SceneDetector import SceneDetector from multiprocessing import Pipe, Process import numpy as np import time import cv2 def SceneWorker(pipe_conn, model_path, is_Onnx= False): sd = SceneDetector(model_path, is_Onnx= True) while True: data = pipe_conn.recv() if data is None: break results = sd.infer_scenes(data) pipe_conn.send(results) if __name__ == '__main__': model_path = 'models/scene_model.onnx' scene_conn, scene_child_cOnn= Pipe() scene_process = Process(target=SceneWorker, args=(scene_child_conn, model_path, True,)) scene_process.start() test_img = cv2.imread('TestImages/1440P_1000M_8X.jpg') for _ in range(5000): scene_conn.send([test_img]) results = scene_conn.recv()[0] print(results) time.sleep(0.1) #这里在推理间加入了间隔 scene_conn.send(None) scene_process.join()
推理本身时间只用不到 2ms ,连续推理时 CPU 占用率会短暂上升,推理结束后立刻归零,但是如果推理之间有间隔,则 CPU 占用则会保持在一个很高的水平。一开始以为是time.sleep的问题,后来试过了用threading的Event和asyncio的await做间隔,结果也是一样的。 使用Torch或者Onnx的模型结果都是一样的,把cv预处理删除掉也不影响 CPU 使用,所以也不是cv的问题。今天还测试了把推理单独开一个进程,也没有改善。
