落書き numo-gnuplot でCT画像を3Dにしてみる

このところNumo/NArrayネタが続いています。
Rubyで科学技術計算を支援するNUMOの提供する、プロットライブラリのnumo-gnuplotが地味に進化したようです。


今回は3Dプロットを使って、医療ネタで落書きして遊んでみたいと思います。(ただし高速化にはあまり関係ありません)

gnuplotで3D散布図を使って描出された肺
img

CTのDICOMデータを手に入れる

 いつもここが最大の関門になります。DICOMとは医用画像の共通データ形式です。医用画像はすべて個人情報です。そのためネット上で公開されているデータは限定されています。オープンソースの高機能Dicomビューワ(Mac向け)のOsiriXのサイトに、いくつかサンプルDICOMデータが公開されていますから、今回はそれを使います。(今知ったけどOsiriXの開発元の会社はスイスに本部があるのね。)その他にもCTデータを扱っているサイトはいくつかありますが、良いサイトがあったら教えてもらいたいぐらい。

RubyでDICOMデータを扱う

 次にどうやってDICOMデータを扱うかですが、幸いにしてRubyでDicomをあつかうライブラリがあります。ありがとうございます。ただし、内部的にはrmagickを呼んでいるので、ImageMagickもインストールする必要があります。Windowsではあまり使いたくないですね。

ruby-dicomのtutorialによると、実はdicomデータから直接旧NArray形式でデータを取り出せることになっています(NArrayとはRubyにおけるNumpyです)が、なぜかshapeが違うとエラーが出ます。おそらくtagから画素の情報を読み込んでreshapeする時に、dimが合わないとかそういう話なのでしょう。DICOMはデータ形式が多種多様なので、ノンエンジニア素人がソースを追い始めると泥沼にハマる気がします。今回は落書きしたいだけなのです。そこでImageMagicのデータ形式から画素値を取り出すようにします。もともとNumo/NArrayを試す予定だったのですから。

 まずはデータを読み込みます。

 つぎに画素値を取得します。

1行単位のmapが続いているのは、わかりやすく書くためではなく、dcm.image.get_pixels(0,0,512,512)など続けて書くと、すぐにrmagickのエラーが発生するからです。

ここでようやくNumo/NArrayにRuby Arrayを変換します。Rubyしかできないような人間にとってデータ型の選択は新鮮ですが少し面倒。

ここまでの処理に時間がかかるので、ここで一旦データを保存しておきます。旧NArrayにあった.to_sが見当たらないので、とりあえずRuby Arrayに戻してMarshal.dumpで保存。以降はこのデータから出発します。

データを読み込みます。

今回のキモの部分です。画素値が179となるピクセルを取得し、その画素値を受け取ります。

eqpx.where2.firstでもよさそうですが、なぜかエラーがでます。ここでもRuby Arrayを経由して回避します。座標を計算します。

ここで、3D座標にする際に化学における光学異性体の「右利き」と「左利き」のようなミスが発生している可能性がありますが、今回は肺っぽく見えるビジュアルが欲しいだけなので、肺の異性体が間違って出力されてもOKとします。(おい

ところで、x.reshape(x.size)ではなく、x.reshape(1,x.size)と、きちんと1を明記しているところに注目してください。1行の行列やベクトルをどう扱うかで旧NArrayとNumoには違いがあり、どうもNumoは明示的に1を表記することを推奨しているように感じられます。実はnumo-gnuplotもバージョンアップ前は x.reshape(x.size)でも動きましたが、バージョンアップ後は1を明記しないと動かなくなりました。OpenBLASの行列積Linalg.matmul(x,y)も動きません。旧NArrayにあったVectorが廃止されましたが、これがNumo全体の方針なのか注目されます。

落書きとはいえどもトラップが随所にあって結構大変でした。
gnuplotでCT画像を3Dにするネタは、ありそうでいて出てきません。こういうは、実は簡単にできますよということが、認知されたらいいと思います。

医用画像をどうするか

感想、というか社会ネタです
ウォール・ストリート・ジャーナルの人工知能の未来-識者4人に聞くの記事にも、Facebookのヤン・ルカンさんの発言として、

深層学習は自動運転車や音声認識エンジンのほか、熟練した放射線医師よりも正確に腫瘍を特定できる医療用分析システムに道を開くものだ。

という一文があり、ひそかに医療画像診断は深層学習の主戦場の一つになると思っていたので、やっぱり、みんな同じことを考えているんだなと思いました。一方で日本のPFIはバイオヘルスケア分野を3本柱の一つと位置づけて、国立がん研究センターと組んでゲノム解析によるがん治療開発をしようとしているようです。しかし、個人的にはこちらの方向性は事業としての価値をかなり疑問視しています。なぜならばがんとは、おそらく老化現象の一つの側面であり、がんという病態のうち遺伝子の変異に着目するのは、現象を一面からとらえた狭い物の見方に過ぎないと考えるからです。人間は、何らかの一つ観測手段を一度手に入れると、急にブームが発生し、それを使って世界のもろもろを解釈しようと考える性質があります。(個人の感想です)
 CT画像のサンプルが欲しい人は世界中で激増していると思われます。しかし、単純に画像診断が機械でできるようになるという視点にこだわりすぎると、もっと大きな問題点が見えてこない気がします。次回は少しプログラミングネタを離れてそのことについて考えてみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です