Package: pyfacer
FACERFace related toolkit. This repo is still under construction to include more models.Updates[14/05/2023] Face attribute recognition model trained on CelebA is available, check it outhere.[04/05/2023] Face alignment model trained on IBUG300W, AFLW19, WFLW dataset is available, check it outhere.[27/04/2023] Face parsing model trained on CelebM dataset is available, check it outhere.InstallThe easiest way to install it is using pip:pipinstallgit+https://github.com/FacePerceiver/facer.git@mainNo extra setup needs, pretrained weights will be downloaded automatically.If you have trouble install from source, you can try install from PyPI:pipinstallpyfacerthe PyPI version is not guaranteed to be the latest version, but we will try to keep it up to date.Face DetectionWe simply wrap a retinaface detector for easy usage.importfacerimage=facer.hwc2bchw(facer.read_hwc('data/twogirls.jpg')).to(device=device)# image: 1 x 3 x h x wface_detector=facer.face_detector('retinaface/mobilenet',device=device)withtorch.inference_mode():faces=face_detector(image)facer.show_bchw(facer.draw_bchw(image,faces))Checkthis notebookfor full example.Please consider citing@inproceedings{deng2020retinaface,
  title={Retinaface: Single-shot multi-level face localisation in the wild},
  author={Deng, Jiankang and Guo, Jia and Ververas, Evangelos and Kotsia, Irene and Zafeiriou, Stefanos},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={5203--5212},
  year={2020}
}Face ParsingWe wrap theFaRLmodels for face parsing.importtorchimportfacerdevice='cuda'iftorch.cuda.is_available()else'cpu'image=facer.hwc2bchw(facer.read_hwc('data/twogirls.jpg')).to(device=device)# image: 1 x 3 x h x wface_detector=facer.face_detector('retinaface/mobilenet',device=device)withtorch.inference_mode():faces=face_detector(image)face_parser=facer.face_parser('farl/lapa/448',device=device)# optional "farl/celebm/448"withtorch.inference_mode():faces=face_parser(image,faces)seg_logits=faces['seg']['logits']seg_probs=seg_logits.softmax(dim=1)# nfaces x nclasses x h x wn_classes=seg_probs.size(1)vis_seg_probs=seg_probs.argmax(dim=1).float()/n_classes*255vis_img=vis_seg_probs.sum(0,keepdim=True)facer.show_bhw(vis_img)facer.show_bchw(facer.draw_bchw(image,faces))Checkthis notebookfor full example.Please consider citing@inproceedings{zheng2022farl,
  title={General facial representation learning in a visual-linguistic manner},
  author={Zheng, Yinglin and Yang, Hao and Zhang, Ting and Bao, Jianmin and Chen, Dongdong and Huang, Yangyu and Yuan, Lu and Chen, Dong and Zeng, Ming and Wen, Fang},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={18697--18709},
  year={2022}
}Face AlignmentWe wrap theFaRLmodels for face alignment.importtorchimportcv2frommatplotlibimportpyplotaspltdevice='cuda'iftorch.cuda.is_available()else'cpu'importfacerimg_file='data/twogirls.jpg'# image: 1 x 3 x h x wimage=facer.hwc2bchw(facer.read_hwc(img_file)).to(device=device)face_detector=facer.face_detector('retinaface/mobilenet',device=device)withtorch.inference_mode():faces=face_detector(image)face_aligner=facer.face_aligner('farl/ibug300w/448',device=device)# optional: "farl/wflw/448", "farl/aflw19/448"withtorch.inference_mode():faces=face_aligner(image,faces)img=cv2.imread(img_file)[...,::-1]vis_img=img.copy()forptsinfaces['alignment']:vis_img=facer.draw_landmarks(vis_img,None,pts.cpu().numpy())plt.imshow(vis_img)Checkthis notebookfor full example.Please consider citing@inproceedings{zheng2022farl,
  title={General facial representation learning in a visual-linguistic manner},
  author={Zheng, Yinglin and Yang, Hao and Zhang, Ting and Bao, Jianmin and Chen, Dongdong and Huang, Yangyu and Yuan, Lu and Chen, Dong and Zeng, Ming and Wen, Fang},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={18697--18709},
  year={2022}
}Face Attribute RecognitionWe wrap theFaRLmodels for face attribute recognition, the model achieves 92.06% accuracy onCelebAdataset.importsysimporttorchimportfacerdevice="cuda"iftorch.cuda.is_available()else"cpu"# image: 1 x 3 x h x wimage=facer.hwc2bchw(facer.read_hwc("data/girl.jpg")).to(device=device)face_detector=facer.face_detector("retinaface/mobilenet",device=device)withtorch.inference_mode():faces=face_detector(image)face_attr=facer.face_attr("farl/celeba/224",device=device)withtorch.inference_mode():faces=face_attr(image,faces)labels=face_attr.labelsface1_attrs=faces["attrs"][0]# get the first face's attributesprint(labels)forprob,labelinzip(face1_attrs,labels):ifprob>0.5:print(label,prob.item())Checkthis notebookfor full example.Please consider citing@inproceedings{zheng2022farl,
  title={General facial representation learning in a visual-linguistic manner},
  author={Zheng, Yinglin and Yang, Hao and Zhang, Ting and Bao, Jianmin and Chen, Dongdong and Huang, Yangyu and Yuan, Lu and Chen, Dong and Zeng, Ming and Wen, Fang},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  pages={18697--18709},
  year={2022}
}