import gradio as gr import tensorflow as tf import numpy as np from PIL import Image # --- CẤU HÌNH QUAN TRỌNG --- # 1. Tên file model (Phải khớp chính xác tên file bạn đã upload) MODEL_FILENAME = "model.h5" # 2. Kích thước ảnh model yêu cầu # BẮT BUỘC PHẢI CÓ. Bạn cần nhớ lại lúc train bạn chọn size bao nhiêu. # Nếu là 150 thì giữ nguyên, nếu khác thì sửa số này. IMG_SIZE = 150 # --- LOAD MODEL --- try: model = tf.keras.models.load_model(MODEL_FILENAME) print(f"Đã load thành công model: {MODEL_FILENAME}") except Exception as e: print(f"LỖI NGHIÊM TRỌNG: Không tìm thấy file {MODEL_FILENAME}. Hãy kiểm tra lại tab Files.") model = None # --- HÀM XỬ LÝ VÀ DỰ ĐOÁN --- def du_doan_nguoi(image): if model is None: return "Lỗi: Chưa load được model." if image is None: return "Vui lòng tải ảnh lên." # --- BƯỚC CHUẨN HÓA ẢNH (BẮT BUỘC) --- # Dù người dùng up ảnh size nào, ta cũng phải đưa về đúng chuẩn của model. # Nếu bỏ bước này, code sẽ báo lỗi ngay lập tức. image_resized = image.resize((IMG_SIZE, IMG_SIZE)) # Chuyển sang dạng số và chuẩn hóa về khoảng 0-1 img_array = np.array(image_resized) img_array = img_array / 255.0 # Thêm chiều batch (ví dụ từ (150,150,3) thành (1,150,150,3)) img_array = np.expand_dims(img_array, axis=0) # --- DỰ ĐOÁN --- prediction = model.predict(img_array)[0] # --- XỬ LÝ KẾT QUẢ --- # Cần xác định quy ước lúc train: 0 là gì, 1 là gì? # GIẢ ĐỊNH PHỔ BIẾN: 0 = Không phải người, 1 = Người. # Nếu kết quả bị ngược, hãy đảo vị trí hai nhãn này cho nhau. labels = ['Con người','Không phải người'] if len(prediction) == 1: # Dạng 1 đầu ra (Sigmoid) score_nguoi = float(prediction[0]) return {labels[1]: score_nguoi, labels[0]: 1 - score_nguoi} else: # Dạng 2 đầu ra (Softmax) return {labels[i]: float(prediction[i]) for i in range(len(labels))} # --- GIAO DIỆN WEB --- demo = gr.Interface( fn=du_doan_nguoi, inputs=gr.Image(type="pil", label="Tải ảnh của bạn lên đây (Kích thước bất kỳ)"), outputs=gr.Label(num_top_classes=2, label="Kết quả phân tích AI"), title="🤖 Web Nhận Diện: Con Người hay Không?", description=f"Tải lên một bức ảnh bất kỳ, AI sẽ kiểm tra xem trong ảnh có phải là con người hay không. (Model đang chạy ở kích thước {IMG_SIZE}x{IMG_SIZE})", theme="default" ) # Chạy ứng dụng if __name__ == "__main__": # Thêm debug=True để dễ xem lỗi nếu có demo.launch()