Warlord-K's picture
Update app.py
eeedb7b
raw
history blame
4.08 kB
import os
import faiss
import gradio as gr
from helpers import *
import shutil
from PIL import Image
detector = load_detector()
model = load_model()
source_imgs = []
for r, _, f in os.walk(os.getcwd() + "/images"):
for file in f:
if (
(".jpg" in file.lower())
or (".jpeg" in file.lower())
or (".png" in file.lower())
):
exact_path = r + "/" + file
source_imgs.append(exact_path)
source_faces = []
for img in source_imgs:
try:
faces, id = extract_faces(detector, img)
source_faces.append(faces[id])
# source_faces.append(Image.open(img))
except Exception as e:
print(f"Skipping {img}, {e}")
source_embeddings = get_embeddings(model, source_faces)
def find_names(image, minSize, minConf):
imgs, _ = extract_faces(detector, image)
for i, face in enumerate(imgs):
print(face.size[0], face.size[1])
if(face.size[0] * face.size[1] < minSize):
del imgs[i]
embeds = get_embeddings(model, imgs)
print(len(embeds))
d = np.zeros((len(source_embeddings), len(embeds)))
for i, s in enumerate(source_embeddings):
for j, t in enumerate(embeds):
d[i][j] = findCosineDistance(s, t)
ids = np.argmin(d, axis = 0)
names = []
for j, i in enumerate(ids):
if 1 - d[i][j] > minConf:
names.append(source_imgs[i].split("/")[-1].split(".")[0])
else:
names.append("Unknown")
recognition(imgs, ids, names, source_faces, d, source_imgs)
return ",".join(names), "Recognition.jpg"
detect = gr.Interface(
find_names,
[gr.Image(type="filepath", label="Class Photo"), gr.Number(label = "Minimum Size"), gr.Number(label = "Minimum Confidence")],
["text" ,gr.Image(type = "filepath", label="Matching")],
examples = [
[os.path.join(os.path.dirname(__file__), "examples/group1.jpg"), 1000, 0.3],
[os.path.join(os.path.dirname(__file__), "examples/group2.jpg"), 1000, 0.3]
]
)
def upload_files(files):
if not os.path.exists(os.path.join(os.getcwd(), "temp")):
os.mkdir(os.path.join(os.getcwd(), "temp"))
for file in files:
shutil.move(file.name, os.path.join(os.getcwd(), "temp", file.name.split('\\')[-1]))
return None, "Uploaded!"
with gr.Blocks() as upload:
gr.Markdown("# Select Images to Upload and click Upload")
with gr.Row():
input = gr.Files(file_types=[".jpg", ".jpeg", ".png"], label="Upload images")
# input = gr.Image(type="filepath")
output = gr.Textbox()
upload_btn = gr.Button(value="Upload")
upload_btn.click(upload_files, inputs=[input], outputs=[input, output])
def load_image():
global i, imgs
images = os.listdir(os.path.join(os.getcwd(), "temp"))
imgs = []
for image in images:
faces, id = extract_faces(detector, os.path.join(os.getcwd(), "temp", image))
# imgs.append(Image.open(os.path.join(os.getcwd(), "temp", image)))
imgs.append(faces[id])
return imgs[0], "Loaded!"
def save_img(label):
global i, imgs
imgs[i].save(os.path.join(os.getcwd(), "images", f"{label}.jpg"))
i+=1
if i < len(imgs):
return imgs[i], "Saved!"
else:
clear()
return None, "Finished!"
def clear():
global i, imgs
i = 0
imgs = None
shutil.rmtree(os.path.join(os.getcwd(), "temp"))
return None, None
i = 0
imgs = None
with gr.Blocks() as annotate:
with gr.Row():
input = gr.Textbox(label = "Enter Label")
output = gr.Image(type="pil", label="Image").style(height=400)
with gr.Row():
next_btn = gr.Button(value="Next")
next_btn.click(load_image, inputs=[], outputs=[output, input])
save_btn = gr.Button(value="Save")
save_btn.click(save_img, inputs=[input], outputs=[output, input])
clear_btn = gr.Button(value="Clear")
clear_btn.click(clear, inputs=[], outputs=[output, input])
tabbed_interface = gr.TabbedInterface(
[detect, upload, annotate],
["Attendance", "Upload", "Annotate"],
)
if __name__ == "__main__":
tabbed_interface.launch()