Giới thiệu dự án
Các bệnh lý về đường hô hấp, đặc biệt là viêm phổi và virus SARS-CoV-2 (COVID-19), luôn nằm trong nhóm nguyên nhân hàng đầu gây suy hô hấp cấp và tử vong trên phạm vi toàn cầu. Theo báo cáo của Tổ chức Y tế Thế giới (WHO), các bệnh nhiễm trùng đường hô hấp dưới cướp đi sinh mạng của hơn 2,5 triệu người mỗi năm. Trong giai đoạn bùng phát dịch bệnh, sự quá tải tại các cơ sở y tế đã làm bộc lộ rõ rệt sự thiếu hụt nhân lực chuyên môn, đặt áp lực khổng lồ lên đội ngũ bác sĩ chẩn đoán hình ảnh.
Chụp X-quang lồng ngực (Chest X-Ray - CXR) là kỹ thuật chẩn đoán hình ảnh phổ biến, chi phí thấp và nhanh chóng nhất. Tuy nhiên, việc đọc và phân tích ảnh X-quang phụ thuộc hoàn toàn vào kiến thức, kinh nghiệm và trạng thái thể lực của bác sĩ chuyên khoa. Sự mệt mỏi do quá tải công việc dễ dẫn đến các sai số chẩn đoán, bỏ sót những tổn thương mờ nhạt hoặc nốt phổi vi thể ở giai đoạn sớm.
Đề tài "Phân loại ảnh chụp X-quang phổi trong hỗ trợ chẩn đoán bệnh sử dụng học máy" được thực hiện bởi sinh viên Lê Trường Long dưới sự hướng dẫn của PGS. Nguyễn Mạnh Hùng tại Học viện Công nghệ Bưu chính Viễn thông nhằm xây dựng một hệ thống hỗ trợ chẩn đoán bằng máy tính (Computer-Aided Detection - CAD), đóng vai trò như một "ý kiến chuyên môn thứ hai" (second opinion) đáng tin cậy.
+-----------------------------------------------------------------------------------+
| QUY TRÌNH HỆ THỐNG TỔNG QUÁT |
| |
| [Ảnh X-quang CXR] --> [Tiền xử lý & Augmentation] --> [Deep CNN Model] |
| | |
| v |
| [Bác sĩ / CAD UI] <-- [Dự đoán: COVID-19 / Bình thường / Viêm phổi] |
+-----------------------------------------------------------------------------------+
Mục tiêu dự án
- Thu thập và chuẩn hóa dữ liệu: Xây dựng tập dữ liệu ảnh X-quang phổi chuẩn gồm 3 nhóm bệnh lý: Bình thường (Normal), Viêm phổi (Pneumonia) và COVID-19.
- Thiết kế kiến trúc Deep Learning: Nghiên cứu, thiết kế và tối ưu mạng nơ-ron tích chập (Convolutional Neural Networks - CNNs) với các khối tích hợp Batch Normalization và Dropout nhằm giải quyết triệt để hiện tượng Overfitting và Vanishing Gradient.
- Đánh giá khách quan: Áp dụng phương pháp đánh giá chéo 10-fold Stratified Cross-Validation để đo lường toàn diện hiệu năng mô hình qua các chỉ số Precision, Recall và F1-Score.
- Phát triển ứng dụng thực nghiệm: Xây dựng phần mềm ứng dụng giao diện web cho phép bác sĩ tải ảnh X-quang và nhận kết quả phân loại thời gian thực.
Phương pháp tiếp cận và Phạm vi
- Phương pháp tiếp cận: Sử dụng kỹ thuật Học sâu (Deep Learning) với mạng CNN nhiều tầng trích xuất đặc trưng không gian tự động, khắc phục hoàn toàn nhược điểm trích xuất đặc trưng thủ công của các thuật toán Machine Learning truyền thống (k-NN, Decision Tree, Naive Bayes).
- Phạm vi nghiên cứu: Phân loại đơn nhãn đa lớp (Multi-class classification) trên tập dữ liệu ảnh chụp X-quang ngực lồng trước - sau (PA view).
- Giới hạn: Mô hình tập trung vào 3 nhóm nhãn chính và phục vụ mục đích hỗ trợ ra quyết định lâm sàng, không thay thế hoàn toàn kết luận pháp lý của bác sĩ.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trước khi lựa chọn Deep Learning, đồ án đã nghiên cứu và đối sánh các hướng tiếp cận học máy truyền thống trong bài toán phân loại ảnh y tế.
| Phương pháp |
Ưu điểm cốt lõi |
Nhược điểm kỹ thuật |
Đánh giá độ phù hợp y tế |
| Naive Bayes (NBC) |
Tính toán cực nhanh; cần tập train nhỏ; giả định xác suất $P(A|B) = \frac{P(B|A)P(A)}{P(B)}$. |
Giả định các đặc trưng độc lập hoàn toàn; biểu diễn mối quan hệ không gian pixel rất kém. |
Không phù hợp: Bỏ sót tương quan cấu trúc mô phổi. |
| K-Láng giềng gần nhất (k-NN) |
Đơn giản, không cần giai đoạn huấn luyện phức tạp (Lazy learning); khoảng cách $d(x_i, x_j) = \sqrt{\sum (x_{ik} - x_{jk})^2}$. |
Độ phức tạp tính toán $O(N \cdot D)$ khi suy luận; cực kỳ nhạy cảm với nhiễu ảnh và biến động cường độ sáng. |
Kém khả thi: Chậm khi dữ liệu lớn, độ trễ suy luận cao. |
| Cây quyết định (Decision Tree - ID3/C4.5) |
Dễ giải thích trực quan; tính toán dựa trên Entropy $H(S) = -\sum p_i \log_2 p_i$ và Information Gain $IG(S,A)$. |
Dễ bị hiện tượng Overfitting nghiêm trọng; không ổn định khi dữ liệu pixel biến thiên nhẹ. |
Kém khả thi: Độ chính xác không đáp ứng tiêu chuẩn y tế. |
| Mạng nơ-ron tích chập (CNNs) |
Tự động học biểu diễn đặc trưng phân cấp từ thấp đến cao; bất biến với tịnh tiến và biến dạng nhẹ. |
Đòi hỏi tài nguyên phần cứng tính toán cao; chi phí huấn luyện lớn. |
Tối ưu nhất: Đạt độ chính xác vượt trội trên dữ liệu ảnh. |
CÂY QUYẾT ĐỊNH LỰA CHỌN MÔ HÌNH
│
┌─────────────────────┴─────────────────────┐
▼ ▼
[Phương pháp truyền thống] [Mạng nơ-ron tích chập]
(k-NN, Naive Bayes, ID3) (CNNs)
│ │
┌────────────────┴────────────────┐ │
▼ ▼ ▼
Trích xuất đặc tính Độ chính xác thấp Tự động trích xuất đặc trưng
thủ công (Feature Eng.) dễ bị quá khớp (Overfit) Độ chính xác vượt trội (Lựa chọn)
Yêu cầu hệ thống theo khung MoSCoW
- Must have: Mô hình CNN nhận diện chính xác 3 lớp (COVID-19, Normal, Pneumonia); tích hợp tiền xử lý chuẩn hóa dải pixel $[0, 1]$; giao diện web tải ảnh và trả về nhãn dự đoán.
- Should have: Áp dụng kỹ thuật Batch Normalization để tăng tốc hội tụ; sử dụng Data Augmentation chống quá khớp; cơ chế đánh giá 10-fold Cross Validation.
- Could have: Hiển thị xác suất phân phối (%) của từng lớp nhãn chẩn đoán; hỗ trợ xử lý hàng loạt ảnh (Batch Inference).
- Won't have (lần này): Tích hợp trực tiếp chuẩn truyền thông hình ảnh y tế DICOM/PACS bệnh viện; khoanh vùng tổn thương (Semantic Segmentation).
Thiết kế hệ thống
Kiến trúc mô hình CNNs1 và CNNs2
Đồ án đã thiết kế và thử nghiệm 2 kiến trúc mạng tích chập chuyên biệt:
- Kiến trúc CNNs1 (Baseline): Gồm 3 khối Convolution lặp (mỗi khối 2 lớp Conv2D kích thước kernel $3 \times 3$, hàm kích hoạt ReLU), xen kẽ bởi MaxPooling2D ($2 \times 2$) và Dropout. Sau khối tích chập thứ 3, bản đồ đặc trưng có kích thước $(26, 26, 128)$ được làm phẳng qua lớp
Flatten tạo ra vector $86,528$ chiều, nối vào lớp Dense(128). Điều này khiến lớp Dense đầu tiên tiêu tốn tới $11,075,712$ tham số.
- Kiến trúc CNNs2 (Tối ưu hóa sâu): Mở rộng lên 5 khối tích chập kết hợp chuẩn hóa tầng
BatchNormalization sau mỗi cụm Conv2D. Việc tăng độ sâu giúp giảm kích thước không gian bản đồ đặc trưng xuống $(5, 5, 128)$ trước khi đưa vào lớp Flatten (vector chỉ còn $3,200$ chiều). Nhờ đó, số tham số của lớp Dense(128) giảm mạnh từ $11,075,712$ xuống còn $409,728$ tham số (giảm hơn $96.3%$).
SƠ ĐỒ KIẾN TRÚC MẠNG CNNs2 (TỐI ƯU HÓA)
Input Layer: (224, 224, 3)
│
├── [Conv2D (32, 3x3)] ──> [Conv2D (32, 3x3)] ──> [BatchNorm] ──> [MaxPool (2x2)] ──> [Dropout]
│ Output: (111, 111, 32)
│
├── [Conv2D (32, 3x3)] ──> [Conv2D (32, 3x3)] ──> [BatchNorm] ──> [MaxPool (2x2)] ──> [Dropout]
│ Output: (54, 54, 32)
│
├── [Conv2D (64, 3x3)] ──> [Conv2D (64, 3x3)] ──> [BatchNorm] ──> [MaxPool (2x2)] ──> [Dropout]
│ Output: (26, 26, 64)
│
├── [Conv2D (64, 3x3)] ──> [Conv2D (64, 3x3)] ──> [BatchNorm] ──> [MaxPool (2x2)] ──> [Dropout]
│ Output: (12, 12, 64)
│
├── [Conv2D (128, 3x3)] ─> [Conv2D (128, 3x3)] ─> [MaxPool (2x2)] ──> [Dropout]
│ Output: (5, 5, 128)
│
└── [Flatten: 3,200] ──> [Dense (128) + Dropout] ──> [Dense (64) + Dropout]
──> [Dense (32) + Dropout] ──> [Dense (3, Softmax)]
Bảng thông số chi tiết kiến trúc CNNs2
| Tầng (Layer Type) |
Kích thước ngõ ra (Output Shape) |
Số lượng tham số (Param #) |
Chức năng kỹ thuật |
InputLayer |
(None, 224, 224, 3) |
0 |
Tiếp nhận ảnh RGB đầu vào chuẩn hóa |
Conv2D_1 + Conv2D_2 |
(None, 222, 222, 32) |
$896 + 9,248$ |
Trích xuất biên cạnh cơ bản (Edges/Textures) |
BatchNormalization_1 |
(None, 222, 222, 32) |
128 |
Ổn định phân phối kích hoạt nội tầng |
MaxPooling2D_1 + Dropout_1 |
(None, 111, 111, 32) |
0 |
Giảm chiều không gian $50%$, chống co-adaptation |
Conv2D_3 + Conv2D_4 |
(None, 109, 109, 32) |
$9,248 + 9,248$ |
Trích xuất hoa văn trung cấp |
BatchNormalization_2 |
(None, 109, 109, 32) |
128 |
Chuẩn hóa kích hoạt |
MaxPooling2D_2 + Dropout_2 |
(None, 54, 54, 32) |
0 |
Lấy mẫu cực đại |
Conv2D_5 + Conv2D_6 |
(None, 52, 52, 64) |
$18,496 + 36,928$ |
Trích xuất hình thái tổn thương phổi |
BatchNormalization_3 |
(None, 52, 52, 64) |
256 |
Giảm Covariate Shift |
MaxPooling2D_3 + Dropout_3 |
(None, 26, 26, 64) |
0 |
Downsampling |
Conv2D_7 + Conv2D_8 |
(None, 24, 24, 64) |
$36,928 + 36,928$ |
Học đặc trưng trừu tượng |
BatchNormalization_4 |
(None, 24, 24, 64) |
256 |
Chuẩn hóa kích hoạt |
MaxPooling2D_4 + Dropout_4 |
(None, 12, 12, 64) |
0 |
Giảm kích thước không gian |
Conv2D_9 + Conv2D_10 |
(None, 10, 10, 128) |
$73,856 + 147,584$ |
Tổng hợp đặc trưng bệnh lý chuyên sâu |
MaxPooling2D_5 + Dropout_5 |
(None, 5, 5, 128) |
0 |
Lấy mẫu bảo toàn giá trị nổi trội |
Flatten |
(None, 3200) |
0 |
Duỗi thẳng vector đặc trưng |
Dense_1 + Dropout_6 |
(None, 128) |
409,728 |
Phân loại bán tuyến tính |
Dense_2 + Dropout_7 |
(None, 64) |
8,256 |
Giảm chiều biểu diễn |
Dense_3 + Dropout_8 |
(None, 32) |
2,080 |
Tinh chỉnh không gian phân lớp |
Dense_Output (Softmax) |
(None, 3) |
99 |
Xác suất 3 nhãn bệnh |
Môi trường thực thi và Công nghệ
- Hệ điều hành: Microsoft Windows 10 Pro 64-bit.
- Vi xử lý (CPU): Intel Core i5-9400 @ 2.90 GHz (6 Cores, 6 Threads).
- Bộ nhớ RAM: 16 GB DDR4.
- Card đồ họa (GPU): NVIDIA GeForce GTX 1660 (6 GB VRAM).
- Ngôn ngữ & Nền tảng: Python 3.8, Jupyter Notebook, Anaconda Distribution.
- Thư viện chuyên dụng: TensorFlow 2.x, Keras API, Scikit-learn (StratifiedKFold, Classification Report), OpenCV, Matplotlib, NumPy.
+-------------------------------------------------------------------------------+
| TECHNOLOGY STACK SUMMARY |
| |
| [Core Language] : Python 3.8 |
| [Deep Learning] : TensorFlow 2.x / Keras API |
| [Data Processing] : OpenCV, NumPy, Pandas, Scikit-learn |
| [Augmentation] : Keras ImageDataGenerator |
| [Evaluation] : StratifiedKFold (k=10), Scikit-Learn Metrics |
| [Environment] : Jupyter Notebook / Anaconda / Windows 10 Pro |
| [Compute Engine] : NVIDIA GeForce GTX 1660 (CUDA Accelerated) |
+-------------------------------------------------------------------------------+
Implementation và kết quả
Quy trình tiền xử lý và Tăng cường dữ liệu
Tổng tập dữ liệu gồm 5,545 ảnh X-quang thu thập từ nguồn dữ liệu mở Kaggle:
- Nhãn
COVID: 2,000 ảnh.
- Nhãn
Normal: 2,200 ảnh.
- Nhãn
Pneumonia: 1,345 ảnh.
Dữ liệu được chuẩn hóa kích thước cố định $224 \times 224 \times 3$. Để chống hiện tượng quá khớp do số lượng ảnh viêm phổi thấp hơn, thư viện ImageDataGenerator được thiết lập với các siêu tham số biến đổi không gian:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Thiết lập pipeline tiền xử lý và tăng cường dữ liệu
train_datagen = ImageDataGenerator(
rescale=1.0 / 255.0, # Chuẩn hóa giá trị pixel về đoạn [0, 1]
zoom_range=0.2, # Phóng to/thu nhỏ ngẫu nhiên trong biên độ 20%
width_shift_range=0.1, # Dịch chuyển ngang ngẫu nhiên 10% chiều rộng
height_shift_range=0.1, # Dịch chuyển dọc ngẫu nhiên 10% chiều cao
fill_mode='nearest'
)
test_datagen = ImageDataGenerator(
rescale=1.0 / 255.0 # Tập kiểm thử chỉ thực hiện chuẩn hóa dải pixel
)
Cơ sở toán học của các tầng tích chập và tối ưu hóa
-
Công thức tính kích thước Feature Map sau tích chập:
$$h' = \left\lfloor \frac{h - f + 2p}{s} \right\rfloor + 1, \quad w' = \left\lfloor \frac{w - f + 2p}{s} \right\rfloor + 1$$
(Trong đó: $h, w$ là kích thước đầu vào; $f$ là kích thước kernel lọc $3 \times 3$; $p$ là padding; $s$ là stride bước trượt).
-
Hàm kích hoạt phi tuyến ReLU:
$$f(u) = \max(0, u)$$
-
Thuật toán tối ưu hóa Adam (Adaptive Moment Estimation):
Adam kết hợp ưu điểm của AdaGrad và RMSProp, sử dụng đạo hàm bậc một và bậc hai có trọng số suy giảm theo thời gian:
$$m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t, \quad v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2$$
$$\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}t = \frac{v_t}{1 - \beta_2^t}$$
$$w{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t$$
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Dropout, Flatten, Dense
def build_cnns2_model(input_shape=(224, 224, 3), num_classes=3):
model = Sequential([
# Khối 1
Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
Conv2D(32, (3, 3), activation='relu'),
BatchNormalization(),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
# Khối 2
Conv2D(32, (3, 3), activation='relu'),
Conv2D(32, (3, 3), activation='relu'),
BatchNormalization(),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
# Khối 3
Conv2D(64, (3, 3), activation='relu'),
Conv2D(64, (3, 3), activation='relu'),
BatchNormalization(),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
# Khối 4
Conv2D(64, (3, 3), activation='relu'),
Conv2D(64, (3, 3), activation='relu'),
BatchNormalization(),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
# Khối 5
Conv2D(128, (3, 3), activation='relu'),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
# Khối phân loại kết nối đầy đủ (Fully Connected)
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(64, activation='relu'),
Dropout(0.5),
Dense(32, activation='relu'),
Dropout(0.5),
Dense(num_classes, activation='softmax')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
loss='categorical_crossentropy',
metrics=['accuracy']
)
return model
Phương pháp đánh giá và Kết quả thực nghiệm
Mô hình được kiểm chứng nghiêm ngặt thông qua kỹ thuật 10-Fold Stratified Cross Validation bằng thư viện sklearn.model_selection.StratifiedKFold. Tập dữ liệu được chia làm 10 phần có tỷ lệ phân bố nhãn đồng đều; 9 phần dùng để huấn luyện và 1 phần dùng để kiểm thử luân phiên độc lập qua 10 lượt.
SƠ ĐỒ 10-FOLD STRATIFIED CROSS VALIDATION
Fold 1 : [ TEST ] [ TRAIN ] [ TRAIN ] [ TRAIN ] ... [ TRAIN ] ──> Metric 1
Fold 2 : [ TRAIN ] [ TEST ] [ TRAIN ] [ TRAIN ] ... [ TRAIN ] ──> Metric 2
Fold 3 : [ TRAIN ] [ TRAIN ] [ TEST ] [ TRAIN ] ... [ TRAIN ] ──> Metric 3
...
Fold 10: [ TRAIN ] [ TRAIN ] [ TRAIN ] [ TRAIN ] ... [ TEST ] ──> Metric 10
│
Trung bình 10 Fold ──┴──> [ Final Evaluation ]
Các chỉ số đánh giá được tính toán dựa trên ma trận nhầm lẫn (Confusion Matrix):
- Độ chuẩn xác (Precision): $\text{Precision} = \frac{TP}{TP + FP}$
- Độ nhạy / Thu hồi (Recall): $\text{Recall} = \frac{TP}{TP + FN}$
- Điểm số F1 trung bình điều hòa (F1-Score): $\text{F1-Score} = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} = \frac{2TP}{2TP + FP + FN}$
Bảng so sánh hiệu năng tổng hợp
| Mô hình thử nghiệm |
Số lượng tham số (Total Params) |
Hiện tượng Overfitting |
Thời gian hội tụ (Epochs) |
Accuracy trung bình |
F1-Score trung bình |
| Naive Bayes Baseline |
- |
Không |
Tức thì |
$68.4%$ |
$0.662$ |
| k-NN ($k=5$) |
- |
Không |
Không train |
$74.2%$ |
$0.728$ |
| Decision Tree (ID3) |
- |
Nghiêm trọng |
Nhanh |
$71.5%$ |
$0.701$ |
| CNNs1 (3 Blocks) |
$11,368,483$ |
Có (nhẹ ở epoch 25) |
$\sim 45$ epochs |
$91.2%$ |
$0.908$ |
| CNNs2 (5 Blocks + BN) |
$823,267$ |
Không (Rất ổn định) |
$\sim 30$ epochs |
$96.4%$ |
$0.961$ |
Đổi mới và đóng góp
- Tối ưu hóa kiến trúc tầng sâu vượt bậc: Khác với cấu trúc tích chập truyền thống thường gặp sự cố bùng nổ số lượng trọng số ở tầng kết nối đầy đủ, kiến trúc CNNs2 đã khéo léo sử dụng 5 cụm tích chập kết hợp lấy mẫu đa tầng để nén kích thước không gian bản đồ đặc trưng xuống $5 \times 5$, giúp giảm kích thước tham số mạng hơn 13.8 lần so với mô hình CNNs1 (từ $11.36$ triệu tham số xuống chỉ còn $823$ nghìn tham số).
- Khử hoàn toàn Covariate Shift bằng Batch Normalization: Việc đưa 4 tầng
BatchNormalization vào sau các cặp lớp Conv2D đã triệt tiêu hiện tượng Vanishing Gradient, giúp mô hình hội tụ nhanh hơn $33%$ và cho phép sử dụng tốc độ học (learning rate) tối ưu mà không lo sợ phân kỳ.
- Độ tin cậy cao nhờ Stratified 10-Fold CV: Không dựa trên một lần chia tập train/test ngẫu nhiên đơn lẻ, việc kiểm định qua 10-fold đảm bảo mô hình có tính tổng quát hóa cao, không phụ thuộc vào phương sai chia tách dữ liệu.
- Giao diện ứng dụng hoàn chỉnh: Xây dựng thành công web application cho phép bác sĩ tải ảnh đơn hoặc nhiều ảnh X-quang cùng lúc, hiển thị trực quan nhãn phân loại kèm độ tin cậy xác suất phân lớp.
+-----------------------------------------------------------------------------------+
| GIAO DIỆN ỨNG DỤNG HỖ TRỢ CHẨN ĐOÁN |
| |
| [ Tải ảnh X-quang lên: lung_scan_042.jpg ] [ Nút Phân Tích ] |
| ------------------------------------------------------------------------------- |
| KẾT QUẢ CHẨN ĐOÁN: |
| - Dự đoán chính: COVID-19 POSITIVE (Độ tin cậy: 98.6%) |
| - Phân phối xác suất: |
| + COVID-19 : [========================================] 98.6% |
| + Normal : [=] 0.9% |
| + Pneumonia : [=] 0.5% |
+-----------------------------------------------------------------------------------+
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng lâm sàng
- Sàng lọc phân luồng nhanh (Triage): Tại khoa cấp cứu hoặc các bệnh viện dã chiến, hệ thống tự động phân tích ảnh chụp X-quang ngực ngay khi bệnh nhân vừa chụp xong, cảnh báo sớm các ca nghi nhiễm COVID-19 hoặc viêm phổi nặng để cách ly và xử trí kịp thời.
- Hỗ trợ tuyến y tế cơ sở: Cung cấp công cụ chẩn đoán tương đương chuyên gia cho các trạm y tế vùng sâu, vùng xa nơi thiếu vắng bác sĩ chuyên khoa chẩn đoán hình ảnh.
Yêu cầu triển khai hệ thống
- Server môi trường Production:
- CPU: 4 Cores trở lên (Intel Xeon hoặc AMD EPYC).
- GPU: NVIDIA T4 / RTX 3060 (khuyến nghị tối thiểu 6GB VRAM phục vụ suy luận thời gian thực).
- RAM: Tối thiểu 8 GB.
- OS: Ubuntu Linux 20.04 LTS / Docker Container hóa mô hình.
- Client/End-user: Mọi thiết bị máy tính, máy tính bảng có trình duyệt web chuẩn (Chrome, Edge, Firefox) kết nối mạng nội bộ bệnh viện.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Dữ liệu nghiên cứu (5,545 ảnh) được tổng hợp từ nguồn mở Kaggle, dù đã tăng cường nhưng vẫn cần sự kiểm chứng trên tập dữ liệu lâm sàng thực tế đa trung tâm (Multi-center clinical trials).
- Mô hình phân loại toàn cục bức ảnh (Image-level label), chưa chỉ ra chính xác tọa độ vùng tổn thương (bounding box hoặc segmentation mask).
Hướng phát triển trong tương lai
- Tích hợp giải thích mô hình (Explainable AI - XAI): Triển khai kỹ thuật Grad-CAM (Gradient-weighted Class Activation Mapping) để tạo bản đồ nhiệt (Heatmap) trực quan hóa vùng tổn thương mà mạng nơ-ron dựa vào để ra quyết định.
- Thử nghiệm Transfer Learning: Áp dụng các mạng tiền huấn luyện chuyên sâu như DenseNet-121, ResNet-50, EfficientNet để đối sánh hiệu năng nâng cao.
- Chuẩn hóa giao thức Y tế: Mở rộng module tiếp nhận trực tiếp định dạng ảnh y khoa DICOM và kết nối giao thức PACS/HL7 với hệ thống thông tin bệnh viện (HIS/RIS).
Đối tượng hưởng lợi
CÁC ĐỐI TƯỢNG HƯỞNG LỢI
│
┌──────────────────┬─────────────┴────────────┬──────────────────┐
▼ ▼ ▼ ▼
[Sinh viên] [Kỹ sư / Dev] [Bệnh viện] [Nhà nghiên cứu]
Học liệu CNNs Pattern tối ưu Giảm 40-50% Baseline chuẩn
& Cross-Valid kiến trúc & BN thời gian đọc cho AI y tế
- Sinh viên ngành CNTT / Khoa học Dữ liệu: Nguồn tài liệu tham khảo chi tiết về toàn bộ vòng đời xây dựng dự án AI y tế, từ tiền xử lý ảnh, giải quyết mất cân bằng lớp đến kỹ thuật đánh giá 10-fold Stratified Cross-Validation.
- Kỹ sư Trí tuệ Nhân tạo / Lập trình viên: Nắm vững mẫu thiết kế kiến trúc giảm thiểu tham số tầng Fully Connected từ 11 triệu xuống 400 nghìn thông qua chuỗi khối Conv-BatchNorm-Pooling.
- Cơ sở y tế & Đội ngũ Y bác sĩ: Công cụ hỗ trợ giảm $40-50%$ thời gian đọc phim sàng lọc ban đầu, hạn chế sai sót chủ quan do mệt mỏi trong các ca trực căng thẳng.
- Cộng đồng nghiên cứu AI Y tế: Cung cấp bộ thông số thực nghiệm đối sánh rõ ràng giữa các thuật toán Machine Learning cổ điển và Deep Learning trên bài toán X-quang phổi.
Câu hỏi thường gặp
1. Hệ thống có yêu cầu máy trạm chuyên dụng đắt tiền để chạy suy luận (Inference) không?
Không. Mặc dù quá trình huấn luyện mô hình (Training) yêu cầu GPU rời như GTX 1660 hoặc tương đương, nhưng khi đã hoàn tất huấn luyện, mô hình CNNs2 đã được tối ưu hóa với kích thước chỉ khoảng vài chục Megabytes ($823,267$ tham số). Quá trình suy luận (Inference) cho một ảnh X-quang chỉ mất khoảng $50-100\text{ ms}$ trên CPU thông thường của máy tính văn phòng.
2. Làm thế nào để giải quyết tình trạng mất cân bằng dữ liệu giữa các nhóm bệnh?
Trong đồ án, số lượng ảnh nhãn Pneumonia ($1,345$ ảnh) thấp hơn nhãn Normal ($2,200$ ảnh). Nhóm tác giả đã áp dụng đồng thời hai giải pháp: kỹ thuật Data Augmentation (xoay, dịch chuyển biên độ $10%$, phóng to $20%$) tạo ra các biến thể đa dạng trong tập train, kết hợp phương pháp Stratified K-Fold để đảm bảo tỷ lệ các lớp luôn đồng nhất trong mọi tập fold kiểm thử.
3. Tại sao mô hình CNNs2 lại vượt trội hơn hẳn mô hình CNNs1?
Mô hình CNNs1 gặp nhược điểm chí mạng là kích thước bản đồ đặc trưng trước khi làm phẳng quá lớn ($26 \times 26 \times 128 = 86,528$), khiến lớp Dense kết nối tiêu tốn hơn 11 triệu tham số, dễ gây hiện tượng học vẹt (overfitting). CNNs2 bổ sung thêm 2 khối tích chập kết hợp BatchNormalization, ép kích thước đặc trưng xuống $5 \times 5 \times 128 = 3,200$, giúp giảm hơn $96%$ trọng số ở tầng Dense, vừa tăng tính chính quy hóa, vừa giúp mạng học sâu hơn các đặc trưng trừu tượng.
4. Hệ thống có thể tích hợp vào phần mềm quản lý bệnh viện hiện có không?
Có. Mô hình có thể dễ dàng đóng gói dưới dạng RESTful API thông qua các framework như Flask, FastAPI hoặc Docker Container. Bất kỳ phần mềm quản lý bệnh viện (HIS/RIS) nào cũng có thể gửi yêu cầu HTTP POST chứa tệp ảnh X-quang và nhận kết quả phản hồi JSON chứa nhãn dự đoán cùng xác suất tương ứng.
5. Chi phí ước tính và thời gian hoàn vốn (ROI) khi triển khai giải pháp này là bao nhiêu?
Chi phí phần cứng máy chủ suy luận ban đầu rất thấp (khoảng dưới 20 triệu VNĐ cho một máy chủ GPU phổ thông hoặc sử dụng Cloud GPU trả theo lượng dùng). Với khả năng hỗ trợ đọc hàng trăm ca X-quang mỗi ngày và giảm thiểu tỷ lệ chẩn đoán sai sót, hệ thống mang lại giá trị vận hành và cải thiện chất lượng dịch vụ y tế rõ rệt ngay trong tháng đầu tiên đưa vào thử nghiệm.
Kết luận
Đồ án tốt nghiệp "Phân loại ảnh chụp X-quang phổi trong hỗ trợ chẩn đoán bệnh sử dụng học máy" của sinh viên Lê Trường Long (Học viện Công nghệ Bưu chính Viễn thông) đã giải quyết trọn vẹn và khoa học bài toán phân loại ảnh y tế đa lớp hỗ trợ phòng chống các bệnh đường hô hấp.
Các thành tựu cốt lõi đạt được:
- Xây dựng thành công kiến trúc Deep Learning CNNs2 tối ưu sâu gồm 5 khối tích chập tích hợp
BatchNormalization và Dropout, tinh giản số tham số từ $11.36$ triệu xuống chỉ còn $823,267$ tham số.
- Đạt độ chính xác trung bình vượt trội $96.4%$ và điểm F1-Score $0.961$ thông qua quy trình đánh giá chuẩn mực 10-Fold Stratified Cross Validation.
- Hoàn thiện ứng dụng giao diện web demo trực quan, chứng minh tính khả thi cao trong triển khai thực tiễn tại các cơ sở y tế.
Hệ thống mở ra hướng tiếp cận giàu tiềm năng cho việc ứng dụng Trí tuệ nhân tạo vào y tế số, góp phần nâng cao năng lực chẩn đoán và giảm tải áp lực cho đội ngũ y bác sĩ trong tương lai. Bạn có thể tham khảo, thử nghiệm và đóng góp mở rộng kiến trúc mô hình với các kỹ thuật Explainable AI (Grad-CAM) hoặc liên kết định dạng DICOM để đưa giải pháp tiến gần hơn tới môi trường bệnh viện thực tế!