HivisionIDPhotos / hivision /creator /face_detector.py
TheEeeeLin's picture
refactor
ca46a75
raw
history blame
1.38 kB
#!/usr/bin/env python
# -*- coding: utf-8 -*-
r"""
@DATE: 2024/9/5 19:32
@File: face_detector.py
@IDE: pycharm
@Description:
人脸检测器
"""
from mtcnnruntime import MTCNN
from .context import Context
from hivision.error import FaceError
import cv2
mtcnn = None
def detect_face(ctx: Context, scale: int = 2):
"""
人脸检测处理者,只进行人脸数量的检测
:param ctx: 上下文,此时已获取到原始图和抠图结果,但是我们只需要原始图
:param scale: 最大边长缩放比例,原图:缩放图 = 1:scale
:raise FaceError: 人脸检测错误,多个人脸或者没有人脸
"""
global mtcnn
if mtcnn is None:
mtcnn = MTCNN()
image = cv2.resize(
ctx.origin_image,
(ctx.origin_image.shape[1] // scale, ctx.origin_image.shape[0] // scale),
interpolation=cv2.INTER_AREA,
)
faces, _ = mtcnn.detect(image)
if len(faces) != 1:
# 保险措施,如果检测到多个人脸或者没有人脸,用原图再检测一次
faces, _ = mtcnn.detect(ctx.origin_image)
else:
for item, param in enumerate(faces[0]):
faces[0][item] = param * 2
if len(faces) != 1:
raise FaceError("Expected 1 face, but got {}".format(len(faces)), len(faces))
ctx.face = (faces[0][0], faces[0][1], faces[0][2], faces[0][3], faces[0][4])