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