kienthanhlong131/dental-caries-segmentation
0
🦷 Dental U-Net Segmentation
Ứng dụng web phân đoạn sâu răng từ ảnh X-ray bằng U-Net. Dự án gồm backend Flask phục vụ API và frontend tĩnh để hiển thị kết quả.
🎯 Tính năng chính
- ✨ Chỉ dùng U-Net cho segmentation
- 🌐 Frontend HTML/JS đơn giản, trực quan
- ⚡ Inference nhanh với PyTorch
- 🧠 Tự động xử lý ảnh đầu vào và tạo mặt nạ segmentation
- 🔧 Cấu hình dễ dàng qua
backend/config.py
📋 Yêu cầu
- Python 3.8+
- PyTorch 2.0+
- CUDA tùy chọn nếu muốn chạy GPU
- Windows / Linux / Mac
📦 Cài đặt đầy đủ
1. Chuẩn bị môi trường
Mở terminal và chuyển vào thư mục dự án:
cd d:\Luận\Dental_UNet_Segmentation\backend2. Tạo môi trường ảo
python -m venv venv3. Kích hoạt môi trường ảo
Windows:
venv\Scripts\activateLinux/Mac:
source venv/bin/activate4. Cài đặt thư viện
pip install -r requirements.txt5. Đặt model vào thư mục
Copy file best_unet_dental_model.pth vào thư mục backend/models/:
copy path\to\best_unet_dental_model.pth backend\models\🚀 Chạy ứng dụng
Cách 1: Chạy trực tiếp bằng Python
python app.pySau khi chạy, server sẽ hoạt động tại:
http://127.0.0.1:5001http://localhost:5001
Cách 2: Dùng run.bat (Windows)
File run.bat đã được chuẩn bị sẵn để kích hoạt môi trường và chạy ứng dụng. Bạn chỉ cần chạy:
run.batCách 3: Dùng run.ps1 (PowerShell)
.\run.ps1🌐 Sử dụng frontend
- Mở trình duyệt và truy cập
http://localhost:5001 - Chọn ảnh X-ray răng
- Nhấn nút Phân tích
- Xem mặt nạ segmentation và ảnh chồng lên kết quả
Frontend hiện tại gửi ảnh đến endpoint mặc định: POST /api/unet-segment. Nếu frontend không tải được giao diện, bạn vẫn có thể dùng API trực tiếp.📡 API chi tiết
1. Health check
GET /healthResponse mẫu:
{
"status": "ok",
"model": {
"unet_loaded": true,
"device": "cpu"
}
}2. Segmentation
POST /api/segment
POST /api/unet-segment
Content-Type: multipart/form-data
Form data:
- image: file ảnh X-rayResponse mẫu:
{
"success": true,
"mask_available": true,
"mask_pixels": 1435,
"segmentation": "data:image/jpeg;base64,...",
"image": "data:image/jpeg;base64,..."
}🧩 Giải thích cấu trúc dự án
Dental_UNet_Segmentation/
├── ARCHITECTURE.md
├── QUICKSTART.md
├── README.md
├── requirements-dev.txt
├── run.bat
├── run.ps1
├── SETUP.md
├── test_model_load.py
├── backend/
│ ├── app.py
│ ├── config.py
│ ├── requirements.txt
│ ├── models/
│ │ └── best_unet_dental_model.pth
│ └── utils/
│ ├── __init__.py
│ ├── predictor.py
│ └── unet_model.py
└── frontend/
├── index.html
├── css/
│ └── style.css
└── js/
└── app.js🔧 Cấu hình quan trọng
Mở backend/config.py và điều chỉnh nếu cần:
UNET_THRESHOLD = float(os.environ.get('UNET_THRESHOLD', '0.05'))
UNET_DEVICE = os.environ.get('UNET_DEVICE', 'cpu')
API_PORT = int(os.environ.get('API_PORT', 5001))
MAX_IMAGE_SIZE = 16 * 1024 * 1024Các cấu hình có thể thay đổi
UNET_DEVICE:'cpu'hoặc'cuda'API_PORT: cổng serverUNET_THRESHOLD: ngưỡng phân loại mặt nạMAX_IMAGE_SIZE: giới hạn kích thước ảnh upload
✅ Kiểm tra nhanh
- Model đã nằm trong
backend/models/best_unet_dental_model.pth - Chạy
python app.pykhông báo lỗi - Mở
http://localhost:5001 - Gửi ảnh lên, nhận kết quả segmentation
🛠️ Khắc phục sự cố
1. Không tìm thấy model
- Kiểm tra file
backend/models/best_unet_dental_model.pth - Nếu thiếu, copy file model vào đúng thư mục
2. Lỗi port bị chiếm
- Thay
API_PORTtrongbackend/config.py - Hoặc tắt tiến trình đang dùng port 5001
3. Không có GPU
- Chuyển
UNET_DEVICEthành'cpu' - Ứng dụng vẫn chạy bình thường nhưng chậm hơn
4. Ảnh không hợp lệ
- Chỉ dùng định dạng
jpg,jpeg,png,bmp - Ảnh phải là ảnh X-ray răng rõ nét
📌 Lưu ý
- Server hiện tại dùng Flask development server. Nếu dùng production, nên deploy bằng WSGI server như Gunicorn hoặc uWSGI.
- File
run.batvàrun.ps1chỉ phục vụ chạy local.
📝 License
MIT License
👨💻 Tác giả
- Dự án mẫu cho phân đoạn ảnh y tế với U-Net.
- Dental AI Project
- Phát triển cho nghiên cứu nha khoa
📧 Support
Để được hỗ trợ, vui lòng tạo issue hoặc liên hệ.
Version: 1.0.0 Last Updated: 2026-06-15
