| | import pickle |
| |
|
| | from multiprocessing.dummy import Process, Manager, Queue |
| | import cv2 |
| | import numpy as np |
| | |
| | import onnxruntime |
| | onnxruntime.set_default_logger_severity(3) |
| |
|
| |
|
| | class GenInput(Process): |
| | def __init__(self, feature_src_list_, frame_queue_in_, frame_queue_out_): |
| | super().__init__() |
| | self.frame_queue_in = frame_queue_in_ |
| | self.frame_queue_out = frame_queue_out_ |
| | self.feature_src_list = feature_src_list_ |
| |
|
| | def run(self): |
| | with open('data/image_feature_dict.pkl', 'rb') as f: |
| | image_feature_src_dict = pickle.load(f) |
| |
|
| | print(len(image_feature_src_dict)) |
| | self.feature_src_list.append([image_feature_src_dict['1']]) |
| |
|
| | cap = cv2.VideoCapture(0) |
| | cap.set(3, 1920) |
| | cap.set(4, 1080) |
| | print(cv2.CAP_PROP_FOURCC, cv2.CAP_PROP_FPS) |
| | cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) |
| | cap.set(cv2.CAP_PROP_FPS, 30) |
| | print('CAP_PROP_FPS',cap.get(cv2.CAP_PROP_FPS)) |
| |
|
| | count = index = 0 |
| | while True: |
| | _, frame = cap.read() |
| | self.frame_queue_in.put(frame) |
| |
|
| | count += 1 |
| | if count % 500 == 0: |
| | self.feature_src_list.append([image_feature_src_dict['{}'.format(1 + index)], |
| | image_feature_src_dict['{}'.format(10 + index)]]) |
| | print('change src face') |
| | index += 1 |
| | if count % 5000 == 0: |
| | |
| | self.frame_queue_in.put(None) |
| | break |
| |
|
| |
|
| | class GetOutput(Process): |
| | def __init__(self, frame_queue_out_): |
| | super().__init__() |
| | self.frame_queue_out = frame_queue_out_ |
| |
|
| | def run(self): |
| | import time |
| | count = 0 |
| | fps_count = 0 |
| |
|
| | start_time = time.time() |
| | while True: |
| | queue_out = self.frame_queue_out.get() |
| | |
| | frame_out = queue_out[0] |
| | face_detect_flag = queue_out[1] |
| | |
| | fps_count += 1 |
| |
|
| | if fps_count % 300 == 0: |
| | end_time = time.time() |
| | print('fps: {}'.format(fps_count / (end_time - start_time))) |
| | start_time = time.time() |
| | fps_count = 0 |
| | count += 1 |
| | if count % 2500 == 0: |
| | break |
| | cv2.imshow('output', frame_out) |
| | cv2.waitKey(1) |
| |
|
| |
|
| | class FaceSwap(Process): |
| | def __init__(self, feature_src_list_, frame_queue_in_, |
| | frame_queue_out_, model_name=''): |
| | super().__init__() |
| | from HifiFaceAPI_parallel_trt_roi_realtime_api import HifiFaceRealTime |
| | self.hfrt = HifiFaceRealTime(feature_src_list_, frame_queue_in_, |
| | frame_queue_out_, model_name=model_name) |
| |
|
| | def run(self): |
| | self.hfrt.forward() |
| |
|
| |
|
| | if __name__ == '__main__': |
| | frame_queue_in = Queue(2) |
| | frame_queue_out = Queue(2) |
| | manager = Manager() |
| | image_feature_src_list = manager.list() |
| |
|
| | gi = GenInput(image_feature_src_list, frame_queue_in, frame_queue_out) |
| | go = GetOutput(frame_queue_out) |
| | fs = FaceSwap(image_feature_src_list, frame_queue_in, frame_queue_out, model_name='er8_bs1') |
| |
|
| | gi.start() |
| | go.start() |
| | fs.start() |
| |
|
| | gi.join() |
| | print('gi stop') |
| | go.join() |
| | print('go stop') |
| | fs.join() |
| | print('fs stop') |
| |
|
| | print('final stop') |
| |
|