Spaces:
Sleeping
Sleeping
import gradio as gr | |
import cv2 | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from tensorflow.keras.datasets import mnist | |
# Functions for MNIST processing steps | |
def load_mnist(): | |
(x_train, y_train), (x_test, y_test) = mnist.load_data() | |
return x_test, y_test | |
def get_grayscale(image): | |
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
def thresholding(src): | |
return cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)[1] | |
def gaussian_blur(image): | |
return cv2.GaussianBlur(image, (5, 5), 0) | |
def edge_detection(image): | |
return cv2.Canny(image, 100, 200) | |
def process_mnist_image(img, steps): | |
original_img = img.copy() | |
step_images = {'Original': original_img} | |
for step in steps: | |
if step == "Grayscale Conversion": | |
img = get_grayscale(img) | |
elif step == "Thresholding": | |
img = thresholding(img) | |
elif step == "Gaussian Blur": | |
img = gaussian_blur(img) | |
elif step == "Edge Detection": | |
img = edge_detection(img) | |
step_images[step] = img | |
return step_images | |
def visualize_steps(img, steps): | |
step_images = process_mnist_image(img, steps) | |
fig, axes = plt.subplots(1, len(step_images), figsize=(15, 5)) | |
for ax, (step, img) in zip(axes, step_images.items()): | |
ax.imshow(img, cmap='gray') | |
ax.set_title(step) | |
ax.axis('off') | |
plt.tight_layout() | |
plt.savefig('mnist_processing_steps.png') | |
return 'mnist_processing_steps.png' | |
# Interactive tutorial steps | |
tutorial_steps = [ | |
"Grayscale Conversion", | |
"Thresholding", | |
"Gaussian Blur", | |
"Edge Detection" | |
] | |
# Interactive questions | |
questions = [ | |
{ | |
"question": "What is the first step in preprocessing MNIST images?", | |
"options": ["Gaussian Blur", "Grayscale Conversion", "Edge Detection"], | |
"answer": "Grayscale Conversion" | |
}, | |
{ | |
"question": "What does thresholding do in image preprocessing?", | |
"options": ["Detects edges", "Blurs the image", "Binarizes the image"], | |
"answer": "Binarizes the image" | |
}, | |
{ | |
"question": "What library is used to load the MNIST dataset?", | |
"options": ["OpenCV", "TensorFlow", "Pytorch"], | |
"answer": "TensorFlow" | |
}, | |
{ | |
"question": "What color space conversion is used in Grayscale Conversion?", | |
"options": ["BGR to RGB", "RGB to GRAY", "BGR to GRAY"], | |
"answer": "BGR to GRAY" | |
}, | |
{ | |
"question": "What is the purpose of Gaussian Blur?", | |
"options": ["Detect edges", "Reduce noise", "Convert to grayscale"], | |
"answer": "Reduce noise" | |
} | |
] | |
def quiz_interface(): | |
def check_answer(question_idx, selected): | |
if questions[question_idx]["answer"] == selected: | |
return "Correct!" | |
else: | |
return "Incorrect. The correct answer is: " + questions[question_idx]["answer"] | |
interfaces = [] | |
for idx, question in enumerate(questions): | |
radio = gr.Radio(choices=question["options"], label=question["question"]) | |
button = gr.Button("Submit") | |
output = gr.Textbox(label="Result") | |
def create_submit_fn(idx): | |
def submit(selected): | |
return check_answer(idx, selected) | |
return submit | |
interfaces.append(gr.Interface( | |
create_submit_fn(idx), | |
radio, | |
output, | |
live=True | |
)) | |
return interfaces | |
# Explanation text | |
explanation_text = """ | |
**Welcome to the MNIST Processing Tutorial!** | |
This tutorial will guide you through the basic steps of preprocessing images from the MNIST dataset. | |
**Steps in the MNIST Image Processing:** | |
1. **Grayscale Conversion:** Converts the image to grayscale to simplify the data. | |
2. **Thresholding:** Converts the grayscale image into a binary image to distinguish the digits more clearly. | |
3. **Gaussian Blur:** Applies a blur to reduce noise and detail in the image. | |
4. **Edge Detection:** Detects the edges of the digits to enhance the features for further processing or recognition tasks. | |
**Interactive Tutorial:** | |
Please upload an MNIST image and select the preprocessing steps to visualize their effects. | |
""" | |
(x_test, y_test) = load_mnist() | |
image = gr.Image(shape=(28, 28), image_mode='L') | |
steps = gr.CheckboxGroup(choices=tutorial_steps, label="Select and order the steps for MNIST processing") | |
output = gr.Image(type='file', label="Processing Steps Visualization") | |
explanation = gr.Markdown(explanation_text) | |
mnist_app = gr.Interface( | |
fn=visualize_steps, | |
inputs=[image, steps], | |
outputs=output, | |
title="MNIST Image Processing", | |
description=explanation_text, | |
css=".gradio-container {background-color: lightgray} #radio_div {background-color: #FFD8B4; font-size: 40px;}" | |
) | |
quiz_app = gr.TabbedInterface( | |
[mnist_app] + quiz_interface(), | |
["MNIST Tool"] + [f"Question {i+1}" for i in range(len(questions))], | |
title="MNIST Tutorial and Quiz" | |
) | |
quiz_app.launch() | |