HumanOrNot / app.py
Thanh6624's picture
Update app.py
539edb0 verified
Raw
History Blame Contribute Delete
2.89 kB
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()