|
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) |
|
|