フルマスクを使用したbrain1テストケース(256x256x25ボクセル)を使用したPyRadiomicsのプロファイリング
主なボトルネック:
cc @ Radiomics / Developers
@blezek @ Radiomics / Developersに、脳全体でラジオミクスを実行しようとするとパフォーマンスの問題が発生することを伝えたので、 @ JoostJMがプロファイリングを行いました。
glszmコードを
Cコードでは? あなたはそれに取り組む方法の一般的な考えを持っていますか?
Cコードでは? あなたはそれに取り組む方法の一般的な考えを持っていますか?
スレッドの使用を検討できるかもしれません
とはいえ、バニラCコードでスレッドライブラリを使用することは、正しく
ITKフィルターの実装が役立つと思います(たとえば、ITKリモートモジュールとして)。そうすれば、関連するクロスプラットフォームの画像処理とスレッド化APIを活用できるようになります。 これらのフィルターは、SimpleITKを介して公開できます。
@ thewtex @ jbvimort何か洞察がありますか...
行ごとのプロファイリングを行うのが最善ですが、このネストされたループのセットはかなり遅いと思い
各ピクセルは独立している必要があるため、この操作はスレッド化できるというJcに同意します。 また、同じ操作のSimpleITK実装は、はるかに高速になる可能性があります。 しかし、私はプロファイリングを行うことから始めて、既存のPythonコードを最適化する方法があるかどうかを確認します。
@pieperプロファイリングから、Joostはすでに_calculateCMatrixが77%の時間を占めているように
@pieper @fedorov 、それは確かにこの呼び出しです。 それをもっと効率的にすることができるかどうか見てみましょう。
可能であれば、2つの理由から、ここでマルチスレッドを実装することは避けたいと思います。
ちなみに、c GLSZMに非常に時間がかかる主な理由は、計算量が多く、12回呼び出されるためです(派生画像が異なるため)。 SimpleITKのlabelshapestatistics画像フィルターの呼び出しは、1回の呼び出しに最も時間がかかる呼び出しですが、抽出ごとに1回だけ呼び出されます(形状の一部であるため、元の画像タイプでのみ計算されるため)。
SimpleITKの呼び出しには時間がかかります。 これは、計算されたフェレット直径(最大3D直径)によるものです。
この直径がある場合とない場合でlabelshapestatistics画像フィルターを実行すると、完全なbrain1マスクの21ミリ秒に対して271053ミリ秒の時間差があります。
ここで役立つPythonパッケージitk-texturefeatures
が利用可能になりました。
@JoostJM itk-texturefeaturesを見ましたか? 速度がどのように比較され、機能セットがピラディオミクスcコードに現在あるものと同等であるかどうかを知ることは興味深いでしょう。
@pieper 、休暇から戻った
PyRadiomicsと、ITKテクスチャ機能で使用されているのと同様のマスクを使用してプロファイリングを行いました(ボクセル単位の計算を実装しています)。 ピラディオミクスのパフォーマンスはITKのパフォーマンスと同様でした。
PyRadiomicsの欠点は、ITKがN次元であるのに対し、3D入力のみを受け入れることです。 一方、PyRadiomicsは、シングルスレッドモードでこのパフォーマンスを実現し、GLCMでより多くの機能を計算します。
機能セットに関しては、私が見る限り、式の定義は類似しており、PyRadiomicsはGLCMとGLRLMの両方でより多くの機能を備えています。 ITKのテクスチャ機能には、PyRadiomicsにはない機能が(GLCMで)1つしかありませんが、これはPyRadiomicsのcorrelation
同様の実装であり、ITKにはHaralick's correlation
として存在します。 そうは言っても、ITKがPyRadiomicsの固定ビン幅ではなく、固定ビンカウントを使用したため、まだいくつかの違いがあると思います。
@JoostJMをチェックしていただきありがとうございます
最も参考になるコメント
@JoostJMをチェックしていただきありがとうございます