| 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 | |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 7 | |
| 8 | def fetch_file_for_image(gql_endpoint, object_storage_endpoint, id): |
| 9 | data = {"query": "{ getImage(id: \"" + id + "\") { objectPath } }"} |
| giolekva | edbaf32 | 2020-05-05 18:17:37 +0400 | [diff] [blame^] | 10 | # encoded_data = urllib.parse.urlencode(data).encode('UTF-8') |
| 11 | req = urllib.request.Request(gql_endpoint, method="POST") |
| 12 | req.add_header('Content-Type', 'application/json') |
| 13 | resp = urllib.request.urlopen(req, json.dumps(data).encode('UTF-8')) |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 14 | object_path = json.loads(resp.read())["getImage"]["objectPath"] |
| 15 | local_path = urllib.request.urlretrieve( |
| 16 | object_storage_endpoint + "/" + object_path)[0] |
| 17 | return local_path |
| 18 | |
| 19 | |
| 20 | def format_img_segment(id, box): |
| 21 | return ("{{upperLeftX: {f[0]}, upperLeftY: {f[1]}, lowerRightX: {f[2]}, " + |
| 22 | "lowerRightY: {f[3]}, sourceImage: {{id: \"{id}\"}}}}").format( |
| 23 | f=box, |
| 24 | id=id) |
| 25 | |
| 26 | |
| 27 | def upload_face_segments(gql_endpoint, id, faces): |
| 28 | segments = [format_img_segment(id, f) for f in faces] |
| 29 | data = {"query": "mutation {{ addImageSegment(input: [{segments}]) {{ imagesegment {{ id }} }} }}".format( |
| 30 | segments=", ".join(segments))} |
| giolekva | edbaf32 | 2020-05-05 18:17:37 +0400 | [diff] [blame^] | 31 | # encoded_data = urllib.parse.urlencode(data).encode('UTF-8') |
| 32 | req = urllib.request.Request(gql_endpoint, method="POST") |
| 33 | req.add_header('Content-Type', 'application/json') |
| 34 | resp = urllib.request.urlopen(req, json.dumps(data).encode('UTF-8')) |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 35 | print(resp.read()) |
| 36 | |
| 37 | |
| 38 | def main(): |
| giolekva | edbaf32 | 2020-05-05 18:17:37 +0400 | [diff] [blame^] | 39 | method = "haar" |
| 40 | if len(sys.argv) == 5 and sys.argv[4] == "mtcnn": |
| 41 | method = "mtcnn" |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 42 | f = fetch_file_for_image(sys.argv[1], sys.argv[2], sys.argv[3]) |
| giolekva | edbaf32 | 2020-05-05 18:17:37 +0400 | [diff] [blame^] | 43 | if method == "haar": |
| 44 | import haar |
| 45 | faces = haar.detect_faces(f) |
| 46 | upload_face_segments(sys.argv[1], sys.argv[3], faces) |
| 47 | else: |
| 48 | import mtcnn |
| 49 | faces = mtcnn.detect_faces(f) |
| 50 | upload_face_segments(sys.argv[1], sys.argv[3], faces) |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 51 | os.remove(f) |
| giolekva | fb52e0d | 2020-04-23 22:52:13 +0400 | [diff] [blame] | 52 | |
| 53 | |
| 54 | if __name__ == "__main__": |
| 55 | main() |