|
| 1 | +# This is a _very simple_ example of a web service that recognizes faces in uploaded images. |
| 2 | +# Upload an image file and it will check if the image contains a picture of Barack Obama. |
| 3 | +# The result is returned as json. For example: |
| 4 | +# |
| 5 | +# $ curl -F "file=@obama2.jpg" http://127.0.0.1:5001 |
| 6 | +# |
| 7 | +# Returns: |
| 8 | +# |
| 9 | +# { |
| 10 | +# "face_found_in_image": true, |
| 11 | +# "is_picture_of_obama": true |
| 12 | +# } |
| 13 | +# |
| 14 | +# This example is based on the Flask file upload example: http://flask.pocoo.org/docs/0.12/patterns/fileuploads/ |
| 15 | + |
| 16 | +# NOTE: This example requires flask to be installed! You can install it with pip: |
| 17 | +# $ pip3 install flask |
| 18 | + |
| 19 | +import face_recognition |
| 20 | +from flask import Flask, jsonify, request, redirect |
| 21 | + |
| 22 | +# You can change this to any folder on your system |
| 23 | +ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} |
| 24 | + |
| 25 | +app = Flask(__name__) |
| 26 | + |
| 27 | + |
| 28 | +def allowed_file(filename): |
| 29 | + return '.' in filename and \ |
| 30 | + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS |
| 31 | + |
| 32 | + |
| 33 | +@app.route('/', methods=['GET', 'POST']) |
| 34 | +def upload_image(): |
| 35 | + # Check if a valid image file was uploaded |
| 36 | + if request.method == 'POST': |
| 37 | + if 'file' not in request.files: |
| 38 | + return redirect(request.url) |
| 39 | + |
| 40 | + file = request.files['file'] |
| 41 | + |
| 42 | + if file.filename == '': |
| 43 | + return redirect(request.url) |
| 44 | + |
| 45 | + if file and allowed_file(file.filename): |
| 46 | + # The image file seems valid! Detect faces and return the result. |
| 47 | + return detect_faces_in_image(file) |
| 48 | + |
| 49 | + # If no valid image file was uploaded, show the file upload form: |
| 50 | + return ''' |
| 51 | + <!doctype html> |
| 52 | + <title>Is this a picture of Obama?</title> |
| 53 | + <h1>Upload a picture and see if it's a picture of Obama!</h1> |
| 54 | + <form method="POST" enctype="multipart/form-data"> |
| 55 | + <input type="file" name="file"> |
| 56 | + <input type="submit" value="Upload"> |
| 57 | + </form> |
| 58 | + ''' |
| 59 | + |
| 60 | + |
| 61 | +def detect_faces_in_image(file_stream): |
| 62 | + # Pre-calculated face encoding of Obama generated with face_recognition.face_encodings(img) |
| 63 | + known_face_encoding = [-0.09634063, 0.12095481, -0.00436332, -0.07643753, 0.0080383, |
| 64 | + 0.01902981, -0.07184699, -0.09383309, 0.18518871, -0.09588896, |
| 65 | + 0.23951106, 0.0986533 , -0.22114635, -0.1363683 , 0.04405268, |
| 66 | + 0.11574756, -0.19899382, -0.09597053, -0.11969153, -0.12277931, |
| 67 | + 0.03416885, -0.00267565, 0.09203379, 0.04713435, -0.12731361, |
| 68 | + -0.35371891, -0.0503444 , -0.17841317, -0.00310897, -0.09844551, |
| 69 | + -0.06910533, -0.00503746, -0.18466514, -0.09851682, 0.02903969, |
| 70 | + -0.02174894, 0.02261871, 0.0032102 , 0.20312519, 0.02999607, |
| 71 | + -0.11646006, 0.09432904, 0.02774341, 0.22102901, 0.26725179, |
| 72 | + 0.06896867, -0.00490024, -0.09441824, 0.11115381, -0.22592428, |
| 73 | + 0.06230862, 0.16559327, 0.06232892, 0.03458837, 0.09459756, |
| 74 | + -0.18777156, 0.00654241, 0.08582542, -0.13578284, 0.0150229 , |
| 75 | + 0.00670836, -0.08195844, -0.04346499, 0.03347827, 0.20310158, |
| 76 | + 0.09987706, -0.12370517, -0.06683611, 0.12704916, -0.02160804, |
| 77 | + 0.00984683, 0.00766284, -0.18980607, -0.19641446, -0.22800779, |
| 78 | + 0.09010898, 0.39178532, 0.18818057, -0.20875394, 0.03097027, |
| 79 | + -0.21300618, 0.02532415, 0.07938635, 0.01000703, -0.07719778, |
| 80 | + -0.12651891, -0.04318593, 0.06219772, 0.09163868, 0.05039065, |
| 81 | + -0.04922386, 0.21839413, -0.02394437, 0.06173781, 0.0292527 , |
| 82 | + 0.06160797, -0.15553983, -0.02440624, -0.17509389, -0.0630486 , |
| 83 | + 0.01428208, -0.03637431, 0.03971229, 0.13983178, -0.23006812, |
| 84 | + 0.04999552, 0.0108454 , -0.03970895, 0.02501768, 0.08157793, |
| 85 | + -0.03224047, -0.04502571, 0.0556995 , -0.24374914, 0.25514284, |
| 86 | + 0.24795187, 0.04060191, 0.17597422, 0.07966681, 0.01920104, |
| 87 | + -0.01194376, -0.02300822, -0.17204897, -0.0596558 , 0.05307484, |
| 88 | + 0.07417042, 0.07126575, 0.00209804] |
| 89 | + |
| 90 | + # Load the uploaded image file |
| 91 | + img = face_recognition.load_image_file(file_stream) |
| 92 | + # Get face encodings for any faces in the uploaded image |
| 93 | + unknown_face_encodings = face_recognition.face_encodings(img) |
| 94 | + |
| 95 | + face_found = False |
| 96 | + is_obama = False |
| 97 | + |
| 98 | + if len(unknown_face_encodings) > 0: |
| 99 | + face_found = True |
| 100 | + # See if the first face in the uploaded image matches the known face of Obama |
| 101 | + match_results = face_recognition.compare_faces([known_face_encoding], unknown_face_encodings[0]) |
| 102 | + if match_results[0]: |
| 103 | + is_obama = True |
| 104 | + |
| 105 | + # Return the result as json |
| 106 | + result = { |
| 107 | + "face_found_in_image": face_found, |
| 108 | + "is_picture_of_obama": is_obama |
| 109 | + } |
| 110 | + return jsonify(result) |
| 111 | + |
| 112 | +if __name__ == "__main__": |
| 113 | + app.run(host='0.0.0.0', port=5001, debug=True) |
0 commit comments