satoshiNakomoroReal's picture
Deploy shared three-method Gradio app (part 3)
0cb7061 verified
Raw
History Blame Contribute Delete
2.22 kB
import argparse
import cv2
import numpy as np
import os
import torch
import torchvision
from PIL import Image
from facexlib.assessment import init_assessment_model
from facexlib.detection import init_detection_model
def main(args):
"""Scripts about evaluating face quality.
Two steps:
1) detect the face region and crop the face
2) evaluate the face quality by hyperIQA
"""
# initialize model
det_net = init_detection_model(args.detection_model_name, half=False)
assess_net = init_assessment_model(args.assess_model_name, half=False)
# specified face transformation in original hyperIQA
transforms = torchvision.transforms.Compose([
torchvision.transforms.Resize((512, 384)),
torchvision.transforms.RandomCrop(size=224),
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))
])
img = cv2.imread(args.img_path)
img_name = os.path.basename(args.img_path)
basename, _ = os.path.splitext(img_name)
with torch.no_grad():
bboxes = det_net.detect_faces(img, 0.97)
box = list(map(int, bboxes[0]))
pred_scores = []
# BRG -> RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
for i in range(10):
detect_face = img[box[1]:box[3], box[0]:box[2], :]
detect_face = Image.fromarray(detect_face)
detect_face = transforms(detect_face)
detect_face = torch.tensor(detect_face.cuda()).unsqueeze(0)
pred = assess_net(detect_face)
pred_scores.append(float(pred.item()))
score = np.mean(pred_scores)
# quality score ranges from 0-100, a higher score indicates a better quality
print(f'{basename} {score:.4f}')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--img_path', type=str, default='assets/test2.jpg')
parser.add_argument('--detection_model_name', type=str, default='retinaface_resnet50')
parser.add_argument('--assess_model_name', type=str, default='hypernet')
parser.add_argument('--half', action='store_true')
args = parser.parse_args()
main(args)