File size: 2,536 Bytes
2987148 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
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()
|