Spaces:
Runtime error
Runtime error
| import json | |
| import logging | |
| import os | |
| from functools import partial | |
| import gradio as gr | |
| from datasets import Dataset, load_dataset | |
| from dotenv import load_dotenv | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| logger.setLevel(logging.INFO) | |
| load_dotenv() | |
| # dataset = load_dataset("detection-datasets/coco") | |
| it_dataset = load_dataset( | |
| "imagenet-1k", split="train", streaming=True, trust_remote_code=True | |
| ).shuffle(42) | |
| def gen_from_iterable_dataset(iterable_ds): | |
| """ | |
| Convert an iterable dataset to a generator | |
| """ | |
| yield from iterable_ds | |
| # imagenet_categories_data.json is a JSON file containing a hierarchy of ImageNet categories. | |
| # We want to take all categories under "artifact, artefact". | |
| # Each node has this structure: | |
| # { | |
| # "id": 1, | |
| # "name": "entity", | |
| # "children": ... | |
| # } | |
| with open("imagenet_categories_data.json") as f: | |
| data = json.load(f) | |
| # Recursively find all categories under "artifact, artefact". | |
| # We want to get all the "index" values of the leaf nodes. Nodes that are not leaf nodes have a "children" key. | |
| def find_categories(node): | |
| if "children" in node: | |
| for child in node["children"]: | |
| yield from find_categories(child) | |
| elif "index" in node: | |
| yield node["index"] | |
| broad_categories = data["children"] | |
| artifact_category = next( | |
| filter(lambda x: x["name"] == "artifact, artefact", broad_categories) | |
| ) | |
| artifact_categories = list(find_categories(artifact_category)) | |
| logger.info(f"Artifact categories: {artifact_categories}") | |
| def filter_imgs_by_label(x): | |
| """ | |
| Filter out the images that have label -1 | |
| """ | |
| print(f'label: {x["label"]}') | |
| return x["label"] in artifact_categories | |
| dataset = it_dataset.take(1000).filter(filter_imgs_by_label) | |
| dataset = Dataset.from_generator( | |
| partial(gen_from_iterable_dataset, it_dataset), features=it_dataset.features | |
| ) | |
| dataset_iterable = iter(dataset) | |
| def get_user_prompt(): | |
| # Pick the first 3 images and labels | |
| images = [] | |
| machine_labels = [] | |
| human_labels = [] | |
| for i in range(3): | |
| data = next(dataset_iterable) | |
| logger.info(f"Data: {data}") | |
| images.append(data["image"]) | |
| # Get the label as a human readable string | |
| machine_labels.append(data["label"]) | |
| logger.info(dataset) | |
| human_label = dataset.features["label"].int2str(data["label"]) + str( | |
| data["label"] | |
| ) | |
| human_labels.append(human_label) | |
| return { | |
| "images": images, | |
| "machine_labels": machine_labels, | |
| "human_labels": human_labels, | |
| } | |
| hf_writer = gr.HuggingFaceDatasetSaver( | |
| hf_token=os.environ["HF_TOKEN"], dataset_name="acmc/maker-faire-bot", private=True | |
| ) | |
| csv_writer = gr.CSVLogger(simplify_file_data=True) | |
| theme = gr.themes.Default(primary_hue="cyan", secondary_hue="fuchsia") | |
| with gr.Blocks(theme=theme) as demo: | |
| with gr.Row() as header: | |
| gr.Image( | |
| "maker-faire-logo.webp", | |
| show_download_button=False, | |
| show_label=False, | |
| show_share_button=False, | |
| container=False, | |
| # height=100, | |
| scale=0.2, | |
| ) | |
| gr.Markdown( | |
| """ | |
| # Maker Faire Bot | |
| """, | |
| visible=False, | |
| ) | |
| user_prompt = gr.State(get_user_prompt()) | |
| gr.Markdown("""# Think about these objects...""") | |
| gr.Markdown( | |
| """We want to teach the Maker Faire Bot some creativity. Help us get ideas on what you'd build!""" | |
| ) | |
| image_components = [] | |
| with gr.Row(variant="panel") as row: | |
| for i in range(len(user_prompt.value["images"])): | |
| with gr.Column(variant="default") as col: | |
| img = gr.Image( | |
| user_prompt.value["images"][i], | |
| label=user_prompt.value["human_labels"][i], | |
| interactive=False, | |
| show_download_button=False, | |
| show_share_button=False, | |
| ) | |
| image_components.append(img) | |
| btn = gr.Button("Change", variant="secondary") | |
| def change_image(user_prompt): | |
| data = next(dataset_iterable) | |
| logger.info(user_prompt) | |
| user_prompt = user_prompt.copy() | |
| user_prompt["images"][i] = data["image"] | |
| user_prompt["machine_labels"][i] = data["label"] | |
| user_prompt["human_labels"][i] = dataset.features["label"].int2str( | |
| data["label"] | |
| ) | |
| logger.info(user_prompt) | |
| return ( | |
| user_prompt, | |
| user_prompt["images"][i], | |
| gr.update( | |
| label=user_prompt["human_labels"][i], | |
| ), | |
| ) | |
| btn.click( | |
| change_image, | |
| inputs=[user_prompt], | |
| outputs=[user_prompt, img, img], | |
| preprocess=True, | |
| postprocess=True, | |
| ) | |
| user_answer_object = gr.Textbox( | |
| autofocus=True, | |
| placeholder="(example): An digital electronic guitar", | |
| label="What would you build?", | |
| ) | |
| user_answer_explanation = gr.TextArea( | |
| autofocus=True, | |
| label="How would you build it?", | |
| # The example uses a roll of string, a camera, and a loudspeaker to build an electronic guitar. | |
| placeholder="""To build an electronic guitar, I would: | |
| 1. Use the roll of string to create the strings of the guitar. | |
| 2. Use the camera to capture a live video of the hand movements. That way, I can use an AI model to predict the chords. | |
| 3. Using a computer vision model, identify where the fingers are placed on the strings. | |
| 4. Calculate the sounds that the loudspeaker should produce based on the finger placements. | |
| 5. Play the sound through the loudspeaker. | |
| """, | |
| ) | |
| csv_writer.setup( | |
| components=[user_prompt, user_answer_object, user_answer_explanation], | |
| flagging_dir="user_data_csv", | |
| ) | |
| hf_writer.setup( | |
| components=[user_prompt, user_answer_object, user_answer_explanation], | |
| flagging_dir="user_data_hf", | |
| ) | |
| submit_btn = gr.Button("Submit", variant="primary") | |
| def log_results(prompt, object, explanation): | |
| csv_writer.flag([prompt, object, explanation]) | |
| hf_writer.flag([prompt, object, explanation]) | |
| submit_btn.click( | |
| log_results, | |
| inputs=[user_prompt, user_answer_object, user_answer_explanation], | |
| preprocess=False, | |
| ) | |
| new_prompt_btn = gr.Button("New Prompt", variant="secondary") | |
| new_prompt_btn.click( | |
| get_user_prompt, | |
| outputs=[user_prompt], | |
| preprocess=False, | |
| ) | |
| gr.Markdown( | |
| """ | |
| This is an experimental project. Your data is anonymous and will be used to train an AI model. By using this tool, you agree to our [policy](https://makerfaire.com/privacy). | |
| """ | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |