【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

Registration-free Distortion Correction of Diffusion Weighted MRI ~Synb0-DisCoの実装~

f:id:AIProgrammer:20200420143812p:plain

目的

  1. 2種類のPhase Encodingを撮像していないDiffusion dataであってもFSLのTOPUPのように歪み補正(distortion correction)
  2. 1.を実現するためにSynb0-DisCoを実装

参考文献はこちら

前準備

環境構築

実装には、DockerあるいはSingularityのいずれかをインストールしている必要があります。

  • Dockerのインストールは、こちら

  • Singularityのインストールは、こちら

フォルダ構造

Synb0-DisCoで必要なのは以下のファイルです。

  • T1WI (T1.nii.gz)
  • DWIのb=0の画像 (b0.nii.gz)
  • FreeSurferのライセンス (license.txt)
  • TOPUPの時に用いるDWI撮像時の撮像パラメータ (acqparams.txt)

※acqparams.txtの記載方法は、こちら

Synb0-DisCoを実行する前に、以下のようなフォルダ構造にしておきます。

.
├── INPUTS
│   ├── T1.nii.gz
│   ├── acqparams.txt
│   └── b0.nii.gz
├── OUTPUTS
└── license.txt

詳しい説明は、以下。

INPUTS directory must contain the following: b0.nii.gz, T1.nii.gz, and acqparams.txt

b0.nii.gz includes the non-diffusion weighted image(s). T1.nii.gz is the T1-weighted image. acqparams.txt describes the acqusition parameters, and is described in detail on the FslWiki for topup (https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/topup).Briefly, it describes the direction of distortion and tells TOPUP that the synthesized image has an effective echo spacing of 0 (infinite bandwidth). An example acqparams.txt is displayed below, in which distortion is in the second dimension, note that the second row corresponds to the synthesized, undistorted, b0: $ cat acqparams.txt 0 1 0 0.062 0 1 0 0.000

Dockerを使用する場合

Dockerイメージのダウンロード

Synb0-DisCoのREADME.mdにあるDocker Hubを開く。

今回は、latestバージョンをダウンロードする。 f:id:AIProgrammer:20200418173325p:plain

ダウンロードには、以下のコマンドを実行。 12GBほどダウンロードすることになる。

$ sudo  docker pull justinblaber/synb0_25iso:latest

Synb0-DisCoの実行

sudo docker run --rm \
-v $(pwd)/INPUTS/:/INPUTS/ \
-v $(pwd)/OUTPUTS:/OUTPUTS/ \
-v $(pwd)/license.txt:/extra/freesurfer/license.txt \
--user $(id -u):$(id -g) \
justinblaber/synb0_25iso

詳しくは、以下。

sudo docker run --rm \ -v $(pwd)/INPUTS/:/INPUTS/ \ -v $(pwd)/OUTPUTS:/OUTPUTS/ \ -v :/extra/freesurfer/license.txt \ --user $(id -u):$(id -g) \ justinblaber/synb0_25iso

See INPUTS/OUTPUTS sections below. In short, if within your current directory you have your INPUTS and OUTPUTS folder, you can run this command copy/paste with the only change being should point to freesurfer licesnse.txt file on your system.

If INPUTS and OUTPUTS are not within your current directory, you will need to change $(pwd)/INPUTS/ to the full path to your input directory, and similarly for OUTPUTS.

For Mac users, Docker defaults allows only 2gb of RAM and 2 cores - we suggest giving Docker access to >8Gb of RAM Additionally on MAC, if permissions issues prevent binding the path to the license.txt file, we suggest moving the freesurfer license.txt file to the current path and replacing the path line to " $(pwd)/license.txt:/extra/freesurfer/license.txt "

Singularityコンテナイメージのダウンロード

Synb0-DisCoのREADME.mdにあるSingularity Hubを開く。

GITHUBボタンをおしてGitHubにログインする。 f:id:AIProgrammer:20200418173857p:plain

GitHubにログイン後、Singularity Hubをもう一度開く。

すると、justinblaber/synb0_25iso_appのリポジトリが表示される。 次に、USAGEをクリックする。 f:id:AIProgrammer:20200418174206p:plain

USAGEをクリックすると以下のページに飛ぶ。 f:id:AIProgrammer:20200418174618p:plain

10GBほどダウンロードすることになる。

