| import threading | |
| from typing import Any | |
| import insightface | |
| import roop.globals | |
| from roop.typing import Frame | |
| FACE_ANALYSER = None | |
| THREAD_LOCK = threading.Lock() | |
| def get_face_analyser() -> Any: | |
| global FACE_ANALYSER | |
| with THREAD_LOCK: | |
| if FACE_ANALYSER is None: | |
| FACE_ANALYSER = insightface.app.FaceAnalysis(name='buffalo_l', providers=roop.globals.execution_providers) | |
| FACE_ANALYSER.prepare(ctx_id=0, det_size=(640, 640)) | |
| return FACE_ANALYSER | |
| def get_one_face(frame: Frame) -> Any: | |
| face = get_face_analyser().get(frame) | |
| try: | |
| return min(face, key=lambda x: x.bbox[0]) | |
| except ValueError: | |
| return None | |
| def get_many_faces(frame: Frame) -> Any: | |
| try: | |
| return get_face_analyser().get(frame) | |
| except IndexError: | |
| return None | |