| 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') |
|
|