MONAI 0.7 : モジュール概要 (1) 医用画像データI/O, 前処理と増強 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/05/2021 (0.7.0)
* 本ページは、MONAI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- テレワーク & オンライン授業を支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ ; Facebook |
MONAI 0.7 : モジュール概要 (1) 医用画像データI/O, 前処理と増強
MONAI は医用画像解析における深層学習を様々な粒度でサポートすることを目的としています。この図は end-to-end ワークフローの典型的な例を示します :
MONAI アーキテクチャ
MONAI の設計原理は様々な専門知識を持つユーザのために柔軟で軽量な API を提供することです。
- 総てのコアコンポーネントは独立したモジュールで、これらは任意の既存の PyTorch プログラムに容易に統合できます。
- ユーザは、研究実験のための堅固な訓練や評価プログラムを素早くセットアップするために MONAI のワークフローを活用できます。
- 主要な機能を実演するために豊富なサンプルとデモが提供されます。
- COVID-19 画像解析、モデル並列等を含む、最新の研究課題のための最先端技術に基づいて研究者が実装を提供しています。
全体的なアーキテクチャとモジュールは次の図で示されます :
医用画像データ I/O、(前) 処理と増強
医用画像は I/O、前処理と増強のための高度に特化された方法を必要とします。医用画像は豊富なメタ情報を持つ特別な形式にあることが多く、データボリュームは高次元であることが多いです。これれは注意深く設計された操作手続きを必要とします。MONAI の医用画像フォーカスは強力で柔軟な画像変換により可能になります、これは使い勝手の良い、再現性のある、最適化された医療データ前処理パイプラインを容易にします。
1. 辞書と配列形式データの両方をサポートする変換
- (torchvision のような) 広く使用されているコンピュータビジョン・パッケージは空間的に 2D な配列画像処理にフォーカスしています。MONAI は空間的に 2D と 2D の両方のためによりドメイン固有な変換を提供し、そして柔軟な変換 “compose” 機能を保持しています。
- 医用画像前処理は追加の極め細かいシステムパラメータを必要とすることが多いので、MONAI は python 辞書にカプセル化された入力データのための変換を提供します。ユーザは複雑な変換を構成するために想定されるデータフィールドに対応するキーとシステムパラメータを指定できます。
6 つのカテゴリー内の変換の豊富なセットがあります : Crop & Pad, 強度, IO, 後処理, Spatial とユティリティです。詳細は、MONAI の変換の総て にアクセスしてください。
殆ど総ての変換は入力データがチャネル first の shape 形式を持つことを想定しています : [Channel dim, spatial dim 1, spatial dim 2, …] です。柔軟な ベース API がまた提供されます。monai.transforms モジュールは簡単に拡張可能です。
2. 医療に特化した変換
MONAI は包括的な医療に特化した変換を提供することを目的としています。これらが現在、例えば以下を含みます :
- LoadImage: 指定されたパスから医療固有の形式のファイルをロードする
- Spacing: 入力画像を指定された pixdim に再サンプリングする
- Orientation: 画像の方向を指定された axcodes に変更する
- RandGaussianNoise: 統計的なノイズを追加して画像強度を摂動を与える
- NormalizeIntensity: 平均と標準偏差に基づく強度正規化
- Affine: アフィン・パラメータに基づいて画像を変換する
- Rand2DElastic: ランダムな elastic 変形と 2D のアフィン
- Rand3DElastic: ランダムな elastic 変形と 3D のアフィン
2D 変換チュートリアル は幾つかの MONAI 医用画像特有の変換の詳細な使用方法を示します。
3. 変換は NumPy 配列と PyTorch テンソルの両方をサポートします (CPU or GPU accelerated)
MONAI v0.7 から変換で PyTorch テンソルベースの計算を導入しましたが、多くの変換は入力タイプと計算バックエンドとして NumPy 配列とテンソルを既にサポートしています。総ての変換のサポートされているバックエンドを取得するには、次を実行してください : python monai/transforms/utils.py.
変換を高速化するためには、一般的なアプローチは GPU 並列計算を利用することです。ユーザは最初に ToTensor または EnsureType 変換により入力データを GPU テンソルに変換し、それから続く変換を PyTorch テンソル API に基づいて GPU 上で実行できます。GPU 変換チュートリアルは Spleen 高速訓練チュートリアル で利用可能です。
4. 融合した空間変換
医用画像ボリュームは (多次元配列にあるので) 通常は大規模ですので、前処理パフォーマンスは全体的なパイプライン速度に影響します。MONAI は融合した空間操作を実行するアフィン変換を提供します。
例えば :
# create an Affine transform
affine = Affine(
rotate_params=np.pi/4,
scale_params=(1.2, 1.2),
translate_params=(200, 40),
padding_mode='zeros',
)
# convert the image using bilinear interpolation
new_img = affine(image, spatial_size=(300, 400), mode='bilinear')
実験とテスト結果は 融合した変換テスト で利用可能です。
現在、総ての幾何学的画像変換 (Spacing, ズーム, 回転, リサイズ 等) は PyTorch ネイティブ・インターフェイスに基づいて設計されています。そのためそれらの総ては高性能のための GPU テンソル演算を通して GPU 高速化をサポートしています。
幾何学的変換チュートリアル は 3D 医用画像でアフィン変換の使用方法を示します。
5. ポジティブ/ネガティブ比率に基づいてランダムにクロップ
医用画像データボリュームは GPU メモリに収まらないほど大きい場合があります。広く使用されているアプローチは、訓練の間は小さいデータサンプルをランダムにドローして推論のために「スライディング・ウィンドウ」ルーチンを実行することです。MONAI は現在、パッチベースの訓練プロセスを安定化させるのに役立つ可能性のある、クラス・バランスの取れた固定比率サンプリングを含む一般的なランダム・サンプリング・ストラテジーを提供しています。典型的な例は 脾臓 3D セグメンテーション・チュートリアル で、これは RandCropByPosNegLabel 変換とともにクラス・バランスのとれたサンプリングを実現しています。
6. 再現性のための決定論的訓練
決定論的訓練のサポートは深層学習研究、特に医療分野では必要で重要です。ユーザは MONAI の総てのランダム変換にランダムシードをローカルで簡単に設定できてユーザのプログラムの他の非決定論的モジュールに影響を与えません。
例えば :
# define a transform chain for pre-processing
train_transforms = monai.transforms.Compose([
LoadImaged(keys=['image', 'label']),
RandRotate90d(keys=['image', 'label'], prob=0.2, spatial_axes=[0, 2]),
... ...
])
# set determinism for reproducibility
train_transforms.set_random_state(seed=0)
ユーザはまた訓練プログラムの最初に決定論的 (動作) を有効/無効にできます :
monai.utils.set_determinism(seed=0, additional_settings=None)
7. マルチ変換チェイン
同じデータに様々な変換を適用して結果を連結するために、MONAI は、データ辞書の指定された項目のコピーを作成する CopyItems 変換と想定される次元の指定項目を組み合わせるために ConcatItems 変換を提供し、そしてまたメモリを節約するために不要な項目を削除するための DeleteItems 変換も提供します。
典型的な使用方法は同じ画像の強度を異なる範囲にスケールして結果を一緒に連結します。
8. DataStats で変換をデバッグする
変換が “compose” 関数と組み合わされるとき、特定の変換の出力を追跡することは容易ではありません。合成された変換のエラーをデバッグするのを手助けするために、MONAI は、データ shape, 値範囲, データ値, 追加情報等の中間的なデータ特性を表示するために DataStats のようなユティリティ変換を提供しています。それは自己充足的な変換で任意の変換チェインに統合できます。
9. モデル出力のための後処理変換
MONAI はまたモデル出力を処理するための後処理変換も提供しています。現在、変換は以下を含みます :
- 活性化層の追加 (Sigmoid, Softmax, etc.)。
- 下図 (b) のように、離散値 (Argmax, One-Hot, Threshold 値等) に変換します。
- マルチチャネル・データを複数のシングル・チャネルに分割する。
- 下図 (c) のように、接続コンポーネント分析に基づいてセグメンテーション・ノイズを除去する。
- 下図 (d) と (e) のように、セグメンテーション結果の輪郭を抽出します、これは元の画像へのマップに使用できてモデルを評価できます。
モデル出力のバッチデータを切り離し (= decollate) 後処理変換を適用した後では、メトリックを計算し、モデル出力をファイルにセーブし、あるいは TensorBoard でデータを可視化することは容易になります。後処理変換チュートリアル は後処理のための幾つかの主要な変換を使用するサンプルを示しています。
10. サードパーティの変換の統合
MONAI 変換の設計はコードの可読性と使い易さを重視しています。それは配列データや辞書ベースのデータのために動作します。MONAI はまた 3rd パーティの変換の異なるデータ形式に対応するためにアダプタ・ツールも提供しています。データ shape やタイプを変換するために ToTensor, ToNumpy, SqueezeDim のようなユティリティ変換も提供されます。従って、ITK, BatchGenerator, TorchIO と Rising を含む外部パッケージから変換をシームレスに統合することにより変換チェインを強化することは簡単です。
詳細は、チュートリアル: integrate 3rd party transforms into MONAI program を確認してください。
デジタル病理 (= pathology) 訓練では、画像のロードの膨大な負荷のために、CPU は画像のロードに先取りされてデータの前処理が追いつきません。これはパイプラインが IO に束縛されることを引き起こし GPU の使用率低下という結果になります。このボトルネックを解消するため、cuCIM は (私達がデジタル病理パイプラインで使用している) 幾つかの一般的な変換の最適化バージョンを実装しました。これらの変換は GPU 上でネイティブに実行されて CuPy 配列上動作します。MONAI は cuCIM ライブラリを統合するために CuCIM と RandCuCIM アダプタを提供しています。例えば :
RandCuCIM(name="color_jitter", brightness=64.0 / 255.0, contrast=0.75, saturation=0.25, hue=0.04)
CuCIM(name="scale_intensity_range", a_min=0.0, a_max=255.0, b_min=-1.0, b_max=1.0)
それは転移検出モデルの病理学の訓練で大幅なスピードアップを示しました。
11. 医用画像形式のための IO ファクトリー
多くのポピュラーな画像形式が医療ドメインに存在し、それらは豊富なメタデータ情報を持ち非常に異なります。同じパイプラインで異なる医用画像形式を簡単に処理するため、MONAI は LoadImage 変換を提供します、これはサポートされるサフィックスに基づいて以下の優先順位で画像リーダーを自動的に選択できます :
- このローダを呼び出すとき実行時にユーザに指定されたリーダー。
- 登録されたリーダー、リストの最新のものから最初のものへ。
- デフォルトのリーダ : (nii, nii.gz -> NibabelReader), (png, jpg, bmp -> PILReader), (npz, npy -> NumpyReader), (others -> ITKReader)。
ImageReader API は非常に簡単で、ユーザはカスタマイズされた画像リーダーのためにそれを簡単に拡張できます。
これらの事前定義された画像リーダーにより、MONAI は次の形式で画像をロードできます : NIfTI, DICOM, PNG, JPG, BMP, NPY/NPZ, 等々。
12. 変換データを NIfTI または PNG ファイルにセーブする
画像をファイルに変換したり、変換チェインをデバッグするため、MONAI は SaveImage 変換を提供しています。結果をセーブするためユーザはこの変換を変換チェインに注入できます。
13. チャネル first データ shape を自動的に確実にする
医用画像は様々な shape 形式を持ちます。それらはチャネル last、チャネル first あるいはノーチャネルでさえある可能性があります。例えば、幾つかのノーチャネル画像をロードしてそれらをチャネル first データとしてスタックすることを望むかもしれません。ユーザ体験を改善するため、MONAI はメタ情報に従ってデータ shape を自動的に検出してそれを一貫してチャネル first 形式に変換する EnsureChannelFirst 変換を提供しました。
14. 空間的変換とテスト時増強を反転する
深層学習ワークフローでは前に適用した空間的変換 (リサイズ, 反転, 回転, ズーム, クロップ, pad 等) を反転する (= inverse) ことが望ましい場合があります、例えば、正規化されたデータ空間で画像データを処理した後で元の画像空間に戻すためです。多くの空間的変換が 0.5 から反転演算で強化されています。モデル推論チュートリアル が基本的なサンプルを示しています。
パイプラインがランダムな変換を含む場合、ユーザは出力上でこれらの変換が持つ効果を観察することを望むかもしれません。典型的なアプローチは、異なるランダムな具現化で複数回変換を通して同じ入力を渡すことです。そして総ての結果を共通の空間に移すために反転変換を使用して、メトリクスを計算します。MONAI はこの機能のために TestTimeAugmentation を提供しました、これはデフォルトで 最頻値, 平均値, 標準偏差と volume 変動係数を計算します。
Invert transforms and TTA チュートリアル は使用サンプルとともに API について詳細を紹介しています。
(1) 最後のカラムはモデル出力の反転されたデータです :
(2) 最頻値, 平均と標準偏差の TTA 結果 :
以上