【问题标题】:OpenVino inference request blocks in multiprocessing python implementation多处理 python 实现中的 OpenVino 推理请求块
【发布时间】:2021-08-02 15:30:53
【问题描述】:

我正在从事一个使用 OpenVino 和 Python3 从图像中提取信息的项目。由于项目的扩展,决定我们的人脸检测模块在多处理模块的支持下独立工作。

不幸的是,我无法在这个框架内进行人脸检测,因为来自 IeCore 的 infer() 方法似乎会阻塞(没有主要的实现问题,因为我可以使提到的方法在使用踩模块而不是进程时正常工作)。

因此,欢迎任何有关如何解决此问题的帮助。

下面是我尝试使用多处理模块运行的代码的主要元素。

import os
import cv2
import time
import numpy as np
from pathlib import Path
from multiprocessing import Process

from modules.face.abstract.abcopenvino import ABCOpenVino
from modules.utils.blob2frame import blob2frame

from openvino.inference_engine import IECore, Blob, TensorDesc

YAXIS = 0
XAXIS = 1

class FaceDetection(ABCOpenVino):

    def __init__(self, frame_queue, face_queue):
        super().__init__()

        if not hasattr(self, 'confidence'):
            raise ValueError('Class attribute confidence must be defined')

        self._smoothed = np.zeros((4, )).astype('float32')

        self.frame_queue = frame_queue
        self.face_queue = face_queue
        
        ie_core_handle = IECore()

        self._network = ie_core_handle.read_network(self.file_xml, self.file_bin)

        key = next(iter(self._network.input_info))

        self.tensor_description = self._network.input_info[key].tensor_desc

        self._executable_network = ie_core_handle.load_network(self._network, device_name='CPU', num_requests=1)

        self.inference_request = self._executable_network.requests[0]

        self.input_blob_name = next(iter(self.inference_request.input_blobs))
        self.output_blob_name = next(iter(self.inference_request.output_blobs))

        self.p = Process(target=self._process_exec, args=())
        self.p.name = '{}_{}'.format(__name__, 0)
        self.p.daemon = True
        self.p.start()
        time.sleep(0.01)

        # With treading it works
        #import threading
        #t = threading.Thread(target=self._process_exec, args=())
        #t.name = '{}_{}'.format(__name__, 0)
        #t.daemon = True
        #t.start()
        #time.sleep(0.01)
 
    def _process_exec(self):
        self.myprint("Running! pid: {}".format(os.getpid()))

        while True:
            if self._stop:
                self.myprint('Stopping! pid: {}'.format(os.getpid()))
                time.sleep(0.05)
                break

            elem = self.frame_queue.get()

            if elem:
                frame, = elem
                face_bbox_lst = self._network_infer(frame)
                if face_bbox_lst:
                    elem = (frame, face_bbox_lst, )
                    self.face_queue.put(elem)

        self.myprint('Done')
        return

    def _network_infer(self, frame):
        N, C, H, W = self.tensor_description.dims
        hwc = cv2.resize(frame, (H, W,)).astype('float32')
        chw = hwc.transpose((2, 0, 1))
        input_blob = Blob(self.tensor_description, chw)
        
        self.inference_request.set_blob(blob_name=self.input_blob_name, blob=input_blob)       

        self.inference_request.infer()

        output = self.inference_request.output_blobs[self.output_blob_name].buffer
        return output

    def terminate(self):
        self._stop = True

【问题讨论】:

    标签: python-3.x multiprocessing openvino


    【解决方案1】:
    self.frame_queue = frame_queue
    self.face_queue = face_queue
    

    必须是 multiprocessing.Queue 而不是 queue.Queue。顺便说一句,对于此类任务,我更喜欢 mp.Pool().imap - 没有队列也没有比赛

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2016-02-05
      • 1970-01-01
      • 2018-06-30
      • 2013-02-25
      • 2019-04-16
      相关资源
      最近更新 更多