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

A
Adam Geitgey 已提交
74 75 76
Requirements:
* Python 3+ or Python 2.7
* macOS or Linux (Windows untested)
A
Adam Geitgey 已提交
77
* [Also can run on a Raspberry Pi 2+ (follow these specific instructions)](https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65)
A
Adam Geitgey 已提交
78
* A [pre-configured VM image](https://medium.com/@ageitgey/try-deep-learning-in-python-now-with-a-fully-pre-configured-vm-1d97d4c3e9b) is also available.
A
Adam Geitgey 已提交
79

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

```bash
pip3 install face_recognition
```

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

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

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

A
Adam Geitgey 已提交
95 96 97
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 已提交
98 99 100
## Usage

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

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

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

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

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

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

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

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

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

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

143 144 145 146 147 148 149 150 151 152 153 154
Face recognition can also be done in parallel if you have a computer with
multiple CPU cores. For example if your system has 4 CPU cores, you can
process about 4 times as many images in the same amount of time by using
all your CPU cores in parallel.

If you are using Python 3.4 or newer, pass in a `--cpus <number_of_cpu_cores_to_use>` parameter:

```bash
$ face_recognition -cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/
```

You can also pass in `--cpus -1` to use all CPU cores in your system.
A
Adam Geitgey 已提交
155

A
Adam Geitgey 已提交
156
#### Python Module
A
Adam Geitgey 已提交
157 158 159 160

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

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

A
Adam Geitgey 已提交
165 166 167 168 169 170 171 172 173 174 175 176
```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 已提交
177 178
##### Automatically locate the facial features of a person in an image

A
Adam Geitgey 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191
```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 已提交
192 193
##### Recognize faces in images and identify who they are

A
Adam Geitgey 已提交
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
```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 已提交
218
## Python Code Examples
A
tweaks  
Adam Geitgey 已提交
219 220

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

A
Adam Geitgey 已提交
222
* [Find faces in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py)
A
tweaks  
Adam Geitgey 已提交
223 224 225
* [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)
226 227
* [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 已提交
228
* [Recognize faces on a Raspberry Pi w/ camera](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_on_raspberry_pi.py)
A
Adam Geitgey 已提交
229
* [Run a web service to recognize faces via HTTP (Requires Flask to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/web_service_example.py)
A
Adam Geitgey 已提交
230
* [Compare faces by numeric face distance instead of only True/False matches](https://github.com/ageitgey/face_recognition/blob/master/examples/face_distance.py)
A
Adam Geitgey 已提交
231

A
Adam Geitgey 已提交
232 233 234 235 236
## 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 已提交
237 238
## Caveats

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

242 243 244 245 246 247 248 249 250
## 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 已提交
251 252
## Common Issues

A
Adam Geitgey 已提交
253
Issue: `Illegal instruction (core dumped)` when using face_recognition or running examples.
A
Adam Geitgey 已提交
254 255 256 257

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).

A
Adam Geitgey 已提交
258
Issue: `RuntimeError: Unsupported image type, must be 8bit gray or RGB image.` when running the webcam examples.
A
Adam Geitgey 已提交
259 260 261

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).

A
Adam Geitgey 已提交
262
Issue: `MemoryError` when running `pip2 install face_recognition`
A
Adam Geitgey 已提交
263 264 265 266

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
Adam Geitgey 已提交
267 268 269 270
Issue: `AttributeError: 'module' object has no attribute 'face_recognition_model_v1'`

Solution: The version of `dlib` you have installed is too old. You need version 19.4 or newer. Upgrade `dlib`.

A
Adam Geitgey 已提交
271 272 273 274
Issue: `TypeError: imread() got an unexpected keyword argument 'mode'`

Solution: The version of `scipy` you have installed is too old. You need version 0.17 or newer. Upgrade `scipy`.

A
tweaks  
Adam Geitgey 已提交
275
## Thanks
A
Adam Geitgey 已提交
276

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