Spaces:
Sleeping
Sleeping
| import tensorflow as tf | |
| import numpy as np | |
| import gradio as gr | |
| import json | |
| from PIL import Image, ImageDraw, ImageFont | |
| import os | |
| def load_model(model_path): | |
| # Load your TensorFlow model | |
| return tf.keras.models.load_model(model_path) | |
| def preprocess_image(image, target_size): | |
| # Resize and normalize the image | |
| image = image.resize(target_size) | |
| image = np.array(image) / 255.0 # Normalize to [0, 1] | |
| image = np.expand_dims(image, axis=0) # Add batch dimension | |
| return image | |
| def predict_top_10(image, model, class_indices): | |
| # Preprocess the image | |
| input_image = preprocess_image(image, target_size=(224, 224)) | |
| # Get predictions | |
| predictions = model.predict(input_image)[0] # Assuming single image batch | |
| # print("Model predictions:", predictions) # Debugging line | |
| # Get top 10 predictions | |
| top_indices = np.argsort(predictions)[::-1][:10] # Sort descending, take top 10 | |
| top_probs = predictions[top_indices] | |
| top_classes = [class_indices[i] for i in top_indices] | |
| output = [(top_classes[i], top_probs[i]) for i in range(10)] | |
| print("Top 10 predictions:", output) # Debugging line | |
| return output | |
| def visualize_predictions(predictions, class_image_dir): | |
| print("Received predictions:", predictions) # Debugging to check what's coming in | |
| output_images = [] | |
| # Load the font once outside the loop to avoid redundant loading | |
| font = ImageFont.load_default() # or ImageFont.truetype("./arial.ttf", 20) | |
| for class_name, prob in predictions: | |
| class_image_path = os.path.join(class_image_dir, f"{class_name}.jpg") | |
| try: | |
| class_image = Image.open(class_image_path).convert("RGB") | |
| # Resize image if necessary | |
| class_image = class_image.resize((300, 300)) | |
| draw = ImageDraw.Draw(class_image) | |
| text = f"{class_name}: {prob:.2%}" | |
| draw.text((10, 10), text, fill="black", font=font) | |
| output_images.append(class_image) | |
| except FileNotFoundError: | |
| blank_image = Image.new("RGB", (300, 300), "black") | |
| draw = ImageDraw.Draw(blank_image) | |
| draw.text((10, 10), f"{class_name}: {prob:.2%} (Image not found)", fill="black", font=font) | |
| output_images.append(blank_image) | |
| except Exception as e: | |
| print(f"Error processing {class_name}: {e}") | |
| blank_image = Image.new("RGB", (300, 300), "black") | |
| draw = ImageDraw.Draw(blank_image) | |
| draw.text((10, 10), f"{class_name}: {prob:.2%} (Error: {str(e)})", fill="black", font=font) | |
| output_images.append(blank_image) | |
| return output_images | |
| # Load model and class indices | |
| model = load_model("owned_coins.keras") # Update with your model's file path | |
| with open("class_indices.json", "r") as f: | |
| class_indices = json.load(f) | |
| # Reverse the dictionary | |
| class_indices = {v: k for k, v in class_indices.items()} | |
| # Specify the directory containing class images | |
| class_image_dir = "downloaded_images" # Update with the actual path to your image directory | |
| def gradio_predict(image): | |
| # Get top 10 predictions | |
| predictions = predict_top_10(image, model, class_indices) | |
| print("Predictions:", predictions) # Debugging line | |
| # Visualize predictions with class images | |
| result_images = visualize_predictions(predictions, class_image_dir) | |
| return result_images | |
| # Create Gradio interface | |
| interface = gr.Interface( | |
| fn=gradio_predict, | |
| inputs=gr.Image(type="pil", label="Upload an Image"), | |
| outputs=gr.Gallery(label="Top 10 Predictions"), | |
| title="Multiclass Image Classifier", | |
| description="Upload an image to see the top 10 predictions with class images and probabilities." | |
| ) | |
| # Launch locally and push to Hugging Face | |
| if __name__ == "__main__": | |
| interface.launch(share=True) | |
| # Uncomment the following line to push to Hugging Face (requires Hugging Face credentials) | |
| # interface.launch(share=True) | |