README.md 10.5 KB
Newer Older
A
tweaks  
Adam Geitgey 已提交
1 2
# Face Recognition

A
Adam Geitgey 已提交
3 4
Recognize and manipulate faces from Python or from the command line with
the world's simplest face recognition library.
A
tweaks  
Adam Geitgey 已提交
5

A
Adam Geitgey 已提交
6 7 8 9 10 11
Built using [dlib](http://dlib.net/)'s state-of-the-art face recognition
built with deep learning. The model has an accuracy of 99.38% on the
[Labeled Faces in the Wild](http://vis-www.cs.umass.edu/lfw/) benchmark.

This also provides a simple `face_recognition` command line tool that lets
you do face recognition on a folder of images from the command line!
A
Adam Geitgey 已提交
12

A
Adam Geitgey 已提交
13 14 15 16

[![PyPI](https://img.shields.io/pypi/v/face_recognition.svg)](https://pypi.python.org/pypi/face_recognition)
[![Build Status](https://travis-ci.org/ageitgey/face_recognition.svg?branch=master)](https://travis-ci.org/ageitgey/face_recognition)
[![Documentation Status](https://readthedocs.org/projects/face-recognition/badge/?version=latest)](http://face-recognition.readthedocs.io/en/latest/?badge=latest)
A
Adam Geitgey 已提交
17

A
tweaks  
Adam Geitgey 已提交
18 19
## Features

A
Adam Geitgey 已提交
20 21
#### Find faces in pictures

A
Adam Geitgey 已提交
22
Find all the faces that appear in a picture:
A
Adam Geitgey 已提交
23

A
Adam Geitgey 已提交
24 25 26 27 28 29 30
![](https://cloud.githubusercontent.com/assets/896692/23625227/42c65360-025d-11e7-94ea-b12f28cb34b4.png)

```python
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
```
A
Adam Geitgey 已提交
31 32 33 34 35

#### Find and manipulate facial features in pictures

Get the locations and outlines of each person's eyes, nose, mouth and chin.

A
Adam Geitgey 已提交
36 37 38 39 40 41 42
![](https://cloud.githubusercontent.com/assets/896692/23625282/7f2d79dc-025d-11e7-8728-d8924596f8fa.png)

```python
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
```
A
Adam Geitgey 已提交
43 44 45 46

Finding facial features is super useful for lots of important stuff. But you can also use for really stupid stuff
like applying [digital make-up](https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py) (think 'Meitu'):

A
Adam Geitgey 已提交
47
![](https://cloud.githubusercontent.com/assets/896692/23625283/80638760-025d-11e7-80a2-1d2779f7ccab.png)
A
Adam Geitgey 已提交
48 49 50 51 52

#### Identify faces in pictures

Recognize who appears in each photo.

A
Adam Geitgey 已提交
53 54 55 56 57 58 59 60
![](https://cloud.githubusercontent.com/assets/896692/23625229/45e049b6-025d-11e7-89cc-8a71cf89e713.png)

```python
import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")

biden_encoding = face_recognition.face_encodings(known_image)[0]
A
Adam Geitgey 已提交
61
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
A
Adam Geitgey 已提交
62 63 64 65 66 67

results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
```

## Installation

68
Python 3 / Python 2 are fully supported. Only macOS and
A
Adam Geitgey 已提交
69 70
Linux are tested. I have no idea if this will work on Windows.

71
Install this module from pypi using `pip3` (or `pip2` for Python 2):
A
Adam Geitgey 已提交
72 73 74 75 76

```bash
pip3 install face_recognition
```

77
IMPORTANT NOTE: It's very likely that you will run into problems when pip tries to compile
A
Adam Geitgey 已提交
78
the `dlib` dependency. If that happens, check out this guide to installing
79
dlib from source (instead of from pip) to fix the error:
A
Adam Geitgey 已提交
80 81 82 83

[How to install dlib from source](https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf)

After manually installing `dlib`, try running `pip3 install face_recognition`
84
again to complete your installation.
A
tweaks  
Adam Geitgey 已提交
85

A
Adam Geitgey 已提交
86 87 88
## Usage

#### Command-Line Interface
A
tweaks  
Adam Geitgey 已提交
89 90 91 92 93 94 95 96 97

When you install `face_recognition`, you get a simple command-line program
called `face_recognition` that you can use to recognize faces in a
photograph or folder full for photographs.

First, you need to provide a folder with one picture of each person you
already know. There should be one image file for each person with the
files named according to who is in the picture:

A
Adam Geitgey 已提交
98
![known](https://cloud.githubusercontent.com/assets/896692/23582466/8324810e-00df-11e7-82cf-41515eba704d.png)
A
tweaks  
Adam Geitgey 已提交
99 100 101

Next, you need a second folder with the files you want to identify:

A
Adam Geitgey 已提交
102
![unknown](https://cloud.githubusercontent.com/assets/896692/23582465/81f422f8-00df-11e7-8b0d-75364f641f58.png)
A
tweaks  
Adam Geitgey 已提交
103

A
Adam Geitgey 已提交
104
Then in you simply run the command `face_recognition`, passing in
A
tweaks  
Adam Geitgey 已提交
105
the folder of known people and the folder (or single image) with unknown
A
Adam Geitgey 已提交
106
people and it tells you who is in each image:
A
tweaks  
Adam Geitgey 已提交
107 108 109 110

```bash
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

A
Adam Geitgey 已提交
111 112 113 114 115 116 117 118 119
/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
```

There's one line in the output for each face. The data is comma-separated
with the filename and the name of the person found.

An `unknown_person` is a face in the image that didn't match anyone in
your folder of known people.
A
tweaks  
Adam Geitgey 已提交
120

A
Adam Geitgey 已提交
121 122
If you simply want to know the names of the people in each photograph but don't
care about file names, you could do this:
A
tweaks  
Adam Geitgey 已提交
123

A
Adam Geitgey 已提交
124 125 126 127 128
```bash
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
A
tweaks  
Adam Geitgey 已提交
129 130
```

A
Adam Geitgey 已提交
131

A
Adam Geitgey 已提交
132
#### Python Module
A
Adam Geitgey 已提交
133 134 135 136

You can import the `face_recognition` module and then easily manipulate
faces with just a couple of lines of code. It's super easy!

A
Adam Geitgey 已提交
137
API Docs: [https://face-recognition.readthedocs.io](https://face-recognition.readthedocs.io/en/latest/face_recognition.html).
A
Adam Geitgey 已提交
138

A
tweaks  
Adam Geitgey 已提交
139 140
##### Automatically find all the faces in an image

A
Adam Geitgey 已提交
141 142 143 144 145 146 147 148 149 150 151 152
```python
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)

# face_locations is now an array listing the co-ordinates of each face!
```

See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py)
 to try it out.

A
tweaks  
Adam Geitgey 已提交
153 154
##### Automatically locate the facial features of a person in an image

A
Adam Geitgey 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167
```python
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.
```

See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py)
 to try it out.

A
tweaks  
Adam Geitgey 已提交
168 169
##### Recognize faces in images and identify who they are

A
Adam Geitgey 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
```python
import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`!

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")
```

See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py)
 to try it out.


A
Adam Geitgey 已提交
195
## Python Code Examples
A
tweaks  
Adam Geitgey 已提交
196 197

All the examples are available [here](https://github.com/ageitgey/face_recognition/tree/master/examples).
A
Adam Geitgey 已提交
198

A
Adam Geitgey 已提交
199
* [Find faces in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py)
A
tweaks  
Adam Geitgey 已提交
200 201 202
* [Identify specific facial features in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py)
* [Apply (horribly ugly) digital make-up](https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py)
* [Find and recognize unknown faces in a photograph based on photographs of known people](https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py)
203 204
* [Recognize faces in live video using your webcam - Simple / Slower Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam.py)
* [Recognize faces in live video using your webcam - Faster Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py)
A
Adam Geitgey 已提交
205

A
Adam Geitgey 已提交
206 207 208 209 210
## How Face Recognition Works

If you want to learn how face location and recognition work instead of
depending on a black box library, [read my article](https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78).

A
Adam Geitgey 已提交
211 212
## Caveats

A
Adam Geitgey 已提交
213
* The face recognition model is trained on adults and does not work very well on children. It tends to mix
A
Adam Geitgey 已提交
214 215
  up children quite easy using the default comparison threshold of 0.6.

216 217 218 219 220 221 222 223 224
## Deployment to Cloud Hosts (Heroku, AWS, etc)

Since `face_recognition` depends on `dlib` which is written in C++, it can be tricky to deploy an app
using it to a cloud hosting provider like Heroku or AWS.

To make things easier, there's an example Dockerfile in this repo that shows how to run an app built with
`face_recognition` in a [Docker](https://www.docker.com/) container. With that, you should be able to deploy
to any service that supports Docker images.

A
Adam Geitgey 已提交
225 226 227 228 229 230 231
## Common Issues

##### Issue: `Illegal instruction (core dumped)` when using face_recognition or running examples.

Solution: `dlib` is compiled with SSE4 or AVX support, but your CPU is too old and doesn't support that.
You'll need to recompile `dlib` after [making the code change outlined here](https://github.com/ageitgey/face_recognition/issues/11#issuecomment-287398611).

232
##### Issue: `RuntimeError: Unsupported image type, must be 8bit gray or RGB image.` when running the webcam examples.
A
Adam Geitgey 已提交
233 234 235 236 237 238 239 240

Solution: Your webcam probably isn't set up correctly with OpenCV. [Look here for more](https://github.com/ageitgey/face_recognition/issues/21#issuecomment-287779524).

##### Issue: `MemoryError` when running `pip2 install face_recognition`

Solution: The face_recognition_models file is too big for your available pip cache memory. Instead,
try `pip2 --no-cache-dir install face_recognition` to avoid the issue.

A
tweaks  
Adam Geitgey 已提交
241
## Thanks
A
Adam Geitgey 已提交
242

A
tweaks  
Adam Geitgey 已提交
243 244
* Many, many thanks to [Davis King](https://github.com/davisking) ([@nulhom](https://twitter.com/nulhom))
  for creating dlib and for providing the trained facial feature detection and face encoding models
A
Adam Geitgey 已提交
245
  used in this library. For more information on the ResNet that powers the face encodings, check out
A
Adam Geitgey 已提交
246
  his [blog post](http://blog.dlib.net/2017/02/high-quality-face-recognition-with-deep.html).
A
Adam Geitgey 已提交
247
* Thanks to everyone who works on all the awesome Python data science libraries like numpy, scipy, scikit-image,
A
tweaks  
Adam Geitgey 已提交
248
  pillow, etc, etc that makes this kind of stuff so easy and fun in Python.
A
Adam Geitgey 已提交
249
* Thanks to [Cookiecutter](https://github.com/audreyr/cookiecutter) and the
A
tweaks  
Adam Geitgey 已提交
250 251
  [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template
  for making Python project packaging way more tolerable.