Voriacare · Edge Cardiac-CT

Thuật toán & Filter đã áp dụng

Toàn bộ kỹ thuật xử lý ảnh / học máy / tối ưu trong pipeline EAT

Nguyên tắc: ML định vị vùng — phép tính deterministic ra số. Dưới đây là các thuật toán/filter theo từng giai đoạn, kèm mục đích & lý do chọn.

1Ingest & HU

Thuật toán / FilterThư việnMục đích & lý do
Modality LUT (Rescale Slope/Intercept)GDCM / SimpleITKChuyển pixel lưu trữ → HU thật. Điều kiện sống còn cho mọi phép đo mỡ.
Spatial sort theo ImagePositionPatient·normalGDCMXếp lát cắt đúng thứ tự không gian (không dựa InstanceNumber dễ sai).
Oracle cross-check (SimpleITK vs pydicom)pydicomKiểm chứng HU độc lập voxelwise → bắt bug "rescale không áp".
Debounce completenesswatchdogGom DICOM theo series, chờ đủ (folder không có tín hiệu "done").

2Silver labeling (tạo nhãn pericardium)

Thuật toán / FilterThư việnMục đích & lý do
TotalSegmentator (nnU-Net 3mm)TotalSegmentatorKhoanh whole-heart làm mốc localize.
Convex hull theo lát cắtskimage convex_hull_imageXấp xỉ khoang pericardium (lấp rãnh vành). → sinh rìa dư ở chỗ lõm
Dilation bằng Euclidean Distance Transformscipy distance_transform_edtNới ~3mm bắt lớp mỡ sát cơ tim. Thay dilation structuring-element (nhanh O(n), đúng mm — trước đó box 13×19×19 ngốn 3–4× thời gian/ca).
HU window [−190, −30]numpyNgưỡng mô mỡ (deterministic).

3Training — nnU-Net segmenter

Thuật toán / FilterThư việnMục đích & lý do
CTNormalization (clip p0.5–p99.5 + z-score)nnU-NetChuẩn hóa cường độ CT ổn định theo thống kê foreground.
Spline resampling (data order 3, seg order 1)nnU-NetĐưa về target spacing đồng nhất trước khi train/infer.
3D U-Net (PlainConvUNet) + deep supervisionnnU-NetKiến trúc segment; deep supervision ổn định hội tụ.
Data augmentation (xoay/scale/gamma/mirror…)batchgeneratorsChống overfit trên 200 ca.
Loss Dice + Cross-Entropy · LR poly-decaynnU-NetChuẩn segmentation; poly-decay khớp số epoch (250/100).
Sliding-window + Gaussian patch weightingnnU-NetGhép patch mượt, giảm sọc biên patch.
3d_lowres vs 3d_fullresnnU-NetĐánh đổi độ phân giải ↔ tốc độ inference (~3× nhanh hơn ở lowres).

4Tối ưu edge (TensorRT)

Thuật toán / FilterThư việnMục đích & lý do
ONNX export (opset 17)torch.onnxTrung gian chuẩn để build engine. Verify argmax vs torch 99.996%.
TensorRT FP16 quantizationTensorRT 10.4Engine nhanh, self-contained. Parity vs FP32: Dice 0.9997, ΔEAT <0.11 mL.
Tắt torch.compilennUNet_compile=0Triton không có wheel aarch64 → tắt để tránh crash train step.

5Post-processing — cleanup ROI (mới)

Thuật toán / FilterThư việnMục đích & lý do
Connected components 26-kề → giữ mảnh lớn nhấtscipy ndimage.labelBỏ island false-positive (mạch lớn tách rời). Ca 33: bỏ 78.9 mL ROI → EAT 92.7→82.6.
Binary fill holes (3D)scipy binary_fill_holesLấp hốc kín bên trong → ROI đặc, đo mỡ nhất quán.
remove_small_objectsskimageDọn đốm nhỏ khi consolidate mỡ.
Binary closing (consolidate mỡ)scipyGộp voxel mỡ gần nhau → mặt 3D mượt, bớt lỗ rỗ.
An toàn: keep-largest-CC chỉ tác động ca có island (33, 45, 76, 114); ca đã sạch (8, 75, 91, 154) không đổi. EAT giảm trung bình 2.5 mL.

6Trực quan hóa 3D

Thuật toán / FilterThư việnMục đích & lý do
Gaussian smoothing (pre-marching-cubes)scipy gaussian_filterLàm mượt mask nhị phân → mặt cong mịn (kiểu 3D Slicer).
Marching Cubesskimage marching_cubesDựng lưới bề mặt (isosurface) từ mask.
Downsample bbox (STEP=4)numpyGiảm ~15× tam giác → render nhanh (~1.8 phút/ca) mà vẫn mịn.
Lambertian shading (normal·light)matplotlib LightSourceĐổ bóng theo pháp tuyến mặt → chiều sâu, dễ nhìn.

7Deterministic measure

Thuật toán / FilterThư việnMục đích & lý do
Voxel counting × thể tích voxelnumpyEAT (mL) = |voxel mỡ trong ROI| × spacing. Hoàn toàn audit được.
Bland-Altman · DicenumpyHarness chấm điểm: sai số mL & độ trùng vùng.