Mô hình AI EfficientNet-B4 + CBAM
Tài liệu kỹ thuật toàn diện về Kiến trúc Mạng Nơ-ron, Pipeline Tiền Xử lý Ảnh Đáy Mắt (Fundus Photo) và Quy chuẩn Trả về dữ liệu **JSON API** cho bài toán Phân loại Bệnh Võng mạc Tiểu đường (DR - 5 Lớp ICDR).
1. Tổng quan Mô hình AI
Mô hình EfficientNetB4_CBAM phục vụ chẩn đoán tự động tổn thương võng mạc ở bệnh nhân tiểu đường dựa trên ảnh chụp đáy mắt (Fundus Camera).
Phân loại 5 cấp độ tổn thương theo Tiêu chuẩn Y tế Quốc tế ICDR (International Clinical Diabetic Retinopathy Disease Severity Scale).
Sử dụng backbone EfficientNet-B4 kết hợp module chú ý 2 chiều CBAM (Channel & Spatial Attention).
Kích thước chuẩn 224 × 224 × 3. Hỗ trợ đa dạng định dạng: Đường dẫn File, Mảng Bytes, PIL Image, OpenCV Array.
Vector 5 xác suất Softmax $\rightarrow$ Đóng gói thành File JSON chuẩn chứa Class ID, Confidence %, Lời khuyên Y tế & Ảnh Base64.
2. Kiến trúc Chi tiết (Model Architecture)
Mạng kết hợp sức mạnh trích xuất đặc trưng đa tỷ lệ của EfficientNet-B4 và khả năng định vị tổn thương vi mô của CBAM Module:
EfficientNet-B4 Backbone
Trích xuất biểu diễn đặc trưng cấp cao từ ảnh đáy mắt. Output Feature Map shape: (Batch, 1792, 7, 7).
Channel Attention (CA Sub-module)
Sử dụng AvgPool + MaxPool kết hợp Shared MLP (tỷ lệ nén 16: $1792 \rightarrow 112 \rightarrow 1792$) để tính trọng số chú ý từng kênh đặc trưng.
Spatial Attention (SA Sub-module)
Tính mean & max qua các kênh, đưa qua Conv2d(kernel=7) + Sigmoid để tập trung vào các vùng xuất huyết, vi phình mạch, xuất tiết.
Classifier Head
AdaptiveAvgPool2d(1) $\rightarrow$ Flatten(1792) $\rightarrow$ Dropout(0.3) $\rightarrow$ Linear(1792 -> 5).
3. Quy trình Tiền xử lý Ảnh (Preprocessing Pipeline)
Thực thi qua 5 bước nghiêm ngặt trong preprocessing.py giúp nâng cao chất lượng chẩn đoán:
| Bước | Tên Hàm Python | Chức năng Kỹ thuật |
|---|---|---|
| 1 | load_image() |
Giải mã đa dạng đầu vào (Path, Byte array, PIL, BGR Array) về mảng OpenCV BGR uint8. |
| 2 | crop_fundus_circle() |
Tự động tìm Bounding Box vùng sáng đáy mắt và crop loại bỏ hoàn toàn khung viền đen dư thừa. |
| 3 | letterbox_resize() |
Resize ảnh về 224 × 224 giữ nguyên tỷ lệ Aspect Ratio (đệm viền đen), tránh làm méo dạng tổn thương. |
| 4 | ben_graham_transform() |
Lọc nhiễu & tăng tương phản Ben Graham: $\text{Output} = 4 \times I - 4 \times \text{GaussianBlur}(I, \sigma=10) + 128$. |
| 5 | prepare_image_tensor() |
Chuyển đổi sang PyTorch Tensor, chuẩn hóa ImageNet Mean [0.485, 0.456, 0.406] & Std [0.229, 0.224, 0.225]. |
4. Quy trình Xử lý & Tạo ra File JSON
Khi ứng dụng Frontend gửi ảnh qua REST API POST /api/predict, máy chủ tiến hành các bước xử lý tạo JSON như sau:
Tiếp nhận Request & Đọc File
Trích xuất mảng Byte từ UploadFile do HTTP Client tải lên.
Suy luận PyTorch Tensor (Inference)
Đưa Tensor qua mô hình DRPredictor, tính toán xác suất 5 lớp qua torch.softmax.
Mã hóa Ảnh Preprocessed sang Base64
Chuyển mảng OpenCV Ben Graham sang đuôi JPEG, sau đó encode Base64 dạng data:image/jpeg;base64,... để Frontend có thể hiển thị tức thì.
Ghép nối Clinical Guidance & Trả về JSON
Tra cứu bảng chỉ dẫn y tế theo class_id (Title, Urgency, Badge Color) và đóng gói kết quả JSON hoàn chỉnh.
5. Cấu trúc File JSON Output (JSON Specification)
Dưới đây là ví dụ cấu trúc dữ liệu JSON phản hồi chuẩn HTTP 200 OK khi chẩn đoán thành công một ảnh đáy mắt:
{
"class_id": 0,
"class_name": "No DR",
"confidence": 0.9945334196090698,
"probabilities": {
"No DR": 0.9945334196090698,
"Mild": 0.0008030196186155081,
"Moderate": 0.0019999665673822165,
"Severe": 0.0011487160809338093,
"Proliferative DR": 0.0015149053651839495
}
}
Mô tả Giải thích Trường Dữ liệu (Field Dictionary)
| Tên Trường (Field) | Kiểu Dữ Liệu | Mô tả Chi tiết |
|---|---|---|
class_id |
Integer |
Mã lớp mức độ bệnh từ 0 (Bình thường) đến 4 (Tăng sinh nguy hiểm). |
class_name |
String |
Tên nhãn tiếng Anh theo chuẩn ICDR (No DR, Mild, Moderate, Severe, Proliferative DR). |
confidence |
Float |
Giá trị độ tin cậy của mô hình cho nhãn dự đoán (xác suất thô từ 0.0 đến 1.0). |
probabilities |
Object |
Map chứa xác suất phân bố cụ thể cho toàn bộ 5 lớp ICDR. |
6. Danh mục Lời khuyên Y tế Lâm sàng (ICDR Standard)
Mô hình AI tự động quy đổi kết quả sang khuyến nghị y tế lâm sàng theo tiêu chuẩn 5 mức độ ICDR:
| Class ID | Nhãn ICDR | Chẩn đoán Tiếng Việt | Mức độ Khẩn cấp | Badge Color UI |
|---|---|---|---|---|
| 0 | No DR | Mắt Bình Thường | Bình thường | #10b981 - Green |
| 1 | Mild | Bệnh Nhẹ | Theo dõi định kỳ | #3b82f6 - Blue |
| 2 | Moderate | Bệnh Trung Bình | Khám chuyên khoa | #f59e0b - Orange |
| 3 | Severe | Bệnh Nặng | Cần can thiệp sớm | #ef4444 - Red |
| 4 | Proliferative DR | Tăng Sinh Nguy Hiểm | KHẨN CẤP | #5e0101 - Dark Red |
7. Hướng dẫn Tích hợp REST API
REST API được khởi chạy với FastAPI tại cổng 8000. Dưới đây là các ví dụ mã nguồn kết nối tích hợp:
Mã nguồn Python Gọi API
import requests
url = "http://localhost:8000/api/predict"
file_path = "fundus_sample.jpg"
with open(file_path, "rb") as f:
files = {"file": (file_path, f, "image/jpeg")}
response = requests.post(url, files=files)
data = response.json()
print("Nhãn chẩn đoán:", data["prediction"]["class_name"])
print("Độ tin cậy:", data["prediction"]["confidence"], "%")
print("Mức khẩn cấp:", data["clinical_guidance"]["urgency"])
Mã nguồn JavaScript Frontend (Fetch API)
async function sendImageToAI(fileInput) {
const formData = new FormData();
formData.append("file", fileInput.files[0]);
const res = await fetch("http://localhost:8000/api/predict", {
method: "POST",
body: formData
});
const json = await res.json();
// Update UI Elements
document.getElementById("result-title").innerText = json.clinical_guidance.title;
document.getElementById("result-title").style.color = json.clinical_guidance.badge_color;
document.getElementById("preview-img").src = json.preprocessed_image_base64;
}
8. Đóng gói & Triển khai (Deployment)
Khởi chạy hệ thống trong môi trường Docker Container production:
# Build Docker Image
docker build -t dr-efficientnet-api .
# Run Container
docker run -d -p 8000:8000 --name dr_ai_service dr-efficientnet-api