| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 1 | import sys |
| 2 | import json |
| 3 | import urllib.parse |
| 4 | import urllib.request |
| 5 | import os |
| 6 | |
| 7 | from facenet_pytorch import MTCNN, InceptionResnetV1 |
| 8 | from PIL import Image |
| 9 | |
| 10 | |
| 11 | def detect_faces(img_file): |
| 12 | mtcnn = MTCNN(keep_all=True) |
| 13 | ret = [] |
| 14 | with Image.open(img_file) as img: |
| 15 | for box in mtcnn.detect(img)[0]: |
| 16 | ret.append((box[0], box[1], box[2], box[3])) |
| 17 | return ret |
| 18 | |
| 19 | |
| 20 | def fetch_file_for_image(gql_endpoint, object_storage_endpoint, id): |
| 21 | data = {"query": "{ getImage(id: \"" + id + "\") { objectPath } }"} |
| 22 | encoded_data = urllib.parse.urlencode(data).encode('UTF-8') |
| 23 | req = urllib.request.Request(gql_endpoint, encoded_data, method="POST") |
| 24 | resp = urllib.request.urlopen(req) |
| 25 | object_path = json.loads(resp.read())["getImage"]["objectPath"] |
| 26 | local_path = urllib.request.urlretrieve( |
| 27 | object_storage_endpoint + "/" + object_path)[0] |
| 28 | return local_path |
| 29 | |
| 30 | |
| 31 | def format_img_segment(id, box): |
| 32 | return ("{{upperLeftX: {f[0]}, upperLeftY: {f[1]}, lowerRightX: {f[2]}, " + |
| 33 | "lowerRightY: {f[3]}, sourceImage: {{id: \"{id}\"}}}}").format( |
| 34 | f=box, |
| 35 | id=id) |
| 36 | |
| 37 | |
| 38 | def upload_face_segments(gql_endpoint, id, faces): |
| 39 | segments = [format_img_segment(id, f) for f in faces] |
| 40 | data = {"query": "mutation {{ addImageSegment(input: [{segments}]) {{ imagesegment {{ id }} }} }}".format( |
| 41 | segments=", ".join(segments))} |
| 42 | encoded_data = urllib.parse.urlencode(data).encode('UTF-8') |
| 43 | req = urllib.request.Request(gql_endpoint, encoded_data, method="POST") |
| 44 | resp = urllib.request.urlopen(req) |
| 45 | print(resp.read()) |
| 46 | |
| 47 | |
| 48 | def main(): |
| 49 | f = fetch_file_for_image(sys.argv[1], sys.argv[2], sys.argv[3]) |
| 50 | faces = detect_faces(f) |
| 51 | os.remove(f) |
| 52 | upload_face_segments(sys.argv[1], sys.argv[3], faces) |
| 53 | |
| 54 | |
| 55 | if __name__ == "__main__": |
| 56 | main() |