# download synb0_25iso_app
 singularity pull --name synb0_25iso_app.sif shub://justinblaber/synb0_25iso_app

Synb0-DisCoの実行

singularity run -e \
-B INPUTS/:/INPUTS \
-B OUTPUTS/:/OUTPUTS \
-B $(pwd)/license.txt:/extra/freesurfer/license.txt \
shub://justinblaber/synb0_25iso_app

Synb0-DisCoの実行結果

たくさんのファイルがOUTPUTSに出力されるがFSLのeddyコマンドに必要なデータは以下。

  • topup_movpar.txt
  • topup_fieldcoef.nii.gz

eddyをしたい場合

FSLeddyコマンドを使いたい場合、次のファイルをINPUTSフォルダに入れておきます。

  • 補正をしたいDWI画像 (diffusiondata.nii.gz)
  • skull strip済みの補正をしたいDWI画像のbinary mask (brainmask.nii.gz)
  • DWIのgradient table (bvecs.txt bvals.txt)
  • acqparams.txtと対応したindex.txt (index.txt) eddyの詳細はこちら
eddy --imain=INPUTS/diffusiondata --mask=INPUTS/brainmask \
--acqp=INPUTS/acqparams.txt --index=INPUTS/index.txt \
--bvecs=INPUTS/bvecs.txt --bvals=INPUTS/bvals.txt 
--topup=OUTPUTS/topup --out=OUTPUTS/eddy_unwarped_images

TOPUPをDWI画像にapplyしたい場合

Synb0-DisCoで生成したTOPUPの結果をDWI画像にapplyしたい場合。

補正をしたいDWI画像 (diffusiondata.nii.gz)をINPUTSフォルダに入れて以下のコマンドを実行。

OUTPUTS/applytopupがTOPUPによる歪み補正された画像である。

applytopup --imain=INPUTS/diffusiondata --datain=INPUTS/acqparams.txt --inindex=1 --topup=OUTPUTS/topup --method=jac --out=OUTPUTS/applytopup -v

TOPUP前

f:id:AIProgrammer:20200427172942p:plain

Synb0-DisCoを用いたTOPUP後

f:id:AIProgrammer:20200427172955p:plain

重ね合わせてみた。

f:id:AIProgrammer:20200427173357g:plain

エラー

RuntimeError: [enforce fail at CPUAllocator.cpp:56] posix_memalign(&data, gAlignment, nbytes) == 0. 12 vs 0

Performing inference on FOLD:からRuntimeError: [enforce fail at CPUAllocator.cpp:56] posix_memalign(&data, gAlignment, nbytes) == 0. 12 vs 0というエラーがでる。

PCの持つRAM(メモリ)が十分でない時に生じるよう。 使うデータによるが、8GB以上あると良さそう。

PyTorch フォーラムリンク

Thank you! My problem is solved. >My data is roughly 8gb, but my cpu’s >memory is only 3.75 gb. It’s solved >after I upgraded my cpu.

エラーコードの詳細は、以下。

Performing inference on FOLD: 1
T1 input path: /OUTPUTS/T1_norm_lin_atlas_2_5.nii.gz
b0 input path: /OUTPUTS/b0_d_lin_atlas_2_5.nii.gz
b0 output path: /OUTPUTS/b0_u_lin_atlas_2_5_FOLD_1.nii.gz
Model path: /extra/dual_channel_unet/num_fold_1_total_folds_5_seed_1_num_epochs_100_lr_0.0001_betas_(0.9, 0.999)_weight_decay_1e-05_num_epoch_97.pth
Traceback (most recent call last):
  File "/extra/inference.py", line 90, in <module>
    img_model = inference(T1_input_path, b0_input_path, model, device)
  File "/extra/inference.py", line 56, in inference
    img_model = model(img_data)
  File "/extra/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/extra/model.py", line 85, in forward
    d4   = self.dc4(d5)
  File "/extra/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/extra/pytorch/lib/python3.6/site-packages/torch/nn/modules/container.py", line 92, in forward
    input = module(input)
  File "/extra/pytorch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/extra/pytorch/lib/python3.6/site-packages/torch/nn/modules/conv.py", line 941, in forward
    output_padding, self.groups, self.dilation)
RuntimeError: [enforce fail at CPUAllocator.cpp:56] posix_memalign(&data, gAlignment, nbytes) == 0. 12 vs 0



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