fastMRI๋ Facebook AI์ NYU Langone Health๊ฐ 2018๋ ๊ณต๊ฐํ MRI reconstruction์ ์ํ ๋ฐ์ดํฐ์ ์ด๋ค.
- ๊ณต์ ์ฌ์ดํธ: ๋ฐ์ดํฐ์ ๊ฐ์์ file description, ๋ฆฌ๋๋ณด๋๋ฅผ ํ์ธํ ์ ์๋ค.
- ๋ฐ์ดํฐ์ ๋ค์ด๋ก๋: ๋ฐ์ดํฐ์ ์ ๋ํ ๋ณด๋ค ์์ธํ ์ค๋ช ์ ํ์ธํ๊ณ ๋ฐ์ดํฐ์ ์ ๋ค์ด๋ก๋ํ ์ ์๋ค.
- ๊ณต์ Github repo: PyTorch ๋ฐ์ดํฐ๋ก๋, ๋ชจ๋ธ ๋ฑ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ค.
- Paper: ๋ฐ์ดํฐ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ดฌ์ ํ๋ผ๋ฏธํฐ ๋ฑ ๋ฐ์ดํฐ์ ์ ๋ํ ์์ธํ ์ค๋ช ์ ํ์ธํ ์ ์๋ค.
1. ๋ฐ์ดํฐ์ ๊ตฌ์ฑ
๋ฐ์ดํฐ์ ์ ์ข ๋ฅ๋ ๋ค์ฏ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๋ณด๋ค ์์ธํ ์ค๋ช ์ Paper์์ ํ์ธํ ์ ์๋ค.
- Single-coil knee: 1594 scans (PD, PDFS)
- Multi-coil knee: 1594 scans (PD, PDFS)
- Multi-coil brain: 6970 scans (T1, T1 POST, T2, FLAIR)
- knee DICOM: 10000 scans (PD COR, PDFS COR, PD SAG, T2FS SAG, T2FS AXI)
- brain DICOM: 10000 scans (T1 AXI, T2 AXI, T2 FLAIR AXI)
์ด ์ค single-coil knee ๋ฐ์ดํฐ์ ์ multi-coil knee ๋ฐ์ดํฐ์ ์์ ํฉ์ฑ๋ ๋ฐ์ดํฐ์ ์ด๋ค (Emulated single-coil, ESC)).
knee/brain DICOM ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ multi-coil knee/brain ๋ฐ์ดํฐ ๋ณด๋ค ๊ฐฏ์๊ฐ ํจ์ฌ ๋ง๊ณ , ๋ค์ํ scanner์ sequence๊ฐ ํฌํจ๋์ด ์๋ค.
๋ฐ์ดํฐ์ ์ ๋ถํฌ์ ์์ ์ฌ์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
2. ๋ฐ์ดํฐ์ ์ฌ์ฉ ์ ์ฒญ
๋ฐ์ดํฐ์ ๋ค์ด๋ก๋๋ฅผ ์ํด์๋ ๋ฐ์ดํฐ์ ๋ค์ด๋ก๋ ๋งํฌ์ ๋ค์ด๊ฐ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ ์ ์ฒญ์ ํด์ผ ํ๋ค.
๋งจ ์๋๋ก ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํผ์ ํ์ธํ ์ ์๋ค.
์ด๋ฆ, ์ด๋ฉ์ผ, ๊ต์ก๊ธฐ๊ด (์์ ํ๊ต) ์ ๋ณด๋ฅผ ์ ๋ ฅํ๊ณ , Submit ๋ฒํผ์ ๋๋ฅด๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก fastMRI ๋ฐ์ดํฐ์ ์ ๊ต์ก/์ฐ๊ตฌ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
์ธ์ ์ฌํญ์ ์ ์ถํ๋ฉด ์ ๋ ฅํ ์ด๋ฉ์ผ ์ฃผ์๋ก ๋ฐ๋ก ๋ฉ์ผ์ด ๋ฐ์ก๋๋ค.
์์ ์ค๋ช ํ 5๊ฐ์ง์ ๋ฐ์ดํฐ์ ์ train/val/test set์ ๊ฐ๊ฐ ๋ค์ด๋ก๋ ํ ์ ์๋ ๋งํฌ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ถ์ฌ๋ ๋งํฌ๋ฅผ ํตํด ์ต๋ 90์ผ๊น์ง ๋ค์ด๋ก๋ํ ์ ์๋ค.
๋ฉ์ผ์๋ curl์ ์ด์ฉํ ๋ค์ด๋ก๋๋ฅผ ์ถ์ฒํ๊ณ ์์ง๋ง, ๋์ ๊ฒฝ์ฐ curl์ ์ด์ฉํด ๋ค์ด๋ก๋ํ๋ฉด connection reset error์ด ๋ ์ ๋ค์ด๋ก๋๊ฐ ์ค๊ฐ์ ๋๊ฒผ๋ค.
๊ทธ๋์ wget์ ์ด์ฉํด ๋ค์ด๋ก๋ ํ๋ค. (์ค๊ฐ์ ๋๊ธฐ๊ธด ํ์ง๋ง ์๋์ผ๋ก ๋ค์ ์ฐ๊ฒฐ๋จ)
wget "[URL]" -O [output_filename]
+) wget ์ฌ์ฐ๊ฒฐ ํ์์ default ๊ฐ์ 20์ธ๋ฐ 20๋ฒ ๋๊ฒ ๋๊ฒผ๋ค.. ๋๊ธด ์ฐ๊ฒฐ์ -c
option์ผ๋ก ๋ค์ ์ฐ๊ฒฐํ ์ ์๊ณ , ์ฌ์ฐ๊ฒฐ ํ์ ์ ํ์ ๋๋ฆฌ๋ ค๋ฉด --tries
option์ผ๋ก ๋๋ฆด ์ ์๋ค.
wget -c --tries=100 "[URL]" -O [output_filename]
์๊ฐ์ ํ๋์ ๊ฑธ๋ฆฐ๋ค (๋ด ๊ฒฝ์ฐ๋ 192G muilticoil knee val ๊ธฐ์ค 12์๊ฐ ์ ๋ ๊ฑธ๋ ธ์)..
3. ํ์ผ ๊ตฌ์ฑ
๊ฐ ๋ฐ์ดํฐ์ ์ train/val/test set์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ tar.gz๋ก ์์ถ๋์ด ์์ผ๋ฉฐ, ์์ถ์ ํ๋ฉด ๋ค์ ํ์ผ๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค. Test ๋ฐ์ดํฐ์ ์ ๊ฒฝ์ฐ๋ ground truth ๋ฐ์ดํฐ๊ฐ ์ ๊ณต๋์ง ์๋๋ค.
- Multi-coil train/val (brain/knee)
kspace
: multi-coil k-space ๋ฐ์ดํฐ์ด๋ค (#slices, #coils, height, width).reconstruction_rss
: root-sum-of-squares๋ก reconstructionํ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ด๋ค (#slices, r_height, r_width). knee ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ 320x320์ผ๋ก crop๋์ด ์๋ค.
- Multi-coil test (brain/knee)
kspace
: undersample๋ multi-coil k-space ๋ฐ์ดํฐ์ด๋ค (#slices, #coils, height, width).mask
: undersampling mask์ด๋ค. Mask tensor์ element ๊ฐ์๋ k-space ๋ฐ์ดํฐ์ width์ ๊ฐ๋ค.
- Single-coil train/val (knee)
kspace
: ํฉ์ฑ๋ single-coil k-space ๋ฐ์ดํฐ์ด๋ค (#slices, height, width).reconstruction_rss
: multi-coil k-space ๋ฐ์ดํฐ์์ root-sum-of-squares๋ก reconstructionํ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ด๋ค (#slices, 320, 320).reconstruction_esc
: ํฉ์ฑ๋ single-coil k-space ๋ฐ์ดํฐ๋ฅผ 320x320 ํฌ๊ธฐ๋ก crop ํ inverse Fourier transform์ ํ reconstruction ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ด๋ค (#slices, 320, 320).
- Single-coil test (knee)
kspace
: undersample๋ ํฉ์ฑ๋ single-coil k-space ๋ฐ์ดํฐ์ด๋ค (#slices, height, width).mask
: undersampling mask์ด๋ค. Mask tensor์ element ๊ฐ์๋ k-space ๋ฐ์ดํฐ์ width์ ๊ฐ๋ค.
4. ์์ถ ํ๊ธฐ
๋ค์ด๋ก๋๊ฐ ๋๋ฌ์ผ๋ฉด ๋ค์ ๋ช ๋ น์ด๋ก ์์ถ์ ํด์ ํ๋ค.
*tar -zxvf๊ฐ ์๋๋ผ tar -xvf๋ก ์์ถํด์ (์ฐธ๊ณ : tar.gz ์์ถ ํด์ ์ not in gzip ์๋ฌ)
tar -xvf [dataset.tar.gz]
์์ถ์ ํด์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ h5 ํ์ผ์ ํ์ธํ ์ ์๋ค.
5. Tutorial
์ฌ๊ธฐ๋ถํฐ๋ fastMRI ๋ฐ์ดํฐ์ ์ ๊ฐ๋จํ ํํ ๋ฆฌ์ผ์ ๋ค๋ฃฌ๋ค. ํํ ๋ฆฌ์ผ์ ๊ณต์ Github repo์์๋ ํ์ธํ ์ ์๋ค.
1) ํ์ผ ํ์ธํ๊ธฐ
import os
data_dir = 'path/to/fastMRI_data/multicoil_val'
fnames = os.listdir(data_dir)
print(len(fnames))
>> 199
- ๋ฐ์ดํฐ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ ํ์ผ์ ํ์ธํ๋ค. knee multicoil val ๋ฐ์ดํฐ์ ์ ๊ฒฝ์ฐ 199๊ฐ์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
2) h5 ํ์ผ ์ฝ์ด์ค๊ณ key์ attribute ํ์ธํ๊ธฐ
import h5py
hf = h5py.File(os.path.join(data_dir, fnames[0]))
print(list(hf.keys()))
print(list(hf.attrs))
>> ['ismrmrd_header', 'kspace', 'reconstruction_rss']
>> ['acquisition', 'max', 'norm', 'patient_id']
- ๊ฐ๊ฐ์ ํ์ผ์ h5 ํฌ๋งท์ผ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ h5py ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์ฝ์ด์ฌ ์ ์๋ค.
- ์ฐธ๊ณ : hdf5 ์๊ฐ, h5py ์ฌ์ฉ๋ฒ ์ ๋ฆฌ
3) Attribute์ ๋ฐ์ดํฐ ์ฝ์ด์ค๊ธฐ
print(hf.attrs['max'], hf.attrs['norm'])
>> 0.000260911257462176 0.06668415659382805
volume_kspace = hf['kspace'][()]
print(volume_kspace.dtype)
print(volume_kspace.shape)
>> complex64
>> (40, 15, 640, 368)
- Attribute๋ hf.attrs[key]์ ๊ฐ์ด ์ฝ์ ์ ์๊ณ ,
- ๋ฐ์ดํฐ๋ hf.[key]์ ๊ฐ์ด ์ฝ์ ์ ์๋ค.
4) k-space ์๊ฐํ
import numpy as np
import matplotlib.pyplot as plt
def show_coils(data, slice_nums, cmap=None):
fig = plt.figure()
for i, num in enumerate(slice_nums):
plt.subplot(1, len(slice_nums), i+1)
plt.imshow(data[num], cmap=cmap)
show_coils(np.log(np.abs(volume_kspace[20]) + 1e-9), [0, 5, 10]) # This shows coils 0, 5, 10
- ๊ฐ coil ๋ฐ์ดํฐ๋ฅผ log scale๋ก ์๊ฐํํ๋ฉด ์์ ๊ฐ๋ค.
- Multi-coil k-space ๋ฐ์ดํฐ๋ (num_slice, num_coils, height, width) ์ ํํ๋ฅผ ๋๊ณ ์๋ค.
5) image ์๊ฐํ
def ifft2(img, norm='ortho'):
return np.fft.fftshift(np.fft.ifft2(np.fft.ifftshift(img), norm=norm))
show_coils(np.abs(ifft2(volume_kspace[20])), [0, 5, 10], cmap='gray')
- ๊ฐ coil ๋ฐ์ดํฐ์ ifft๋ฅผ ์ ์ฉํด image domain์ผ๋ก ๋ณํํ๋ฉด ์์ ๊ฐ๋ค.
- ifft ์ฝ๋๋ fastMRI Github repo์์ ํ์ธํ ์ ์๋ค.
volume_rss = hf['reconstruction_rss'][()]
print(volume_rss.dtype)
print(volume_rss.shape)
>> float32
>> (40, 320, 320)
plt.imshow(volume_rss[20], cmap='gray')
- ์ฝ์ผ ์ด๋ฏธ์ง๋ค์ ๋ชจ๋ ํฉ์ณ ๋ง๋ ์ด๋ฏธ์ง๋ reconstruction_rss๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ๋์ด ์๋ค.
- ํฌ๊ธฐ๋ (num_slice, r_height, r_width)์ด๋ฉฐ, knee ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ r_height = r_width = 320์ผ๋ก crop๋์ด ์๋ค.
'๐ Deep Learning > Dataset' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dataset] People-Art ๋ฐ์ดํฐ์ (0) | 2021.01.11 |
---|---|
[Dataset] PASCAL VOC 2012 Segmentation ๋ฐ์ดํฐ์ ๋ค์ด๋ก๋ ๋ฐ ์ฌ์ฉ๋ฒ (0) | 2020.12.23 |