import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTk import numpy as np import tensorflow as tf import json import os import sys def resource_path(relative_path): """Get absolute path to resource, works for dev and for PyInstaller.""" try: base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) try: model = tf.keras.models.load_model(resource_path("dog_breed_classifier.h5"), compile=False) except Exception as e: messagebox.showerror("Model Load Error", f"Could not load model:\n{e}") sys.exit(1) try: with open(resource_path("class_indices.json"), "r") as f: class_indices = json.load(f) class_names = {int(v): k for k, v in class_indices.items()} except Exception as e: messagebox.showerror("Class Index Load Error", f"Could not load labels:\n{e}") sys.exit(1) def predict_image(image_path): try: img = Image.open(image_path).resize((224, 224)).convert("RGB") img_array = np.array(img) / 255.0 img_array = np.expand_dims(img_array, axis=0) predictions = model.predict(img_array)[0] top_idx = np.argmax(predictions) breed = class_names[top_idx] confidence = predictions[top_idx] * 100 return breed, confidence except Exception as e: messagebox.showerror("Prediction Error", str(e)) return "Error", 0 def upload_image(): file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg *.png *.jpeg")]) if not file_path: return image = Image.open(file_path) image = image.resize((250, 250)) img_tk = ImageTk.PhotoImage(image) img_label.configure(image=img_tk) img_label.image = img_tk breed, confidence = predict_image(file_path) result_label.config(text=f"Breed: {breed}\nConfidence: {confidence:.2f}%") root = tk.Tk() root.title("Dog Breed Detector") root.geometry("400x500") root.configure(bg="white") title = tk.Label(root, text="Dog Breed Classification", font=("Arial", 18), bg="white") title.pack(pady=10) btn = tk.Button(root, text="Upload Image", command=upload_image, font=("Arial", 12), bg="#4CAF50", fg="white") btn.pack(pady=10) img_label = tk.Label(root, bg="white") img_label.pack() result_label = tk.Label(root, text="", font=("Arial", 14), bg="white", fg="#333") result_label.pack(pady=20) root.mainloop()