1. Thông tin về bài báo khoa học
- Tiêu đề: CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fusion
- Tác giả/Nhóm nghiên cứu: Zixiang Zhao, Haowen Bai, Jiangshe Zhang, Yulun Zhang và cộng sự
- Nơi công bố: CVPR 2023
- Đường dẫn bài báo: Kho lưu trữ mở của CVPR 2023
2. Nguồn mã nguồn
- Repository chính thức: GitHub - Zhaozixiang1228/MMIF-CDDFuse
3. Cấu hình môi trường và hệ thống
- Hệ điều hành: Ubuntu 20.04.4 (kiến trúc x86_64) trên máy chủ Linux
- Công cụ hỗ trợ: XShell / Xftp (truyền tệp lên máy chủ)
- Phiên bản Python: 3.8.10
- Framework học sâu: PyTorch 1.10.0 + CUDA 11.1
- Phiên bản GCC: 7.5.0 (từ Ubuntu 7.5.0-6ubuntu2)
- Cấu hình máy chủ:
- RAM: 62GB
- Ổ đĩa hệ thống: 7.3TB (đã dùng 1.4TB, còn 5.5TB)
- Ổ dữ liệu: 7.3TB (đã dùng 3.9TB, còn 3.1TB)
- GPU: 3 x NVIDIA GeForce GTX 1080 Ti, mỗi card 11GB VRAM
- Driver GPU: 550.67
- Compute Capability: 6.1
4. Quy trình tái hiện
4.1 Chuẩn bị mã nguồn
4.1.1 Tải mã nguồn
Sử dụng lệnh git clone vào thư mục gốc:
git clone https://github.com/Zhaozixiang1228/MMIF-CDDFuse.git
cd MMIF-CDDFuse
4.1.2 Điều chỉnh mã nguồn
4.1.2.1 Tệp requirements.txt
Xóa dòng torch trong tệp requirements.txt vì sẽ cài đặt riêng phiên bản phù hợp.
4.1.2.2 Tệp dataprocessing.py
Sửa các dòng 50-54 trong tệp dataprocessing.py như sau:
# Kiểm tra và tạo thư mục data
data_dir = 'data'
if not os.path.exists(data_dir):
os.makedirs(data_dir)
# Sửa đường dẫn tệp
h5_file_path = os.path.join(data_dir, data_name+'_imgsize_'+str(img_size)+"_stride_"+str(stride)+'.h5')
h5f = h5py.File(h5_file_path, 'w')
# h5_ir = h5f.create_group('ir_patchs')
# h5_vis = h5f.create_group('vis_patchs')
# Kiểm tra nhóm đã tồn tại hay chưa
if 'ir_patchs' not in h5f:
h5_ir = h5f.create_group('ir_patchs')
else:
h5_ir = h5f['ir_patchs']
if 'vis_patchs' not in h5f:
h5_vis = h5f.create_group('vis_patchs')
else:
h5_vis = h5f['vis_patchs']
4.1.2.3 Tệp utils/img_read_save.py
Chuyển đổi kiểu dữ liệu ảnh sang uint8 trước khi lưu để tránh lỗi:
def img_save(image, imagename, savepath):
if not os.path.exists(savepath):
os.makedirs(savepath)
# Chuyển đổi sang uint8
image = (image * 255).astype(np.uint8)
# Lưu ảnh xám
imsave(os.path.join(savepath, "{}.png".format(imagename)), image)
Dòng image = (image * 255).astype(np.uint8) chuyển dữ liệu từ kiểu float trong khoảng [0,1] sang uint8 [0,255] để hàm imsave xử lý chính xác.
4.2 Cấu hình môi trường
4.2.1 Chọn phiên bản CUDA phù hợp
Dựa trên requirements.txt, dự án yêu cầu CUDA 11.1. Chỉnh sửa tệp .bashrc để sử dụng CUDA 11.1 (tham khảo hướng dẫn thêm biến môi trường CUDA).
4.2.2 Tạo môi trường ảo
conda create -n cddfuse python=3.8.10
conda activate cddfuse
4.2.3 Cài đặt PyTorch
Sử dụng lệnh sau:
pip install torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
Có thể tra cứu phiên bản tương thích với CUDA của bạn tại PyTorch Previous Versions.
4.2.4 Cài đặt các thư viện khác
pip install -r requirements.txt
4.3 Chuẩn bị dữ liệu
Tải bộ dữ liệu MSRS tại đây: MSRS. Sao chép các thư mục trong thư mục MSRS/train vào thư mục MSRS_train trong dự án.
4.4 Tiền xử lý dữ liệu (tùy chọn)
Chạy lệnh:
python dataprocessing.py
Dữ liệu huấn luyện sau xử lý được lưu trong thư mục data với tên MSRS_train_imgsize_128_stride_200.h5.
4.5 Huấn luyện mô hình (tùy chọn)
Chạy lệnh:
python train.py
Mô hình sau huấn luyện được lưu trong thư mục models với tên CDDFuse_ngày-giờ.pth. Lưu ý: Khi giảm batch_size xuống 3 và tắt tính gradient một phần, quá trình huấn luyện mất khoảng 2 ngày.
4.6 Kiểm thử
4.6.1 Chạy kiểm thử
Chạy python test_IVF.py và python test_MIF.py để nhận kết quả.
4.6.2 Ý nghĩa các chỉ số đánh giá
| Chỉ số | Tên đầy đủ | Ý nghĩa | Giá trị lý tưởng |
|---|---|---|---|
| EN | Entropy (Entropy) | Đo lường lượng thông tin trong ảnh; giá trị cao hơn cho thấy ảnh hợp nhất giàu thông tin hơn. | Cao (>7) |
| SD | Standard Deviation (Độ lệch chuẩn) | Phản ánh mức độ phân tán của giá trị pixel; giá trị cao hơn cho thấy độ tương phản cao hơn, chi tiết rõ hơn. | Cao (10-20) |
| SF | Spatial Frequency (Tần số không gian) | Đo lường mức độ hoạt động của chi tiết không gian; giá trị cao hơn cho thấy kết cấu và cạnh được bảo toàn tốt hơn. | Cao (>20) |
| MI | Mutual Information (Thông tin tương hỗ) | Biểu thị mức độ chia sẻ thông tin giữa ảnh hợp nhất và ảnh gốc; giá trị cao hơn cho thấy ảnh hợp nhất giữ lại nhiều thông tin từ ảnh gốc. | Cao (>3) |
| SCD | Sum of Correlation Differences (Tổng khác biệt tương quan) | Đo lường sự khác biệt về tương quan giữa ảnh hợp nhất và ảnh gốc; giá trị thấp hơn cho thấy kết quả hợp nhất tự nhiên hơn. | Thấp [0-1] (<0.1) |
| VIF | Visual Information Fidelity (Độ trung thực thông tin thị giác) | Đánh giá chất lượng hình ảnh; giá trị cao hơn cho thấy ít méo mó hơn, hiệu ứng thị giác tốt hơn. | Cao [0-1] (>0.7) |
| Qabf | Edge-based Quality Metric (Chỉ số chất lượng dựa trên cạnh) | Đo lường mức độ bảo toàn thông tin cạnh; giá trị cao hơn cho thấy cạnh rõ ràng hơn. | Cao [0-1] (>0.7) |
| SSIM | Structural Similarity (Độ tương đồng cấu trúc) | Đo lường sự tương đồng về cấu trúc giữa ảnh hợp nhất và ảnh gốc; giá trị càng gần 1 càng tốt. | Cao [0-1] (>0.7) |
4.6.3 Phân tích kết quả kiểm thử
4.6.3.1 Hợp nhất ảnh hồng ngoại-khả kiến (IVF)
(1) Giá trị MI, VIF, Qabf, SSIM rất thấp:
- MI gần 0: Ảnh hợp nhất hầu như không giữ lại thông tin hiệu quả từ ảnh gốc.
- VIF và Qabf rất thấp: Ảnh bị méo mó nghiêm trọng hoặc có nhiễu.
- SSIM gần 0: Sự khác biệt lớn về cấu trúc giữa ảnh hợp nhất và ảnh gốc.
(2) EN, SD, SF cao nhưng không có ý nghĩa:
- Entropy (EN) và tần số không gian (SF) cao có thể do nhiễu (ví dụ: nhiễu "tuyết") gây ra, không phải thông tin hữu ích.
(3) SCD thấp:
- Mặc dù phù hợp với hướng lý tưởng (SCD thấp biểu thị sự tự nhiên), nhưng khi các chỉ số khác bất thường, có thể nhiễu đã che giấu sự khác biệt tương quan thực sự.
4.6.3.2 Hợp nhất ảnh y tế (MIF)
(1) MI và SSIM rất thấp:
- MI phổ biến trong khoảng 1.0-1.5 (giá trị lý tưởng cao hơn nhiều), SSIM gần 0: Ảnh hợp nhất hầu như không giữ lại thông tin từ ảnh gốc, cấu trúc bị biến dạng hoàn toàn.
(2) SCD bất thường:
- CDDFuse_MIF trên MRI-SPECT có SCD = -0.08. Lý thuyết SCD phải không âm; giá trị âm có thể do lỗi tính toán hoặc đầu ra mô hình sai lệch nghiêm trọng.
(3) VIF và Qabf thấp:
- VIF ≤ 0.06, Qabf ≤ 0.1: Ảnh hợp nhất bị nhiễu nặng hoặc mờ, chất lượng thị giác kém.
(4) EN, SD, SF cao gây hiểu lầm:
- EN và SF cao có thể do nhiễu (ví dụ: nhiễu "tuyết") thay vì tăng cường thông tin hữu ích. Nhiễu làm tăng entropy nhưng phá hủy nội dung thực tế.
5. Các vấn đề gặp phải
5.1 Lỗi "normal site-packages is not writeable"
Thêm dòng sau vào tệp .bashrc để giải quyết:
export PIP_REQUIRE_VIRTUALENV=false
5.2 Lỗi định dạng tệp pip.conf
Đảm bảo không có ký tự `#` trước các section header như [global], [install] trong tệp pip.conf.
5.3 Lỗi khi cài đặt gói Python
Khi chạy python dataprocessing.py, cài đặt các gói còn thiếu theo thông báo lỗi.
5.4 Lỗi FileNotFoundError
Khi xử lý dữ liệu, xem lại cấu hình đường dẫn và tên nhóm như mô tả ở mục 4.1.2.2.
5.5 Lỗi thiếu bộ nhớ GPU
Lỗi: RuntimeError: CUDA out of memory.
Giải pháp:
- Tắt tính gradient một phần: Sửa các dòng 127-130 và 153-154 trong train.py:
# Dòng 127-130:
with torch.no_grad():
mse_loss_V = 5 * Loss_ssim(data_VIS, data_VIS_hat) + MSELoss(data_VIS, data_VIS_hat)
mse_loss_I = 5 * Loss_ssim(data_IR, data_IR_hat) + MSELoss(data_IR, data_IR_hat)
Gradient_loss = L1Loss(kornia.filters.SpatialGradient()(data_VIS),
kornia.filters.SpatialGradient()(data_VIS_hat))
# Dòng 153-154:
with torch.no_grad():
mse_loss_V = 5*Loss_ssim(data_VIS, data_Fuse) + MSELoss(data_VIS, data_Fuse)
mse_loss_I = 5*Loss_ssim(data_IR, data_Fuse) + MSELoss(data_IR, data_Fuse)
- Giảm batch_size: Sửa dòng 41 trong train.py:
# Trước khi sửa
batch_size = 8
# Sau khi sửa (giảm xuống 3 để chạy thành công)
batch_size = 3
5.6 Lỗi "OSError: cannot write mode F as PNG"
Giải pháp đã được mô tả trong Issues của repository (xem mục 4.1.2.3).