Vítor Albiero, Xingyu Chen, Xi Yin, Guan Pang, Tal Hassner, "img2pose: Face Alignment and Detection via 6DoF, Face Pose Estimation," arXiv:2012.07791, Dec., 2020
We propose real-time, six degrees of freedom (6DoF), 3D face pose estimation without face detection or landmark localization. We observe that estimating the 6DoF rigid transformation of a face is a simpler problem than facial landmark detection, often used for 3D face alignment. In addition, 6DoF offers more information than face bounding box labels. We leverage these observations to make multiple contributions: (a) We describe an easily trained, efficient, Faster R-CNN--based model which regresses 6DoF pose for all faces in the photo, without preliminary face detection. (b) We explain how pose is converted and kept consistent between the input photo and arbitrary crops created while training and evaluating our model. (c) Finally, we show how face poses can replace detection bounding box training labels. Tests on AFLW2000-3D and BIWI show that our method runs at real-time and outperforms state of the art (SotA) face pose estimators. Remarkably, our method also surpasses SotA models of comparable complexity on the WIDER FACE detection benchmark, despite not been optimized on bounding box labels.
If you use any part of our code or data, please cite our paper.
@InProceedings{img2pose,
author = {Vítor Albiero, Xingyu Chen, Xi Yin, Guan Pang, Tal Hassner},
title = {img2pose: Face Alignment and Detection via 6DoF, Face Pose Estimation},
booktitle = {arxiv},
year = {2020}
}
Install dependecies.
pip install -r requirements.txt
Install the renderer, which is used to visualize predictions. The renderer implementation is forked from here.
cd Sim3DR
sh build_sim3dr.sh
First, download our annotations as instructed in Annotations.
Download WIDER FACE dataset and extract to datasets/WIDER_Face.
Then, to create the train and validation files (LMDB), run the following scripts.
python3 convert_json_list_to_lmdb.py
--json_list ./annotations/WIDER_train_annotations.txt
--dataset_path ./datasets/WIDER_Face/WIDER_train/images/
--dest ./datasets/lmdb/
-—train
This first script will generate a LMDB dataset, which contains the training images along with annotations. It will also output a pose mean and std deviation files, which will be used for training and testing.
python3 convert_json_list_to_lmdb.py
--json_list ./annotations/WIDER_val_annotations.txt
--dataset_path ./datasets/WIDER_Face/WIDER_val/images/
--dest ./datasets/lmdb
This second script will create a LMDB containing the validation images along with annotations.
Once the LMDB train/val files are created, to start training simple run the script below.
CUDA_VISIBLE_DEVICES=0 python3 train.py
--pose_mean ./datasets/lmdb/WIDER_train_annotations_pose_mean.npy
--pose_stddev ./datasets/lmdb/WIDER_train_annotations_pose_stddev.npy
--workspace ./workspace/
--train_source ./datasets/lmdb/WIDER_train_annotations.lmdb
--val_source ./datasets/lmdb/WIDER_val_annotations.lmdb
--prefix trial_1
--batch_size 2
--lr_plateau
--early_stop
--random_flip
--random_crop
--max_size 1400
For now, only single GPU training is tested. Distributed training is partially implemented, PRs welcome.
To evaluate with the pretrained model, download the model from Model Zoo, and extract it to the main folder. It will create a folder called models, which contains the model weights and the pose mean and std dev that was used for training.
If evaluating with own trained model, change the pose mean and standard deviation to the ones trained with.
To visualize a trained model on the WIDER FACE validation set run the notebook visualize_trained_model_predictions.
If you haven't done already, download the WIDER FACE dataset and extract to datasets/WIDER_Face.
python3 evaluation/evaluate_wider.py
--dataset_path datasets/WIDER_Face/WIDER_val/images/
--dataset_list datasets/WIDER_Face/wider_face_split/wider_face_val_bbx_gt.txt
--pretrained_path models/img2pose_v1.pth
--output_path results/WIDER_FACE/Val/
To check mAP and plot curves, download the eval tools and point to results/WIDER_FACE/Val.
Download the AFLW2000-3D dataset and unzip to datasets/AFLW2000.
Run the notebook aflw_2000_3d_evaluation.
Download the BIWI dataset and unzip to datasets/BIWI.
Run the notebook biwi_evaluation.
Run the notebook test_own_images.
For every face detected, the model outputs by default:
- Pose (6 degrees of freedom)
- Projected bounding boxes
- Face scores
Since the projected bounding box without expansion ends at the start of the forehead, we provide a way of expanding the forehead invidually, along with default x and y expansion.
To customize the size of the projected bounding boxes, when creating the model change any of the bounding box expansion variables as shown below (a complete example can be seen at visualize_trained_model_predictions).
# how much to expand in width
bbox_x_factor = 1.1
# how much to expand in height
bbox_y_factor = 1.1
# how much to expand in the forehead
expand_forehead = 0.3
img2pose_model = img2poseModel(
...,
bbox_x_factor=bbox_x_factor,
bbox_y_factor=bbox_y_factor,
expand_forehead=expand_forehead,
)
Check license for license details.