Spaces:
Running on Zero
Running on Zero
| 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) | |