README.md 8.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 13 14 15

![](https://img.shields.io/pypi/v/face_recognition.svg)
![](https://travis-ci.org/ageitgey/face_recognition)

A
tweaks  
Adam Geitgey 已提交
16 17
## Features

A
Adam Geitgey 已提交
18 19
#### Find faces in pictures

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

A
Adam Geitgey 已提交
22 23 24 25 26 27 28
![](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 已提交
29 30 31 32 33

#### Find and manipulate facial features in pictures

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

A
Adam Geitgey 已提交
34 35 36 37 38 39 40
![](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 已提交
41 42 43 44

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 已提交
45
![](https://cloud.githubusercontent.com/assets/896692/23625283/80638760-025d-11e7-80a2-1d2779f7ccab.png)
A
Adam Geitgey 已提交
46 47 48 49 50

#### Identify faces in pictures

Recognize who appears in each photo.

A
Adam Geitgey 已提交
51 52 53 54 55 56 57 58
![](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 已提交
59
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
A
Adam Geitgey 已提交
60 61 62 63 64 65 66 67 68

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

## Installation

Python 3 is fully supported. Python 2 should also work. Only macOS and
Linux are tested. I have no idea if this will work on Windows.

A
Adam Geitgey 已提交
69
1. First, install the required machine learning models using `pip3` (or `pip2` for Python 2):
A
Adam Geitgey 已提交
70 71

```bash
A
Adam Geitgey 已提交
72
pip3 install git+https://github.com/ageitgey/face_recognition_models
A
Adam Geitgey 已提交
73 74
```

A
Adam Geitgey 已提交
75 76 77 78 79 80 81
2. Then you can install this module from pypi using `pip3` (or `pip2` for Python 2):

```bash
pip3 install face_recognition
```

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

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

After manually installing `dlib`, try running `pip3 install face_recognition`
again.
A
tweaks  
Adam Geitgey 已提交
89

A
Adam Geitgey 已提交
90 91 92
## Usage

#### Command-Line Interface
A
tweaks  
Adam Geitgey 已提交
93 94 95 96 97 98 99 100 101

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

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

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

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

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

A
Adam Geitgey 已提交
115 116 117 118 119 120 121 122 123
/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 已提交
124

A
Adam Geitgey 已提交
125 126
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 已提交
127

A
Adam Geitgey 已提交
128 129 130 131 132
```bash
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
A
tweaks  
Adam Geitgey 已提交
133 134
```

A
Adam Geitgey 已提交
135

A
Adam Geitgey 已提交
136
#### Python Module
A
Adam Geitgey 已提交
137 138 139 140

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 已提交
141 142
API Docs: [https://face-recognition.readthedocs.io](https://face-recognition.readthedocs.io).

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

A
Adam Geitgey 已提交
145 146 147 148 149 150 151 152 153 154 155 156
```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 已提交
157 158
##### Automatically locate the facial features of a person in an image

A
Adam Geitgey 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171
```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 已提交
172 173
##### Recognize faces in images and identify who they are

A
Adam Geitgey 已提交
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
```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 已提交
199
## Python Code Examples
A
tweaks  
Adam Geitgey 已提交
200 201

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

A
tweaks  
Adam Geitgey 已提交
203 204 205 206
* [Find faces in an photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py)
* [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)
A
Adam Geitgey 已提交
207

A
Adam Geitgey 已提交
208 209 210 211 212
## 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 已提交
213 214
## Caveats

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

A
tweaks  
Adam Geitgey 已提交
218
## Thanks
A
Adam Geitgey 已提交
219

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