HvR's picture
Create app.py
9d0fb2c verified
raw
history blame
3.56 kB
import gradio as gr
import numpy as np
import cv2
from PIL import Image
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import json
# Load MobileNetV2 model
model = MobileNetV2(weights='imagenet')
def add_hsv_noise(image, hue_noise=0, saturation_noise=0, value_noise=0):
"""Add HSV noise to an image"""
if image is None:
return None
# Convert PIL to numpy array
img_array = np.array(image)
# Convert RGB to HSV
hsv = cv2.cvtColor(img_array, cv2.COLOR_RGB2HSV).astype(np.float32)
# Add noise to each channel
hsv[:, :, 0] = np.clip(hsv[:, :, 0] + hue_noise, 0, 179) # Hue: 0-179
hsv[:, :, 1] = np.clip(hsv[:, :, 1] + saturation_noise, 0, 255) # Saturation: 0-255
hsv[:, :, 2] = np.clip(hsv[:, :, 2] + value_noise, 0, 255) # Value: 0-255
# Convert back to RGB
rgb = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2RGB)
return Image.fromarray(rgb)
def predict_image(image, top_n, hue_noise, saturation_noise, value_noise):
"""Predict image classes with noise applied"""
if image is None:
return None, "Please upload an image first."
# Apply HSV noise
noisy_image = add_hsv_noise(image, hue_noise, saturation_noise, value_noise)
# Preprocess for MobileNet
img_resized = noisy_image.resize((224, 224))
img_array = np.array(img_resized)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
# Make prediction
predictions = model.predict(img_array)
decoded_predictions = decode_predictions(predictions, top=top_n)[0]
# Format results
results = []
for i, (class_id, class_name, probability) in enumerate(decoded_predictions):
results.append(f"{i+1}. {class_name}: {probability:.4f} ({probability*100:.2f}%)")
results_text = "\n".join(results)
return noisy_image, results_text
# Create Gradio interface
with gr.Blocks(title="MobileNet HSV Noise Analysis") as demo:
gr.Markdown("# MobileNet Classification with HSV Noise")
gr.Markdown("Upload an image and adjust HSV noise sliders to see how it affects MobileNet predictions.")
with gr.Row():
with gr.Column():
# Input controls
input_image = gr.Image(type="pil", label="Upload Image")
top_n = gr.Slider(minimum=1, maximum=10, value=5, step=1, label="Top N Classes")
gr.Markdown("### HSV Noise Controls")
hue_noise = gr.Slider(minimum=-50, maximum=50, value=0, step=1, label="Hue Noise (-50 to 50)")
saturation_noise = gr.Slider(minimum=-100, maximum=100, value=0, step=5, label="Saturation Noise (-100 to 100)")
value_noise = gr.Slider(minimum=-100, maximum=100, value=0, step=5, label="Value/Brightness Noise (-100 to 100)")
with gr.Column():
# Output displays
output_image = gr.Image(label="Image with Noise Applied")
predictions_text = gr.Textbox(label="Top Predictions", lines=10, max_lines=15)
# Set up real-time updates
inputs = [input_image, top_n, hue_noise, saturation_noise, value_noise]
outputs = [output_image, predictions_text]
# Update predictions when any input changes
for input_component in inputs:
input_component.change(
fn=predict_image,
inputs=inputs,
outputs=outputs
)
# Launch the app
if __name__ == "__main__":
demo.launch(share=True, debug=True)