from batch_face.utils import bbox_from_pts import cv2 from batch_face import drawLandmark_multiple, RetinaFace, LandmarkPredictor from batch_face.face_reconstruction import ShapeRegressor, parse_param import time import numpy as np import time def faces_from_results(results): faces = [] for res in results: ldm_new = res box_new = bbox_from_pts(ldm_new) faces.append([box_new, None, None]) return faces if __name__ == "__main__": predictor = LandmarkPredictor(backbone="PFLD", file=None) detector = RetinaFace(0) regressor = ShapeRegressor(gpu_id=0) cap = cv2.VideoCapture(0) faces = None results = None recon_landmarks = [] while True: ret, img = cap.read() start = time.time() if not ret: break if faces is None: faces = detector(img, cv=True, threshold=0.5) img_for_show = img.copy() if len(faces) == 0: print("NO face is detected!") continue else: if results is None: results = predictor(faces, img, from_fd=True) faces = faces_from_results(results) boxes = [face[0] for face in faces] recon_results = regressor(boxes, img) results = [] for recon_res, box in zip(recon_results, boxes): pts = recon_res["pts68"] results.append(pts) img_for_show = drawLandmark_multiple(img_for_show, box, pts) cv2.imshow("", img_for_show) print("FPS=", 1 / (time.time() - start)) cv2.waitKey(1)