[MR 연구] fastMRI & skm-tea
[fastMRI Dataset] [fastMRI Github] [skm-tea Dataset] [skm-tea Github]
fastMRI_knee_unfolded –> keys [‘ismrmrd_header’, ‘kspace’, ‘reconstruction_rss’]
import h5py file_path = "/mai_nas/GH/fastMRI_knee_unfolded/val/multicoil_val/file1000000.h5" with h5py.File(file_path, 'r') as h5_file: print(h5_file.keys()) kspace = h5_file['kspace'] reconstruction_rss = h5_file['reconstruction_rss']
kspace shape: (35, 15, 640, 368) –> slices:35, maps:15, H:640, W:368 need to crop to 320, 320
reconstruction_rss shape: (35, 320, 320) –> slices:35, H:320, W:320
skm-tea –> keys [‘kspace’, ‘maps’, ‘masks’, ‘target’]
import h5py file_path = "/mai_nas/yj/Data/skm-tea/v1-release/files_recon_calib-24/MTR_001.h5" with h5py.File(file_path, 'r') as h5_file: print(h5_file.keys()) kspace = h5_file['kspace'] maps = h5_file['maps'] target = h5_file['target']
kspace shape: (512, 512, 160, 2, 16) # H:512, W:512, D:160, T1 or T2: 2, maps:16
target(=MR image) shape: (512, 512, 160, 2, 1) # H:512, W:512, D:160, T1 or T2: 2, channel:1
maps shape: (512, 512, 160, 16, 1) # H:512, W:512, D:160, maps:16, channel:1
Real Data path (.h5)
fastMRI_knee_unfolded: /mai_nas/GH/fastMRI_knee_unfolded/val/multicoil_val --> file1000000.h5, ...
skm-tea: /mai_nas/yj/Data/skm-tea/v1-release/files_recon_calib-24--> MTR_001.h5, ...
Real, Simul의 npy shape은 다음과 같이 만들어주었음!
fastMRI kspace shape: (15, 320, 320) : (# of coilmap, H, W)
skm-tea kspace shape: (512, 160, 8) : (H, W, # of coilmap)
Real Data path (.npy)
fastMRI_knee_unfolded: /mnt/KHS/Data/fastMRI_knee_unfolded/val2d_10/multicoil_val/real_kspace/file1000000 --> 000.npy, 001.npy, ...
skm-tea: /mnt/KHS/Data/skm-tea/v1-release/val_axial/multicoil_val/real_kspace/MTR_001 --> 000.npy, 001.npy, ...
Simulation Data Path (.npy)
fasMRI_knee_unfolded: /mnt/KHS/Data/fastMRI_knee_unfolded/val2d_10/multicoil_val --> simul_kspace, map, mask : .npy
- simul_kspace_v1 (subject별 3~4개씩 하여 slice 100장 추출)
skm-tea: /mnt/KHS/Data/skm-tea/v1-release/val_axial/multicoil_val --> simul_kspace, map, mask : .npy
- simul_kspace_v1 (subject별 3~4개씩 하여 slice 100장 추출)
fastMRI 320x320 crop 주의할 점 (kspace에서 crop하면 안됩니다!)
fastMRI는 Real Data h5에서 kspace에서 320x320으로 crop하여 npy로 저장하여 사용하면, high frequency 정보가 날아가고 low resolution이 되버리기 때문에 찌그러진 영상이 나옵니다.
fastMRI에서 320x320 crop하여 실제 데이터를 만든 전체 과정은 다음과 같습니다.
찌그러진 영상이 나오므로 위처럼 kspace에서 crop하는 것은 지양합시다.
따라서 kspace를 crop하지 말고 image domain으로 바꾸고 image domain에서 320x320 center crop을 한 다음, 320x320 crop된 image에 대해 BART로 estimate한 coilmap 정보로 320x320 kspace로 만들어줍니다. (이는 coilmap을 BART로 추정한 것을 사용하여 kspace를 만들어냈으므로 simulation data가 됩니다.)
kspace normalization은 image domain 정보로 간접적으로 해주어야 합니다.
kspace간의 geometry정보가 비율적으로 분포하기 때문에 kspace 각각을 norm하면 geometry정보가 깨집니다.
따라서 kspace들을 combine한 이미지 domain에서 max(img)값으로 각각의 kspace를 간접적으로 나눠주어 kspace normalization을 해줘야합니다.
kspace normalization (for Real data)
- multi coil kspace -> ifft -> img
- multi coil kspace / max(img)
fastMRI Simulation Data를 만든 방법은 아래와 같습니다.
fastMRI Real k-space data는 640x368이 대부분이지만 640x372와 같이 H,W가 살짝 다른 데이터가 존재합니다.
이를 실제 학습하는 과정에서는 어떠한 방식으로 처리하는지 알아봅시다.
1) image domain에서 loss를 구하는 경우: fastMRI Real k-space를 그대로 사용하고 image domain에서 center crop (320x320)에서 loss(L1,L2,MSE 등)을 구합니다.
2) k-space domain에서 loss를 구하는 경우: fastMRI Real k-space를 그대로 사용하고 k-space domain에서 전체 k-space shape (640x368 or 640x372 등)에 대한 loss를 구합니다. 그러나 k-space는 noisy하기 때문에 k-space domain 상에서 SSIM loss와 같은 것을 주면 잘 안됩니다. 보통 k-space domain에서 loss를 주는 경우는 추가적인 condition으로 주는 정도이고, 실제 loss 계산은 image domain에서 하는 것이 일반적입니다. 즉, 2)와 같은 경우로 학습하는 경우는 사례를 본적은 없습니다. –> k-space에서 loss를 구하기 때문에 굳이 resize, crop 필요없습니다.
Reconstruction 성능을 평가할 시에는 1), 2) 방법 모두 image domain에서 center crop (320x320)에서 PSNR, SSIM을 평가합니다.
Leave a comment