matheus-erthal commited on
Commit
552f2cd
1 Parent(s): 343faa9

Commit inicial

Browse files
Files changed (5) hide show
  1. .gitattributes +35 -0
  2. README.md +12 -0
  3. app.py +65 -0
  4. requirements.txt +68 -0
  5. services/aws_service.py +29 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Facial Comparison
3
+ emoji: 🐨
4
+ colorFrom: indigo
5
+ colorTo: green
6
+ sdk: gradio
7
+ sdk_version: 3.44.4
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
11
+
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ from services.aws_service import AwsService
4
+ from dotenv import load_dotenv
5
+ import cv2
6
+ import face_recognition
7
+ import numpy as np
8
+
9
+ load_dotenv()
10
+
11
+ def find_face_encodings(image_path):
12
+ # reading image
13
+ image = cv2.imread(image_path)
14
+ # get face encodings from the image
15
+ face_enc = face_recognition.face_encodings(image)
16
+ # return face encodings
17
+ return face_enc[0]
18
+
19
+ def face_similarity(img1, img2):
20
+ image_1 = find_face_encodings(img1)
21
+ image_2 = find_face_encodings(img2)
22
+
23
+ # checking both images are same
24
+ is_same = face_recognition.compare_faces([image_1], image_2)[0]
25
+ accuracy = 0
26
+ if is_same:
27
+ # finding the distance level between images
28
+ distance = face_recognition.face_distance([image_1], image_2)
29
+ distance = round(distance[0] * 100)
30
+
31
+ # calcuating accuracy level between images
32
+ accuracy = 100 - round(distance)
33
+ return {"is_same": is_same, "accuracy": accuracy}
34
+
35
+ def convert_pil_to_open_cv(pil_image):
36
+ open_cv_image = np.array(pil_image)
37
+ open_cv_image = open_cv_image[:, :, ::-1].copy()
38
+ return open_cv_image
39
+
40
+ def check_image_similarity(main_image_folder, compare_image_folder):
41
+
42
+ main_image = AwsService.get_image_from_s3(os.environ.get('AWS_S3_BUCKET'), main_image_folder)
43
+ compare_image = AwsService.get_image_from_s3(os.environ.get('AWS_S3_BUCKET'), compare_image_folder)
44
+
45
+ # download image to local storage
46
+ main_image["pil"].save("main_image.jpg")
47
+ compare_image["pil"].save("compare_image.jpg")
48
+
49
+ result = face_similarity("main_image.jpg", "compare_image.jpg")
50
+
51
+ os.remove("main_image.jpg")
52
+ os.remove("compare_image.jpg")
53
+
54
+ return result
55
+
56
+ iface = gr.Interface(
57
+ fn=check_image_similarity,
58
+ inputs=[
59
+ gr.Textbox(lines=1, placeholder="Main Image Key", value="PhotoShoots/653fea0aad75f4caca672886/Croppeds/IMG-1698687849160-2.jpg"),
60
+ gr.Textbox(lines=1, placeholder="Compare Image Key", value="PhotoShoots/653fea0aad75f4caca672886/Croppeds/IMG-1698687855097-1.jpg")
61
+ ],
62
+ outputs="text"
63
+ )
64
+
65
+ iface.launch()
requirements.txt ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiofiles==23.2.1
2
+ altair==5.1.2
3
+ annotated-types==0.6.0
4
+ anyio==3.7.1
5
+ attrs==23.1.0
6
+ boto3==1.26.25
7
+ botocore==1.29.25
8
+ certifi==2023.7.22
9
+ charset-normalizer==3.3.2
10
+ click==8.1.7
11
+ contourpy==1.1.1
12
+ cycler==0.12.1
13
+ dlib==19.24.2
14
+ exceptiongroup==1.1.3
15
+ face-recognition==1.3.0
16
+ face-recognition-models==0.3.0
17
+ fastapi==0.104.1
18
+ ffmpy==0.3.1
19
+ filelock==3.13.1
20
+ fonttools==4.44.0
21
+ fsspec==2023.10.0
22
+ gradio==3.44.4
23
+ gradio-client==0.5.1
24
+ h11==0.14.0
25
+ httpcore==1.0.2
26
+ httpx==0.25.1
27
+ huggingface-hub==0.19.1
28
+ idna==3.4
29
+ importlib-resources==6.1.1
30
+ Jinja2==3.1.2
31
+ jmespath==1.0.1
32
+ jsonschema==4.19.2
33
+ jsonschema-specifications==2023.7.1
34
+ kiwisolver==1.4.5
35
+ MarkupSafe==2.0.1
36
+ matplotlib==3.7.3
37
+ numpy==1.24.4
38
+ opencv-python==4.8.1.78
39
+ orjson==3.9.10
40
+ packaging==23.2
41
+ pandas==2.0.3
42
+ Pillow==10.1.0
43
+ pkgutil-resolve-name==1.3.10
44
+ pydantic==2.5.0
45
+ pydantic-core==2.14.1
46
+ pydub==0.25.1
47
+ pyparsing==3.1.1
48
+ python-dateutil==2.8.2
49
+ python-dotenv==1.0.0
50
+ python-multipart==0.0.6
51
+ pytz==2023.3.post1
52
+ PyYAML==6.0.1
53
+ referencing==0.30.2
54
+ requests==2.31.0
55
+ rpds-py==0.12.0
56
+ s3transfer==0.6.2
57
+ semantic-version==2.10.0
58
+ six==1.16.0
59
+ sniffio==1.3.0
60
+ starlette==0.27.0
61
+ toolz==0.12.0
62
+ tqdm==4.66.1
63
+ typing-extensions==4.8.0
64
+ tzdata==2023.3
65
+ urllib3==1.26.18
66
+ uvicorn==0.24.0.post1
67
+ websockets==11.0.3
68
+ zipp==3.17.0
services/aws_service.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import boto3
3
+ from PIL import Image
4
+ from io import BytesIO
5
+
6
+ class AwsService:
7
+ def session():
8
+ return boto3.Session(
9
+ aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
10
+ aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY'),
11
+ region_name=os.environ.get('AWS_REGION')
12
+ )
13
+
14
+ def s3_client():
15
+ return AwsService.session().client('s3')
16
+
17
+ def get_files_from_s3(bucket, prefix):
18
+ results = AwsService.s3_client().list_objects(Bucket=bucket, Prefix=prefix)
19
+ if 'Contents' in results:
20
+ return results['Contents']
21
+ else:
22
+ return []
23
+
24
+ def get_image_from_s3(bucket, key):
25
+ file_byte_string = AwsService.s3_client().get_object(Bucket=bucket, Key=key)['Body'].read()
26
+ return {
27
+ 'key': key.split('/')[-1].split('.')[0],
28
+ 'pil': Image.open(BytesIO(file_byte_string))
29
+ }