node-facenet is a TensorFlow backed FaceNet implementation for Node.js.
FaceNet is a deep convolutional network designed by Google, trained to solve face verification, recognition and clustering problem with efficiently at scale.
- directly learns a mapping from face images to a compact Euclidean space where distances directly correspond to a measure of face similarity.
- optimize the embedding face recognition performance using only 128-bytes per face.
- achieves accuracy of 99.63% on Labeled Faces in the Wild (LFW) dataset, and 95.12% on YouTube Faces DB.
The follow examples will give you some intuitions for using the code.
- visualize example will calculate the similarity between faces and draw them on the photo.
- demo exmaple will show you how to do
align
for face alignment andembedding
to get face feature vector.
- Face is in the green rectangle.
- Similarity(distance) between faces showed as a number in the middle of the line.
- To identify if two faces belong to the same person, we could use an experiential threshold of distance: 0.75.
$ git clone git@github.com:zixia/node-facenet.git
$ cd facenet
$ npm install
$ npm run example:visualize
01:15:43 INFO CLI Visualized image saved to: facenet-visulized.jpg
TL;DR: Talk is cheap, show me the code!
import { Facenet } from 'facenet'
const facenet = new Facenet()
// Do Face Alignment, return faces
const imageFile = `${__dirname}/../tests/fixtures/two-faces.jpg`
const faceList = await facenet.align(imageFile)
for (const face of faceList) {
console.log('bounding box:', face.boundingBox)
console.log('landmarks:', face.facialLandmark)
// Calculate Face Embedding, return feature vector
const embedding = await facenet.embedding(face)
console.log('embedding:', embedding)
}
Full source code can be found at here: https://github.com/zixia/node-facenet/blob/master/examples/demo.ts
Try it by run:
$ git clone git@github.com:zixia/node-facenet.git
$ cd facenet
$ npm install
$ npm run example:demo
image file: /home/zixia/git/facenet/examples/../tests/fixtures/two-faces.jpg
face file: 1-1.jpg
bounding box: {
p1: { x: 360, y: 95 },
p2: { x: 589, y: 324 }
}
landmarks: {
leftEye: { x: 441, y: 181 },
rightEye: { x: 515, y: 208 },
nose: { x: 459, y: 239 },
leftMouthCorner: { x: 417, y: 262 },
rightMouthCorner: { x: 482, y: 285 }
}
embedding: array([ 0.02453, 0.03973, 0.05397, ..., 0.10603, 0.15305,-0.07288])
face file: 1-2.jpg
bounding box: {
p1: { x: 142, y: 87 },
p2: { x: 395, y: 340 }
}
landmarks: {
leftEye: { x: 230, y: 186 },
rightEye: { x: 316, y: 197 },
nose: { x: 269, y: 257 },
leftMouthCorner: { x: 223, y: 273 },
rightMouthCorner: { x: 303, y: 281 }
}
embedding: array([ 0.03241, -0.0737, 0.0475, ..., 0.07235, 0.12581,-0.00817])
UNDER HEAVY DEVELOPMENT NOW
Roadmap: release facenet-manager on version 0.4
The above ascii recording is just for demo purpose. Will replace it with facenet-manager later.
$ npm install facenet
Supported:
- Linux
- Mac
- Windows
- Node.js >= 7 (8 is recommend)
- Tensorflow >= 1.2
- Python3 >=3.5 (3.6 is recommend)
Neural Network Model | Task | Ram |
---|---|---|
MTCNN | Facenet#align() | 100MB |
Facenet | Facenet#embedding() | 2GB |
If you are dealing with very large images(like 3000x3000 pixels), there will need additional 1GB of memory.
So I believe that Facenet will need at least 2GB memory, and >=4GB is recommended.
Neural Network alone is not enough. It's Neural Network married with pre-trained model, married with easy to use APIs, that yield us the result that makes our APP sing.
Facenet is designed for bring the state-of-art neural network with bleeding-edge technology to full stack developers.
import { Facenet } from 'facenet'
const facenet = new Facenet()
facenet.quit()
Do face alignment for the image, return a list of faces.
Get the embedding for a face.
Get the 128 dim embedding vector for this face.(After alignment)
import { Face } from 'facenet'
console.log('bounding box:', face.boundingBox)
console.log('landmarks:', face.facialLandmark)
console.log('embedding:', face.embedding)
FaceNet neural network model files, set to other version of model as you like.
Default is set to models/
directory inside project directory. The pre-trained models is come from 20170512-110547, 0.992, MS-Celeb-1M, Inception ResNet v1, which will be download & save automatically by postinstall
script.
$ pwd
/home/zixia/git/node-facenet
$ ls models/
20170512-110547.pb
model-20170512-110547.ckpt-250000.index
model-20170512-110547.ckpt-250000.data-00000-of-00001
model-20170512-110547.meta
$ git clone git@github.com:zixia/node-facenet.git
$ cd facenet
$ npm install
$ npm test
Draw a rectangle with five landmarks on all faces in the input_image, save it to output_image.
$ ./node_modules/.bin/ts-node bin/align.ts input_image output_image
Output the 128 dim embedding vector of the face image.
$ ./node_modules/.bin/ts-node bin/embedding.ts face_image
- Machine Learning is Fun! Part 4: Modern Face Recognition with Deep Learning
- Face recognition using Tensorflow
- Google: Our new system for recognizing faces is the best one ever
- A tensorflow implementation of "Deep Convolutional Generative Adversarial Networks
- What does Locality Sensitive Hashing Forests do? · maheshakya/my_first_project Wiki
- Average Face : OpenCV ( C++ / Python ) Tutorial
- Google Python Style Guide
- PyLint, PyChecker or PyFlakes?
- Useful Python Modules: Flake8
- PEP 8 - Style Guide for Python Code
- Python 3.6 venv — Creation of virtual environments
- Mypy syntax cheat sheet (Python 3)
- Python 3 Type Hints and Static Analysis
- typing — Support for type hints
- Stackoverflow: numpy-like package for node
- Read/manipulate/display images using NumJs
- Numjs - Like NumPy, in JavaScript
- ndarray - Modular multidimensional arrays for JavaScript
- NPM Module:
facenet
- Docker Image:
zixia/facenet
- Examples
- API Usage Demo
- Triple Distance Visulization Demo
- Performance Test(Align/Embedding/Batch)
- Validation Test(LFW Accuracy)
- Neural Network Models
- Facenet
- Mtcnn
- Chinese Whispter
- Batch Support
-
Python3async
&await
- Divide Different Neural Network to seprate class files(e.g. Facenet/Mtcnn/ChineseWhisper)
- TensorFlow Sereving
- OpenAPI Specification(Swagger)
This repository is heavily inspired by the following implementations:
- FaceNet by David Sandberg @davidsandberg
- OpenFace by CMU Satya Lab @cmusatyalab
- Face alignment using MTCNN: Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
- Face embedding using FaceNet: FaceNet: A Unified Embedding for Face Recognition and Clustering
- TensorFlow implementation of the face recognizer: Face recognition using Tensorflow
[![Powered by FaceNet](https://img.shields.io/badge/Powered%20By-FaceNet-green.svg)](https://github.com/zixia/node-facenet)
- Added three cache classes: AlignmentCache & EmbeddingCache & FaceCache.
- Added cache manager utilities: embedding-cache-manager & alignment-cache-manager & face-cache-manager
- Added Dataset manager utility: lfw-manager (should be dataset-manager in future)
Facenet#align()
now accept a filename string as parameter.- BREAKING CHANGE:
FaceImage
class had been removed. - BREAKING CHANGE:
Face
class refactoring.
npm run demo
to visuliaze the face alignment and distance(embedding) in a three people photo.- Facenet.align() to do face alignment
- Facenet.embedding() to calculate the 128 dim feature vector of face
- Initial workable version
facenet-manager
display not right under Windows
See: Running Terminal Dashboards on Windows
Huan LI <zixia@zixia.net> (http://linkedin.com/in/zixia)
- Code & Docs © 2017 Huan LI <zixia@zixia.net>
- Code released under the Apache-2.0 License
- Docs released under Creative Commons