Spaces:
Sleeping
Sleeping
File size: 2,889 Bytes
08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 539edb0 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 8efd896 08b08d4 | 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 | 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() |