High accurate tool for automatic faces detection with landmarks.
The library is based on public detectors with high accuracy (TinaFace, Retinaface, SCRFD, ...) which are combined together to form an ansamle. All models predict detections, then voting algorithm performs aggregation.
- Install Docker
- Install Nvidia Docker Container Runtime
- Install nvidia-container-runtime:
apt-get install nvidia-container-runtime
- Set
"default-runtime" : "nvidia"
in/etc/docker/daemon.json
:{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
- Restart Docker:
systemctl restart docker
- Install git-lfs to pull artifacts:
git lfs install
docker can require sudo permission and it is used in
run.py
script. So in this case runrun.py
script with sudo permission or add your user to docker group.
# clone project
https://github.com/IgorHoholko/faces_detanator
# [OPTIONAL] create virtual enviroment
virtualenv venv --python=python3.7
source venv/bin/activate
# install requirements
pip install -r requirements.txt
To start annotating, run the command:
python run.py -i <path_to_your_images>
For more information run:
python run.py -h
You can visualize your results:
python -m helpers.draw_output -i <your_meta> -h
You can filter your metadata by threshold after it is formed. Just run:
python -m helpers.filter_output_by_conf -i <your_meta> -t <thres> -h
To add new detector to ansamble you need to perform the next steps:
Take a look at existing detectors to make process easier.
- Create a folder for your detector <detector> in
detectors/
folder. - Prepare inference script for your detector. First, define
"-i", "--input"
argparse parameter which is responsible for input. The script to process the input:
if args.input.split('.')[-1] in ('jpg', 'png'):
img_paths = [args.input]
else:
img_paths = glob.glob(f"{args.input}/**/*.jpg", recursive=True)
img_paths.extend( glob.glob(f"{args.input}/**/*.png", recursive=True) )
- Next create
"-o", "--output"
argparse parameter. The place where annotation will be saved - Now you need to save your annotations in required format. The script to save annotations looks like this:
data = []
for ipath, (bboxes, kpss) in output.items():
line = [ipath, str(len(bboxes)), '$d']
for i in range(len(bboxes)):
conf = bboxes[i][-1]
bbox = bboxes[i][:-1]
bbox = list(map(int, bbox))
bbox = list(map(str, bbox))
landmarks = np.array(kpss[i]).astype(int).flatten()
landmarks = list(map(str, landmarks))
line.append(str(conf))
line.extend(bbox)
line.extend(landmarks)
data.append(' '.join(line))
with open(os.path.join(args.output, 'meta.txt'), 'w') as f:
f.write('\n'.join(data))
If your detector doesn't provide landmarks - set landmarks to be array with all -1
- When inference script is ready, create entrypoint.sh in the root of <detector> folder. entrypoint.sh describes the logic how to infer your detector. It can look like this:
#!/bin/bash
source venv/bin/activate
python3 tools/scrfd.py -s outputs/ "$@"
IMPORTANT set
-s
here to outputs.
- Now create Dockerfile for your detector with defined earlier entrypoint.
- Add your detector to settings.yaml by the sample.
- Done!