TorchIO๋ 3D medical image์ loading, preprocessing, augmentation, patch-based sampling์ ์ํ ์คํ์์ค ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ค๋ช ์๋ 3D medical image๋ผ๊ณ ๋์ด ์์ง๋ง, ์ผ๋ฐ 3D ์ด๋ฏธ์ง์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
torchvision.transforms
์ transform ํจ์๋ค์ ๋๋ถ๋ถ 2D ์ด๋ฏธ์ง์๋ง ์ ์ฉ๊ฐ๋ฅํ ๋ฐ๋ฉด, TorchIO์์ ์ ๊ณตํ๋ transform ํจ์๋ค์ 3D ์ด๋ฏธ์ง์๋ ์ ์ฉ๊ฐ๋ฅํด์ 3D ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃจ๋ ์์
์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค.
Data loading, patch-based pipeline ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ์์ง๋ง ๋ณธ ๊ธ์์๋ TorchIO๋ฅผ ์ด์ฉํด augmentation ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ณ ์ ํ๋ค.
Install
pip๋ฅผ ์ด์ฉํด TorchIO๋ฅผ ์ค์นํ ์ ์๋ค. PyTorch๊ฐ ๋จผ์ ๊น๋ ค ์์ด์ผ ํ๋ค.
pip install torchio
Transform
Torchvision์ transform ํจ์์ ์ฌ์ฉ๋ฒ์ ๊ฑฐ์ ๋์ผํ๋ค.
๋ค์๊ณผ ๊ฐ์ด TorchIO์ transform์ ์ฌ์ฉํ ์ ์๋ค.
input์ผ๋ก๋ torchio.Subject
, torch.Tensor
, numpy.ndarray
๋ฅผ ๋ชจ๋ ์ง์ํ๋ค.
import torchio as tio
transform = tio.RandomAffine(scales=(1.2, 1.2), degrees=30, translation=10)
img_transform = transform(img)
๊ฐ์ฅ ๋ํ์ ์ธ transform ํจ์์ธ RandomAffine
์ parameter๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- scales : scaling parameter. ๊ฐ dimension ๋ฐฉํฅ์ผ๋ก์ min, max ๊ฐ ํน์ ๋ณํ๋์ ์ง์ ํ๊ฑฐ๋ - $(min_1, max_1, min_2, max_2, min_3, max_3)$ or $(x_1, x_2, x_3)$, ๋ชจ๋ dimension์ min, max ๊ฐ ํน์ ๋ณํ๋์ ๊ฐ๊ฒ ์ง์ ํด์ค ์ ์๋ค - $(min, max)$ or $x$.
- degrees : rotation parameter. ๊ฐ๋ฅํ parameter ํ์์ scales์ ๋์ผํ๋ค.
- translation : translation parameter. ๊ฐ๋ฅํ parameter ํ์์ scales์ ๋์ผํ๋ค.
- isotropic : Scaling ์์ ์ด๋ฏธ์ง์ ๋น์จ์ ์ ์งํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
- center : Rotation๊ณผ scaling ์์ ์ด๋ค ์ ์ ์ค์ฌ์ผ๋ก ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. (
'image'
/'origin'
) - default_pad_value : Rotation์ด๋ translation ์์ ๋น ๊ณต๊ฐ์ ์ฑ์ธ ๊ฐ์ ๊ฒฐ์ ํ๋ค. (
'minimum'
/'mean'
/'otsu'
)
์ด์ธ์๋ RandomFlip
, RandomBlur
, RandomNoise
๋ฑ ๋ค์ํ transform์ ์ ๊ณตํ๋ค. TorchIO์ ๋ชจ๋ transform ํจ์๋ค์ ๋ค์์์ ํ์ธํ ์ ์๋ค.
Multiple transforms
torchvision.transforms.Compose
์ ๊ฐ์ด, ์ฌ๋ฌ ๊ฐ์ transform์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
torchio.Compose
๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ transform์ ํจ๊ป ์ด์ฉํ ์ ์๋ค.
torchio.Oneof
๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ transform ์ค ํ๋๋ฅผ randomํ๊ฒ ์ ์ฉํ๋๋ก ํ ์ ์๋ค.
Example:
import torchio as tio
colin = tio.datasets.Colin27()
transforms_dict = {
tio.RandomAffine(): 0.75,
tio.RandomElasticDeformation(): 0.25,
} # Using 3 and 1 as probabilities would have the same effect
transform = tio.OneOf(transforms_dict)
transformed = transform(colin)