deepface / app.py
athanasopoulou's picture
Add deepface app
1b3fb15
from gradio import AnnotatedImage, Blocks, Button, Column, Dropdown, Examples, Gallery, HTML, Image, Row, SelectData, Tab, Textbox
import db
import deeperface
import os.path
################################################################################
def delete(id):
db.delete_by_id(id)
def emotions():
return deeperface.Emotion.labels
def process(path):
img = deeperface.Image.read(path)
############################################################################
if img.nsfw():
img.pixelate().write(path)
############################################################################
if db.exists(path):
id, metadata = db.get(path)
else:
metadata = deeperface.Metadata(img)
id = db.update(path, metadata)
############################################################################
annotations = []
for face in metadata:
annotations.extend(img.annotate(face, metadata[face]['emotion']))
############################################################################
verified_paths = []
for test_id, test_path, test_metadata in db.tuples():
if test_path != path:
if deeperface.verify(metadata.representations(),
test_metadata.representations()):
verified_paths.append((test_path, os.path.basename(test_id)))
############################################################################
return id, (path, annotations), verified_paths
def search(filter='All'):
filtered_paths = []
for id, path, metadata in db.tuples():
if filter == 'All' or filter in metadata.emotions():
filtered_paths.append((path, os.path.basename(id)))
return filtered_paths
################################################################################
with Blocks(title='Face recognition and facial attribute analysis') as blocks:
HTML(
'<h1><p align="center">Face recognition and facial attribute analysis</p></h1>'
)
with Row():
with Column(scale=3):
with Row():
with Column():
textbox = Textbox(visible=False)
annotated_image = AnnotatedImage(color_map={
'face': '#f97316',
'emotion': '#f3f4f6'
},
show_legend=False,
visible=False)
button = Button('Delete', visible=False)
with Column():
gallery_1 = Gallery(columns=3,
container=False,
show_download_button=False,
show_share_button=False,
visible=False)
html = HTML(visible=False)
with Column(scale=2):
with Tab(label='Upload / Camera'):
image = Image(container=False,
sources=['upload', 'webcam'],
type='filepath')
Examples('examples', image)
with Tab(label='Gallery') as tab:
dropdown = Dropdown(['All'] + emotions(),
container=False,
filterable=False,
value=0)
gallery_2 = Gallery(allow_preview=False,
columns=3,
container=False,
show_share_button=False)
############################################################################
def on_button_click(textbox, dropdown):
if not textbox or not dropdown:
return AnnotatedImage(), Button(), Gallery(), HTML(), Gallery()
delete(textbox)
gallery_2 = search(dropdown)
return AnnotatedImage(visible=False), Button(visible=False), Gallery(
visible=False), HTML(visible=False), Gallery(gallery_2,
selected_index=None)
button.click(on_button_click, [textbox, dropdown],
[annotated_image, button, gallery_1, html, gallery_2],
show_progress='hidden')
############################################################################
def on_image_change_or_select(image, dropdown):
if not image or not dropdown:
return Textbox(), AnnotatedImage(), Button(), Gallery(), HTML(
), Gallery()
textbox, annotated_image, gallery_1 = process(image)
gallery_2 = search(dropdown)
if len(gallery_1) > 1:
return textbox, AnnotatedImage(
annotated_image, label=textbox, visible=True
), Button(visible=True), Gallery(gallery_1, visible=True), HTML(
f'<i><p align="center">{len(gallery_1)} Similar Images in Gallery</p></i>',
visible=True), Gallery(gallery_2, selected_index=None)
elif len(gallery_1) > 0:
return textbox, AnnotatedImage(
annotated_image, label=textbox, visible=True
), Button(visible=True), Gallery(gallery_1, visible=True), HTML(
'<i><p align="center">1 Similar Image in Gallery</p></i>',
visible=True), Gallery(gallery_2, selected_index=None)
else:
return textbox, AnnotatedImage(
annotated_image, label=textbox,
visible=True), Button(visible=True), Gallery(
visible=False), HTML(visible=False), Gallery(
gallery_2, selected_index=None)
image.change(
on_image_change_or_select, [image, dropdown],
[textbox, annotated_image, button, gallery_1, html, gallery_2],
show_progress='hidden')
image.select(
on_image_change_or_select, [image, dropdown],
[textbox, annotated_image, button, gallery_1, html, gallery_2],
show_progress='hidden')
############################################################################
def on_tab_select(dropdown):
if not dropdown:
return Gallery()
gallery_2 = search(dropdown)
return Gallery(gallery_2, selected_index=None)
tab.select(on_tab_select, dropdown, gallery_2, show_progress='hidden')
############################################################################
def on_dropdown_select_event(event: SelectData):
dropdown = event.value
gallery_2 = on_tab_select(dropdown)
return gallery_2
dropdown.select(on_dropdown_select_event,
outputs=gallery_2,
show_progress='hidden')
############################################################################
def on_gallery_2_select_event(event: SelectData, dropdown):
image = event.value['image']['path']
textbox, annotated_image, button, gallery_1, html, gallery_2 = on_image_change_or_select(
image, dropdown)
return textbox, annotated_image, button, gallery_1, html, gallery_2
gallery_2.select(
on_gallery_2_select_event,
dropdown,
[textbox, annotated_image, button, gallery_1, html, gallery_2],
show_progress='hidden')
############################################################################
blocks.launch(show_api=False)