Я работаю над проектом, в котором я вызываю face recognition
API, который возвращает status
, subject id
любого человека. Этот API занимает некоторое время, поэтому я поместил его в функцию потока, чтобы основной поток продолжал работать, и как только API получит значения, мы будем работать соответственно. Ниже приведен код:
class RecognizeFaceInFrame(Thread):
global person_image
global f_startX, f_startY, f_endX, f_endY
def __init__(self):
super().__init__()
self.subject_id = " "
self.get_face_name = False
self.stop_thread = False
self.face_status = " "
self.confidence = 0
self.data_present = False
def recognize_face_frame(self):
if self.get_face_name:
face_bbox = (f_startX, f_startY, f_endX, f_endY)
face_image = helper.convert_rect_to_mat_and_save_image(face_bbox, person_image, 10, 30, 'face', 0, save_img=False, conf_score=0, roi_id='test')
helper.log.error("Thread function called")
cv2.imwrite("file.jpg", face_image)
with open("file.jpg", "rb") as image_file:
face_base64 = base64.b64encode(image_file.read())
(self.face_status, self.subject_id, self.confidence) = face.recognize_face_ttfr(face_base64, vision_config['FactoryGalleryName'], vision_config["CallFaceRecognition"])
self.get_face_name = False
self.data_present = True
time.sleep(1)
def run(self):
while not self.stop_thread:
self.recognize_face_frame()
### SOME CODE
### SOME CODE
### SOME CODE
thread = RecognizeFaceInFrame()
thread.start()
### SOME CODE
if objectID not in face_recognition_subjectid or face_recognition_subjectid[objectID] == "Await":
thread.get_face_name = True
while thread.data_present:
if thread.face_status == "Success":
name = thread.subject_id
# Do some work
else:
# Do some work
thread.data_present = False
Объяснение кода:
В приведенном выше коде, если это условие if objectID not in face_recognition_subjectid or face_recognition_subjectid[objectID] == "Await":
становится True
, я выполняю thread.get_face_name
до True
, что активирует функцию потока recognize_face_frame
. Затем будет сделан вызов и вернет данные, а затем я использую данные в коде. Это работает нормально
Проблема
Приведенный выше код работает нормально, только если в кадре только один человек. Допустим, в кадре два человека, поэтому в API будет сделано 2 вызова, которые будут возвращать данные, но на этот раз я не уверен, какие данные принадлежат этому человеку, поскольку нет сопоставления и, следовательно, назначены неверные данные. не тому человеку.
Решение
Я ищу какое-то решение, в котором я могу получить данные в последовательности из потока
(Input)
Thread Function <------------------------------------
(Output)| | |
| | |
| (Request Id 1) | (Request Id 2) |
| | |
| | |
| person 1 call person 2 call
| | |
| | |
| (Data with Id 1) | (Data with Id 2) |
| | |
| | |
|------------------------------------------------
Таким образом, если выполняется вызов для лица 1, а затем выполняется вызов для лица 2, данные, возвращаемые из потока, должны быть сначала для лица 1, а затем для лица 2. Я знаю о queue
, но я не думаю, что в нем есть какая-то последовательность. Может кто-нибудь, пожалуйста, предложите несколько хороших решений. Пожалуйста помоги. Спасибо