deepface / app.py
athanasopoulou's picture
Add deepface app
1b3fb15
raw
history blame
7.55 kB
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)