Spaces:
Runtime error
Runtime error
Commit
•
552f2cd
1
Parent(s):
343faa9
Commit inicial
Browse files- .gitattributes +35 -0
- README.md +12 -0
- app.py +65 -0
- requirements.txt +68 -0
- 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 |
+
}
|