Home

Awesome

Robust Face Detection via Learning Small Faces on Hard Images

Performance on WIDER FACE val, FDDB, Pascal Faces and AFW

Link to the trained model

WIDER FACE val easyWIDER FACE val mediumWIDER FACE val hardFDDBPascal FacesAFW
95.794.989.798.799.099.6

Build source code

  1. Clone this repository to $ROOT
  2. Install python library cd $ROOT; pip install -r requirements.txt
  3. Install graphviz apt-get install -y graphviz
  4. Edit the caffe configure file $ROOT/caffe/Makefile.config
  5. Compile caffe cd $ROOT/caffe; make -j; make -j pycaffe
  6. Compile extra library cd $ROOT/lib; make -j

Download the dataset

.
|-- WIDER_train
|   `-- images [61 entries exceeds filelimit, not opening dir]
|-- WIDER_val
|   `-- images [61 entries exceeds filelimit, not opening dir]
|-- ground_truth
|   |-- wider_easy_val.mat
|   |-- wider_face_val.mat
|   |-- wider_hard_val.mat
|   `-- wider_medium_val.mat
`-- wider_face_split
    |-- readme.txt
    |-- wider_face_test.mat
    |-- wider_face_test_filelist.txt
    |-- wider_face_train.mat
    |-- wider_face_train_bbx_gt.txt
    |-- wider_face_val.mat
    `-- wider_face_val_bbx_gt.txt
cd FDDB-folds
for i in `seq -f "%02g" 01 10`; do cat FDDB-fold-${i}.txt >> val.txt; done
for i in `seq -f "%02g" 01 10`; do cat FDDB-fold-${i}-ellipseList.txt >> val_gt.txt; done
.
├── 2002
│   ├── 07 [13 entries exceeds filelimit, not opening dir]
│   ├── 08 [31 entries exceeds filelimit, not opening dir]
│   ├── 09 [30 entries exceeds filelimit, not opening dir]
│   ├── 10 [31 entries exceeds filelimit, not opening dir]
│   ├── 11 [30 entries exceeds filelimit, not opening dir]
│   └── 12 [30 entries exceeds filelimit, not opening dir]
├── 2003
│   ├── 01 [21 entries exceeds filelimit, not opening dir]
│   ├── 02 [28 entries exceeds filelimit, not opening dir]
│   ├── 03 [31 entries exceeds filelimit, not opening dir]
│   ├── 04 [27 entries exceeds filelimit, not opening dir]
│   ├── 05 [30 entries exceeds filelimit, not opening dir]
│   ├── 06 [30 entries exceeds filelimit, not opening dir]
│   ├── 07 [31 entries exceeds filelimit, not opening dir]
│   ├── 08 [30 entries exceeds filelimit, not opening dir]
│   └── 09
│       ├── 01
│       │   └── big [39 entries exceeds filelimit, not opening dir]
│       └── 02
│           └── big
│               ├── img_38.jpg
│               └── img_44.jpg
├── evaluation [27 entries exceeds filelimit, not opening dir]
└── FDDB-folds [22 entries exceeds filelimit, not opening dir]
.
├── images [851 entries exceeds filelimit, not opening dir]
└── pascal_img_list.txt
.
├── 1004109301.jpg
├── 1051618982.jpg
├── ...
└── afw_img_list.txt

Evaluate on WIDER FACE val with trained model

export WIDERFACEPATH=/path/to/your/wider/face/dataset
export MODELPATH=/path/to/your/caffemodel/final.caffemodel
CUDA_VISIBLE_DEVICES=0,1,2,3 python train_test.py --train false --conf configs/smallhardface.toml --amend TEST.MODEL $MODELPATH DATA_DIR $WIDERFACEPATH

The result will be stored in $ROOT/output/face/wider_val/face_$TIME where $TIME is the timestamp when the code begins to run. The APs computed by our unofficial python code lib/wider_eval_tools/wider_eval.py can be found at the end of $ROOT/output/face/wider_val/face_$TIME/stderr.log. For APs computed by official MATLAB code, please evaluate $ROOT/output/face/wider_val/face_$TIME/result.tar.gz with official evaluation toolkit.

Evaluate on FDDB with trained model

export FDDBPATH=/path/to/your/fddb/dataset
export MODELPATH=/path/to/your/caffemodel/final.caffemodel
CUDA_VISIBLE_DEVICES=0,1,2,3 python train_test.py --train false --conf configs/smallhardface-fddb.toml --amend TEST.MODEL $MODELPATH DATA_DIR $FDDBPATH

The result will be stored in $ROOT/output/face/fddb_val/face_$TIME where $TIME is the timestamp when the code begins to run. The TPR@1000 can be found at the end of $ROOT/output/face/fddb_val/face_$TIME/stderr.log. To plot TPR curve, copy rect_DiscROC.txt into $ROOT/external/marcopede-face-eval-f2870fd85d48/detections/fddb and run $ROOT/external/marcopede-face-eval-f2870fd85d48/plot_AP_fddb.py.

Evaluate on Pascal Faces with trained model

export PASCALPATH=/path/to/your/pascal/dataset
export MODELPATH=/path/to/your/caffemodel/final.caffemodel
CUDA_VISIBLE_DEVICES=0,1,2,3 python train_test.py --train false --conf configs/smallhardface-pascal.toml --amend TEST.MODEL $MODELPATH DATA_DIR $PASCALPATH

The result will be stored in $ROOT/output/face/pascalface_val/face_$TIME where $TIME is the timestamp when the code begins to run. To plot PR curve, copy pascal_res.txt into $ROOT/external/marcopede-face-eval-f2870fd85d48/detections/PASCAL and run $ROOT/external/marcopede-face-eval-f2870fd85d48/plot_AP.py.

Evaluate on AFW with trained model

export AFWPATH=/path/to/your/afw/dataset
export MODELPATH=/path/to/your/caffemodel/final.caffemodel
CUDA_VISIBLE_DEVICES=0,1,2,3 python train_test.py --train false --conf configs/smallhardface-afw.toml --amend TEST.MODEL $MODELPATH DATA_DIR $AFWPATH

The result will be stored in $ROOT/output/face/afw_val/face_$TIME where $TIME is the timestamp when the code begins to run. To plot PR curve, copy afw_res.txt into $ROOT/external/marcopede-face-eval-f2870fd85d48/detections/AFW and run $ROOT/external/marcopede-face-eval-f2870fd85d48/plot_AP.py.

Train face detector on WIDER FACE train

Link to the ImageNet pre-trained model

export WIDERFACEPATH=/path/to/your/wider/face/dataset
export MODELPATH=/path/to/your/pretrained/model.caffemodel
CUDA_VISIBLE_DEVICES=0,1,2,3 python train_test.py --conf configs/smallhardface.toml --amend DATA_DIR $WIDERFACEPATH TRAIN.PRETRAINED $MODELPATH

The trained model will be stored in $ROOT/output/face/wider_train/face_$TIME where $TIME is the timestamp when the code begins to run.