Skip to main content

Face analysis library.

Project description

LibFace

build lint PyPI Conda (channel only) PyPI - License Code style: black

Hugging Face Space demo app ๐Ÿค—

Google Colab notebook demo Open In Colab

User Guide, Documentation, ChatGPT facetorch guide

Docker Hub (GPU)

LibFace is a Python library that can detect faces and analyze facial features using deep neural networks. The goal is to gather open sourced face analysis models from the community, optimize them for performance using TorchScript and combine them to create a face analysis tool that one can:

  1. configure using Hydra (OmegaConf)
  2. reproduce with conda-lock and Docker
  3. accelerate on CPU and GPU with TorchScript
  4. extend by uploading a model file to Google Drive and adding a config yaml file to the repository

Please, use the library responsibly with caution and follow the ethics guidelines for Trustworthy AI from European Commission. The models are not perfect and may be biased.

Install

PyPI

pip install libface

Conda

conda install -c conda-forge libface

Usage

Prerequisites

Docker Compose provides an easy way of building a working libface environment with a single command.

Run docker example

  • CPU: docker compose run libface python ./scripts/example.py
  • GPU: docker compose run libface-gpu python ./scripts/example.py analyzer.device=cuda

Check data/output for resulting images with bounding boxes and facial 3D landmarks.

(Apple Mac M1) Use Rosetta 2 emulator in Docker Desktop to run the CPU version.

Configure

The project is configured by files located in conf with the main file: conf/config.yaml. One can easily add or remove modules from the configuration.

Components

FaceAnalyzer is the main class of libface as it is the orchestrator responsible for initializing and running the following components:

  1. Reader - reads the image and returns an ImageData object containing the image tensor.
  2. Detector - wrapper around a neural network that detects faces.
  3. Unifier - processor that unifies sizes of all faces and normalizes them between 0 and 1.
  4. Predictor dict - set of wrappers around neural networks trained to analyze facial features.
  5. Utilizer dict - set of wrappers around any functionality that requires the output of neural networks e.g. drawing bounding boxes or facial landmarks.

Structure

analyzer
    โ”œโ”€โ”€ reader
    โ”œโ”€โ”€ detector
    โ”œโ”€โ”€ unifier
    โ””โ”€โ”€ predictor
            โ”œโ”€โ”€ embed
            โ”œโ”€โ”€ verify
            โ”œโ”€โ”€ fer
            โ”œโ”€โ”€ au
            โ”œโ”€โ”€ va
            โ”œโ”€โ”€ deepfake
            โ””โ”€โ”€ align
    โ””โ”€โ”€ utilizer
            โ”œโ”€โ”€ align
            โ”œโ”€โ”€ draw
            โ””โ”€โ”€ save

Models

Detector

|     model     |   source  |   params  |   license   | version |
| ------------- | --------- | --------- | ----------- | ------- |
|   RetinaFace  |  biubug6  |   27.3M   | MIT license |    1    |
  1. biubug6

Predictor

Facial Representation Learning (embed)

|       model       |   source   |  params |   license   | version |  
| ----------------- | ---------- | ------- | ----------- | ------- |
|  ResNet-50 VGG 1M |  1adrianb  |  28.4M  | MIT license |    1    |
  1. 1adrianb

Face Verification (verify)

|       model      |   source    |  params  |      license       | version |  
| ---------------- | ----------- | -------- | ------------------ | ------- |
|    MagFace+UNPG  | Jung-Jun-Uk |   65.2M  | Apache License 2.0 |    1    |
|  AdaFaceR100W12M |  mk-minchul |    -     |     MIT License    |    2    |
  1. Jung-Jun-Uk
  2. mk-minchul

Facial Expression Recognition (fer)

|       model       |      source    |  params  |       license      | version |  
| ----------------- | -------------- | -------- | ------------------ | ------- |
| EfficientNet B0 7 | HSE-asavchenko |    4M    | Apache License 2.0 |    1    |
| EfficientNet B2 8 | HSE-asavchenko |   7.7M   | Apache License 2.0 |    2    |
  1. HSE-asavchenko

Facial Action Unit Detection (au)

|        model        |   source  |  params |       license      | version |  
| ------------------- | --------- | ------- | ------------------ | ------- |
| OpenGraph Swin Base |  CVI-SZU  |   94M   |     MIT License    |    1    |
  1. CVI-SZU

Facial Valence Arousal (va)

|       model       |   source   |  params |   license   | version |
| ----------------- | ---------- | ------- | ----------- | ------- |
|  ELIM AL AlexNet  | kdhht2334  |  2.3M   | MIT license |    1    |
  1. kdhht2334

Deepfake Detection (deepfake)

|         model        |      source      |  params  |   license   | version |
| -------------------- | ---------------- | -------- | ----------- | ------- |
|    EfficientNet B7   |     selimsef     |   66.4M  | MIT license |    1    |
  1. selimsef

Face Alignment (align)

|       model       |      source      |  params  |   license   | version |
| ----------------- | ---------------- | -------- | ----------- | ------- |
|    MobileNet v2   |     choyingw     |   4.1M   | MIT license |    1    |
  1. choyingw

Model download

Models are downloaded during runtime automatically to the models directory. You can also download the models manually from a public Google Drive folder.

Execution time

Image test.jpg (4 faces) is analyzed (including drawing boxes and landmarks, but not saving) in about 486ms and test3.jpg (25 faces) in about 1845ms (batch_size=8) on NVIDIA Tesla T4 GPU once the default configuration (conf/config.yaml) of models is initialized and pre heated to the initial image size 1080x1080 by the first run. One can monitor the execution times in logs using the DEBUG level.

