/yudet

The training program for libfacedetection for face detection and 5-landmark detection.

Primary LanguageC++

Training for libfacedetection in PyTorch

License

It is the training program for libfacedetection. The source code is based on FaceBoxes.PyTorch and ssd.pytorch.

Visualization of our network architecture: [netron].

Contents

Installation

  1. Install PyTorch >= v1.7.0 following official instruction.

  2. Clone this repository. We will call the cloned directory as $TRAIN_ROOT.

    git clone https://github.com/ShiqiYu/libfacedetection.train
  3. Install NVIDIA DALI following official instruction: https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html

  4. Install dependencies.

    pip install -r requirements.txt

Note: Codes are based on Python 3+.

Preparation

  1. Download the WIDER Face dataset and its evaluation tools.
  2. Extract zip files under $TRAIN_ROOT/data/widerface and run python ./tools/gt2coco.py:
    $ tree data/widerface
    data/widerface
    ├── wider_face_split
    ├── WIDER_test
    ├── WIDER_train
    ├── WIDER_val
    └── trainset.json           

NOTE:
We relabled the WIDER Face train set using RetinaFace. New labels are in $TRAIN_ROOT/data/widerface/trainset.json, which is the COCO_format annotations file used in DALI dataloader.

Training

python train.py -c ./config/yufacedet.yaml -t demo 

Detection

python detect.py -c ./config/yufacedet.yaml -m weights/yunet_final.pth --target filename.jpg 

Evaluation on WIDER Face

  1. Build NMS module.

    cd tools/widerface_eval
    python setup.py build_ext --inplace
  2. Perform evaluation. To reproduce the following performance, run on the default settings. Run python test.py --help for more options.

    python test.py -m weights/yunet_final.pth -c ./config/yufacedet.yaml

NOTE: We now use the Python version of eval_tools from here.

Performance on WIDER Face (Val): confidence_threshold=0.3, nms_threshold=0.45, in origin size:

AP_easy=0.882, AP_medium=0.871, AP_hard=0.767

Export CPP source code

The following bash code can export a CPP file for project libfacedetection

python exportcpp.py -c ./config/yufacedet.yaml -m weights/yunet_final.pth

Export to onnx model

Export to onnx model for libfacedetection/example/opencv_dnn.

python exportonnx.py -m weights/yunet_final.pth

Citation

The loss used in training is EIoU, a novel extended IoU. More details can be found in:

@article{eiou,
 author={Peng, Hanyang and Yu, Shiqi},
 journal={IEEE Transactions on Image Processing}, 
 title={A Systematic IoU-Related Method: Beyond Simplified Regression for Better Localization}, 
 year={2021},
 volume={30},
 pages={5032-5044},
 doi={10.1109/TIP.2021.3077144}
 }

The paper can be open accessed at https://ieeexplore.ieee.org/document/9429909.

We also published a paper on face detection to evaluate different methods.

@article{facedetect-yu,
 author={Yuantao Feng and Shiqi Yu and Hanyang Peng and Yan-ran Li and Jianguo Zhang}
 title={Detect Faces Efficiently: A Survey and Evaluations},
 journal={IEEE Transactions on Biometrics, Behavior, and Identity Science},
 year={2021}
 }

The paper can be open accessed at https://ieeexplore.ieee.org/document/9580485