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