Detailed test.jpg execution times:

analyzer
    โ”œโ”€โ”€ reader: 27 ms
    โ”œโ”€โ”€ detector: 193 ms
    โ”œโ”€โ”€ unifier: 1 ms
    โ””โ”€โ”€ predictor
            โ”œโ”€โ”€ embed: 8 ms
            โ”œโ”€โ”€ verify: 58 ms
            โ”œโ”€โ”€ fer: 28 ms
            โ”œโ”€โ”€ au: 57 ms
            โ”œโ”€โ”€ va: 1 ms
            โ”œโ”€โ”€ deepfake: 117 ms
            โ””โ”€โ”€ align: 5 ms
    โ””โ”€โ”€ utilizer
            โ”œโ”€โ”€ align: 8 ms
            โ”œโ”€โ”€ draw_boxes: 22 ms
            โ”œโ”€โ”€ draw_landmarks: 7 ms
            โ””โ”€โ”€ save: 298 ms

Development

Run the Docker container:

  • CPU: docker compose -f docker-compose.dev.yml run facetorch-dev
  • GPU: docker compose -f docker-compose.dev.yml run facetorch-dev-gpu

Add predictor

Prerequisites

  1. file of the TorchScript model
  2. ID of the Google Drive model file
  3. facetorch fork

Facetorch works with models that were exported from PyTorch to TorchScript. You can apply torch.jit.trace function to compile a PyTorch model as a TorchScript module. Please verify that the output of the traced model equals the output of the original model.

The first models are hosted on my public Google Drive folder. You can either send the new model for upload to me, host the model on your Google Drive or host it somewhere else and add your own downloader object to the codebase.

Configuration

Create yaml file
  1. Create new folder with a short name of the task in predictor configuration directory /conf/analyzer/predictor/ following the FER example in /conf/analyzer/predictor/fer/
  2. Copy the yaml file /conf/analyzer/predictor/fer/efficientnet_b2_8.yaml to the new folder /conf/analyzer/predictor/<predictor_name>/
  3. Change the yaml file name to the model you want to use: /conf/analyzer/predictor/<predictor_name>/<model_name>.yaml
Edit yaml file
  1. Change the Google Drive file ID to the ID of the model.
  2. Select the preprocessor (or implement a new one based on BasePredPreProcessor) and specify it's parameters e.g. image size and normalization in the yaml file to match the requirements of the new model.
  3. Select the postprocessor (or implement a new one based on BasePredPostProcessor) and specify it's parameters e.g. labels in the yaml file to match the requirements of the new model.
  4. (Optional) Add BaseUtilizer derivative that uses output of your model to perform some additional actions.
Configure tests
  1. Add a new predictor to the main config.yaml and all tests.config.n.yaml files. Alternatively, create a new config file e.g. tests.config.n.yaml and add it to the /tests/conftest.py file.
  2. Write a test for the new predictor in /tests/test_<predictor_name>.py

Test and submit

  1. Run linting: black facetorch
  2. Add the new predictor to the README model table.
  3. Update CHANGELOG and version
  4. Submit a pull request to the repository

Update environment

CPU:

  • Add packages with corresponding versions to environment.yml file
  • Lock the environment: conda lock -p linux-64 -f environment.yml --lockfile conda-lock.yml
  • (Alternative Docker) Lock the environment: docker compose -f docker-compose.dev.yml run facetorch-lock
  • Install the locked environment: conda-lock install --name env conda-lock.yml

GPU:

  • Add packages with corresponding versions to gpu.environment.yml file
  • Lock the environment: conda lock -p linux-64 -f gpu.environment.yml --lockfile gpu.conda-lock.yml
  • (Alternative Docker) Lock the environment: docker compose -f docker-compose.dev.yml run facetorch-lock-gpu
  • Install the locked environment: conda-lock install --name env gpu.conda-lock.yml

Run tests + coverage

  • Run tests and generate coverage: pytest tests --verbose --cov-report html:coverage --cov facetorch

Generate documentation

  • Generate documentation from docstrings using pdoc3: pdoc --html facetorch --output-dir docs --force --template-dir pdoc/templates/

Profiling

  1. Run profiling of the example script: python -m cProfile -o profiling/example.prof scripts/example.py
  2. Open profiling file in the browser: snakeviz profiling/example.prof

Acknowledgements

I want to thank the open source code community and the researchers who have published the models. This project would not be possible without their work.

Logo was generated using DeepAI Text To Image API

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

libface-0.1.2.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

libface-0.1.2-py3-none-any.whl (36.7 kB view details)

Uploaded Python 3

File details

Details for the file libface-0.1.2.tar.gz.

File metadata

  • Download URL: libface-0.1.2.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for libface-0.1.2.tar.gz
Algorithm Hash digest
SHA256 c6f78747cff49a6632beb8ef0644af581c8b95b23c7e0fedf474ba6314cfc1bd
MD5 66c3619bf8ae99e119e2fd3dbd555c21
BLAKE2b-256 ee8bac4b0d75e451c842969423c5bfcdd999d493f7b5d5565a1f82e8dc526c12

See more details on using hashes here.

File details

Details for the file libface-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: libface-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 36.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for libface-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5f5e7a354fa60f67f192651a532534c04ea268c292cad7483fa8be0d683d5512
MD5 b26e83df1756af48469aa980771213eb
BLAKE2b-256 2cdf22c107f4059dd31fd184a957bca1ecad4e8ddd767be5f4f2837a00d4059a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page