README.md 11.2 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

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

A
Adam Geitgey 已提交
66 67 68 69 70 71
You can even use this library with other Python libraries to do real-time face recognition:

![](https://cloud.githubusercontent.com/assets/896692/24430398/36f0e3f0-13cb-11e7-8258-4d0c9ce1e419.gif)

See [this example](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py) for the code.

A
Adam Geitgey 已提交
72 73
## Installation

74
Python 3 / Python 2 are fully supported. Only macOS and
A
Adam Geitgey 已提交
75 76 77
Linux are tested. I have no idea if this will work on Windows. A 
[pre-configured VM](https://medium.com/@ageitgey/try-deep-learning-in-python-now-with-a-fully-pre-configured-vm-1d97d4c3e9b)
is also available.
A
Adam Geitgey 已提交
78

79
Install this module from pypi using `pip3` (or `pip2` for Python 2):
A
Adam Geitgey 已提交
80 81 82 83 84

```bash
pip3 install face_recognition
```

85
IMPORTANT NOTE: It's very likely that you will run into problems when pip tries to compile
A
Adam Geitgey 已提交
86
the `dlib` dependency. If that happens, check out this guide to installing
87
dlib from source (instead of from pip) to fix the error:
A
Adam Geitgey 已提交
88 89 90 91

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

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

A
Adam Geitgey 已提交
94 95 96
If you are still having trouble installing this, you can also try out this
[pre-configured VM](https://medium.com/@ageitgey/try-deep-learning-in-python-now-with-a-fully-pre-configured-vm-1d97d4c3e9b).

A
Adam Geitgey 已提交
97 98 99
## Usage

#### Command-Line Interface
A
tweaks  
Adam Geitgey 已提交
100 101 102 103 104 105 106 107 108

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 已提交
109
![known](https://cloud.githubusercontent.com/assets/896692/23582466/8324810e-00df-11e7-82cf-41515eba704d.png)
A
tweaks  
Adam Geitgey 已提交
110 111 112

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

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

A
Adam Geitgey 已提交
115
Then in you simply run the command `face_recognition`, passing in
A
tweaks  
Adam Geitgey 已提交
116
the folder of known people and the folder (or single image) with unknown
A
Adam Geitgey 已提交
117
people and it tells you who is in each image:
A
tweaks  
Adam Geitgey 已提交
118 119 120 121

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

A
Adam Geitgey 已提交
122 123 124 125 126 127 128 129 130
/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 已提交
131

A
Adam Geitgey 已提交
132 133
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 已提交
134

A
Adam Geitgey 已提交
135 136 137 138 139
```bash
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
A
tweaks  
Adam Geitgey 已提交
140 141
```

A
Adam Geitgey 已提交
142

A
Adam Geitgey 已提交
143
#### Python Module
A
Adam Geitgey 已提交
144 145 146 147

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 已提交
148
API Docs: [https://face-recognition.readthedocs.io](https://face-recognition.readthedocs.io/en/latest/face_recognition.html).
A
Adam Geitgey 已提交
149

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

A
Adam Geitgey 已提交
152 153 154 155 156 157 158 159 160 161 162 163
```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 已提交
164 165
##### Automatically locate the facial features of a person in an image

A
Adam Geitgey 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178
```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 已提交
179 180
##### Recognize faces in images and identify who they are

A
Adam Geitgey 已提交
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
```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 已提交
205
## Python Code Examples
A
tweaks  
Adam Geitgey 已提交
206 207

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

A
Adam Geitgey 已提交
209
* [Find faces in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py)
A
tweaks  
Adam Geitgey 已提交
210 211 212
* [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)
213 214
* [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 已提交
215

A
Adam Geitgey 已提交
216 217 218 219 220
## 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 已提交
221 222
## Caveats

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

226 227 228 229 230 231 232 233 234
## 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 已提交
235 236 237 238 239 240 241
## 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).

242
##### Issue: `RuntimeError: Unsupported image type, must be 8bit gray or RGB image.` when running the webcam examples.
A
Adam Geitgey 已提交
243 244 245 246 247 248 249 250

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 已提交
251
## Thanks
A
Adam Geitgey 已提交
252

A
tweaks  
Adam Geitgey 已提交
253 254
* 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 已提交
255
  used in this library. For more information on the ResNet that powers the face encodings, check out
A
Adam Geitgey 已提交
256
  his [blog post](http://blog.dlib.net/2017/02/high-quality-face-recognition-with-deep.html).
A
Adam Geitgey 已提交
257
* Thanks to everyone who works on all the awesome Python data science libraries like numpy, scipy, scikit-image,
A
tweaks  
Adam Geitgey 已提交
258
  pillow, etc, etc that makes this kind of stuff so easy and fun in Python.
A
Adam Geitgey 已提交
259
* Thanks to [Cookiecutter](https://github.com/audreyr/cookiecutter) and the
A
tweaks  
Adam Geitgey 已提交
260 261
  [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template
  for making Python project packaging way more tolerable.