Spaces:
Runtime error
Runtime error
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) | |