CompreFace is a free face recognition service that can be easily integrated into
any system without prior machine learning skills.
Contributing
·
Submit an Issue
·
Blog
·
Community chat
- Overview
- Features
- Getting started
- Simple tutorial of usage
- How it works
- Technologies
- Rest API description
- Contributing
- License info
CompreFace is docker-based application for facial recognition that can be integrated as a standalone server or deployed on the cloud and can be set up and used without machine learning expertise. Our method is based on deep neural networks, which is one of the most popular facial recognition methods and provides a convenient REST API for Face Collection training and face recognition. We also provide a roles system with which you can easily control who has access to the Face Collection. Every user can create their own models and train them on different subsets of input data.
We are constantly improving our product. But for better understanding which features we should add or improve we need your help! Feedback form is totally anonymous, it will take just 2 minutes of your time to answer the questions: https://forms.gle/ybAEPc3XmzEcpv4M8
The system can accurately identify people even when it is only given one example of their face. CompreFace:
- Uses open-source code and operates fully on-premises for data security
- Can be set up and used without machine learning expertise
- Uses one of the most popular face recognition methods for highest accuracy
- Includes a UI panel with roles for access control
- Starts quickly with one docker command
- Install Docker and Docker-Compose
- Download the archive from our latest release: https://github.com/exadel-inc/CompreFace/releases
- Unzip the archive
- Run command: docker-compose up -d
- Open in your browser: https://localhost:8000/login
- Install Docker and Docker-Compose
- Clone repository
- Open dev folder
- Run command: docker-compose up --build
- Open in your browser: https://localhost:8000/login
- Install Docker
- Download the archive from our latest release: https://github.com/exadel-inc/CompreFace/releases
- Unzip the archive
- Run Docker
- Windows search bar-> cmd->in the Command prompt-> cd ->paste the path to the extracted zip folder
- Run command: docker-compose up -d
- Open https://localhost:8000/login
** Tips for Windows** (use Git Bash terminal)
- Turn of the git autocrlf with command: git config --global core.autocrlf false
- Make sure all your containers are down: $ docker ps
- In case some containers are working, they should be stopped: $ docker-compose down
- Clean all local datebases and images: docker system prune --volumes
- Last line in /dev/start.sh file change to docker-compose -f docker-compose.yml up --remove-orphans --build
- Go to Dev folder cd dev
- Run sh start.sh and make sure https://localhost:8000/ starts
- Stopped all containers: $ docker-compose down
- Run sh start--dev.sh and make sure https://localhost:4200/ starts
Step 1. You need to sign up to the system (First user in CompareFace admin has Owner role, but it is possible to change the role) and then LogIn with created account or just use the existing one. After that system redirects you to the main page.
Step 2. Create an application (left section) with "Create" link at the bottom of the page. An application is where you can create and manage your face collections.
Step 3. Enter you application with double click on the name of the application. Here you will have two possibilities. The first one is to add new users to your application and manage permissions ( Global Owner and Administrator roles already have access to any application without invite, user role doesn't.) The second one is to create face collections.
Step 4. After creating new collection, it appears at the Face Collections List created within the application with an appropriate name and API key. The user has the possibility to add new Face or to test the existing one (three dots on right side and click "test" link). This option will lead the user to Test Face Collection page, where is the drag&drop to upload image with face to recognize. We recommend an image size no higher than 5MB, as it could slow down the request process. Supported image formats are JPEG/PNG/JPG/ICO/BMP/GIF/TIF/TIFF format.
Step 5. Upload your photo and let Face Recognition system compare faces. When you have face contour detection enabled (green borders around the face). These points represent the shape of the feature. API requests within the solution use RESTful API, and backend data collection. Read more about API With Face Recognition system APIs you can add Face Recognition capabilities using simple API Calls.
The following result Json illustrates how these points map to a face, where
- subject -person identificator
- similarity - gives the confidence that this is the found subject
- probability - gives the confidence that this is a face
- x_min, x_max, y_min, y_max are coordinates of the face in the image
"result": [
{
"box": {
"probability": 0.99583,
"x_max": 551,
"y_max": 364,
"x_min": 319,
"y_min": 55
},
"faces": [
{
"similarity": 0.99593,
"face_name": "lisan"
}
]
}
]
The following JavaScript code example allows to add new face to Face Collection.
async function saveNewImageToFaceCollection() {
let name = encodeURIComponent('John');
let formData = new FormData();
let photo = document.getElementById("fileDropRef").files[0];
formData.append("photo", photo);
try {
let r = await fetch('https://localhost:8000/api/v1/faces/?subject=`${name}`', {method: "POST", body: formData});
} catch(e) {
console.log('Houston, we have a problem...:', e);
}
}
This function sends image to our server and shows result in text area:
function recognizeFace(input) {
async function getData() {
let response = await fetch('https://localhost:8000/api/v1/recognize')
let data = await response.json()
return data
};
let result = Promise.resolve(response)
result.then(data => {
document.getElementById("result-textarea-request").innerHTML = JSON.stringify(data);
});
}
Finding a face
Detecting one or more faces in an image. Multi-task Cascaded Convolutional Neural Networks (MTCNN) was used for face recognition.
Posing and projecting faces
Normalization of all found faces with rotate, scale and shear.
Calculate embedding from faces
Calculating embedding and classifying the face based on extracted features. We took CNN for face recognition and the last 3 fully connected layers were removed. As a result, - NN calculates embedding.
Use embedding for recognize/verify faces using embedding
Recognizing the person in the photo. We calculate Euclidean distance using Nd4j to determine the level of matching faces.
- MTCNN (Multi-task Cascaded Convolutional Networks)
- FaceNet
- Euclidean distance
-
FaceNet: A Unified Embedding for Face Recognition and Clustering Florian Schroff, Dmitry Kalenichenko, James Philbin (Submitted on 17 Jun 2015)
-
Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks Kaipeng Zhang, Zhanpeng Zhang, Zhifeng Li, Yu Qiao (Submitted on 11 Apr 2016)
-
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi (Submitted on 23 Aug 2016)
- PostgreSQL
- Java 11
- Spring Boot
- Java 11
- Spring Boot
- Nd4j
- Python
- FaceNet
- InsightFace
- TensorFlow
- SciPy
- NumPy
- OpenCV (for images resizing)
By using the created API key, the user can add an image as an example of the face, retrieve a list of saved images, recognize a face from the uploaded image the Face Collection, and delete all examples of the face by the name.
Creates an example of the face by saving images. To train the system, you can add as many images as you want.
curl -X POST "https://localhost:8000/api/v1/faces?subject=<subject>&det_prob_threshold=<det_prob_threshold>" \
-H "Content-Type: multipart/form-data" \
-H "x-api-key: <faces_collection_api_key>" \
-F file=@<local_file>
Element | Description | Type | Required | Notes |
---|---|---|---|---|
Content-Type | header | string | required | multipart/form-data |
x-api-key | header | string | required | api key of the Face Collection, created by the user |
subject | param | string | required | is the name you assign to the image you save |
det_prob_ threshold | param | string | optional | minimum required confidence that a recognized face is actually a face. Value is between 0.0 and 1.0. |
file | body | image | required | allowed image formats: jpeg, jpg, ico, png, bmp, gif, tif, tiff, webp. Max size is 5Mb |
Response body on success:
{
"image_id": "<UUID>",
"subject": "<subject>"
}
Element | Type | Description |
---|---|---|
image_id | UUID | UUID of uploaded image |
subject | string | of saved image |
Recognizes faces from the uploaded image.
curl -X POST "https://localhost:8000/api/v1/faces/recognize?limit=<limit>&prediction_count=<prediction_count>&det_prob_threshold=<det_prob_threshold>" \
-H "Content-Type: multipart/form-data" \
-H "x-api-key: <faces_collection_api_key>" \
-F file=<local_file>
Element | Description | Type | Required | Notes |
---|---|---|---|---|
Content-Type | header | string | required | multipart/form-data |
x-api-key | header | string | required | api key of the Face Collection, created by the user |
file | body | image | required | allowed image formats: jpeg, jpg, ico, png, bmp, gif, tif, tiff, webp. Max size is 5Mb |
limit | param | integer | optional | maximum number of faces with best similarity in result. Value of 0 represents no limit. Default value: 0 |
det_prob_ threshold | param | string | optional | minimum required confidence that a recognized face is actually a face. Value is between 0.0 and 1.0. |
prediction_count | param | integer | optional | maximum number of predictions per faces. Default value: 1 |
Response body on success:
{
"result": [
{
"box": {
"probability": <probability>,
"x_max": <integer>,
"y_max": <integer>,
"x_min": <integer>,
"y_min": <integer>
},
"faces": [
{
"similarity": <similarity1>,
"subject": <subject1>
},
...
]
}
]
}
Element | Type | Description |
---|---|---|
box | object | list of parameters of the bounding box for this face |
probability | float | probability that a found face is actually a face |
x_max, y_max, x_min, y_min | integer | coordinates of the frame containing the face |
faces | list | list of similar faces with size of <prediction_count> order by similarity |
similarity | float | similarity that on that image predicted person |
subject | string | name of the subject in Face Collection |
Retrieves a list of images saved in a Face Collection
curl -X GET "https://localhost:8000/api/v1/faces" \
-H "x-api-key: <faces_collection_api_key>" \
Element | Description | Type | Required | Notes |
---|---|---|---|---|
x-api-key | header | string | required | api key of the Face Collection, created by the user |
Response body on success:
{
"faces": [
{
"image_id": <image_id>,
"subject": <subject>
},
...
]
}
Element | Type | Description |
---|---|---|
image_id | UUID | UUID of the face |
subject | string | of the person, whose picture was saved for this api key |
Deletes all image examples of the .
curl -X DELETE "https://localhost:8000/api/v1/faces?subject=<subject>" \
-H "x-api-key: <faces_collection_api_key>"
Element | Description | Type | Required | Notes |
---|---|---|---|---|
x-api-key | header | string | required | api key of the Face Collection, created by the user |
subject | param | string | optional | is the name you assign to the image you save. Caution! If this parameter is absent, all faces in Face Collection will be removed |
Response body on success:
[
{
"image_id": <image_id>,
"subject": <subject>
},
...
]
Element | Type | Description |
---|---|---|
image_id | UUID | UUID of the removed face |
subject | string | of the person, whose picture was saved for this api key |
Deletes an image by ID.
curl -X DELETE "https://localhost:8000/api/v1/faces/<image_id>" \
-H "x-api-key: <faces_collection_api_key>"
Element | Description | Type | Required | Notes |
---|---|---|---|---|
x-api-key | header | string | required | api key of the Face Collection, created by the user |
image_id | variable | UUID | required | UUID of the removing face |
Response body on success:
{
"image_id": <image_id>,
"subject": <subject>
}
Element | Type | Description |
---|---|---|
image_id | UUID | UUID of the removed face |
subject | string | of the person, whose picture was saved for this api key |
Compares faces from the uploaded image with face in saved image id.
curl -X POST "https://localhost:8000/api/v1/faces/<image_id>/verify?limit=<limit>&det_prob_threshold=<det_prob_threshold>" \
-H "Content-Type: multipart/form-data" \
-H "x-api-key: <faces_collection_api_key>" \
-F file=<local_file>
Element | Description | Type | Required | Notes |
---|---|---|---|---|
Content-Type | header | string | required | multipart/form-data |
x-api-key | header | string | required | api key of the Face Collection, created by the user |
image_id | variable | UUID | required | UUID of the verifying face |
file | body | image | required | allowed image formats: jpeg, jpg, ico, png, bmp, gif, tif, tiff, webp. Max size is 5Mb |
limit | param | integer | optional | maximum number of faces with best similarity in result. Value of 0 represents no limit. Default value: 0 |
det_prob_ threshold | param | string | optional | minimum required confidence that a recognized face is actually a face. Value is between 0.0 and 1.0. |
Response body on success:
{
"result": [
{
"box": {
"probability": <probability>,
"x_max": <integer>,
"y_max": <integer>,
"x_min": <integer>,
"y_min": <integer>
},
"similarity": <similarity1>
},
...
]
}
Element | Type | Description |
---|---|---|
box | object | list of parameters of the bounding box for this face |
probability | float | probability that a found face is actually a face |
x_max, y_max, x_min, y_min | integer | coordinates of the frame containing the face |
similarity | float | similarity that on that image predicted person |
subject | string | name of the subject in Face Collection |
Contributions are welcome and greatly appreciated. After creating your first contributing Pull Request you will receive a request to sign our Contributor License Agreement by commenting your PR with a special message.
For java just import dev/team_codestyle.xml file in your IntelliJ IDEA
Report bugs at https://github.com/exadel-inc/CompreFace/issues.
If you are reporting a bug, please include:
- Your operating system name and version.
- Any details about your local setup that might be helpful in troubleshooting.
- Detailed steps to reproduce the bug.
The best way to send feedback is to file an issue at https://github.com/exadel-inc/CompreFace/issues.
If you are proposing a feature, please:
- Explain in detail how it should work.
- Keep the scope as narrow as possible, to make it easier to implement.
CompreFace is Open Source software released under the Apache 2.0 license.