LeapMotion による CT データ を用いたバーチャルエコーを自作したメモ

投稿者: | 2015年6月1日

すぐにできそうなことなので、やってみました。できました。
やった内容について忘れないうちにメモを残す。コードはしょぼいので晒さない。

概要

CTデータを安直に格子3Dデータに変換する。LeapMotionから入手した手の座標から、3Dの断面を求める。

使った道具たち

これらのツールの製作者の方々、Ruby/Tkの永井さん、NArrayの田中さん、artooのThe Hybrid Groupのみなさん、に感謝します。彼らのライブラリのおかげで、私が無知でもモノが作れてしまう。Lubuntu と Ruby2.2.2使いましたが、そのへんは何でもいいかと。Lubuntu/UbuntuにRuby/Tkを導入するのはこちらのサイトを参照。

CTデータを取得する

 ある意味今回最大の難関。なぜなら、CTデータは学術的な内容を含むにも関わらず、個人情報のため無制限にWeb上にデータセットが公開されることがない。このことが、医療におけるプログラミング利用を難しくする。もうひとつは、医療用画像データがDicomという特殊な形式を使用していること。
 今回は、The Cancer Imaging Archiveからデータを取得した。Java Web Start というのを起動する必要があり、ダウンロードにも時間がかかる。

Dicomを画像に変換する

 Dicomデータを直接扱えたらいいが、Dicomデータを扱うライブラリについて学習するコストは馬鹿にならない。(IT技術者でない日曜プログラマにそんな暇はない。)そこで大人しくDicom画像を画像データに変換した。方法・形式は何でもいいと思います。今回はdcm2pnmを使ったあと、Mogrifyで画像サイズを変換した。dcm2pnmはoptionでウィンドウレベルを設定してやらないと変な画像になる。
 追記:ruby-dicomつかえばDicomから直接ピクセルのデータ取れる。NArrayへの変換機能までついている。でも内部ではrmagick呼び出している。

画像を読み込む

 汎用性と安直さを重視してRMagickでピクセルを読み込んだ。
 ImageMagick導入できず、PNGが扱える場合はChunky_png使ってもよさそう。

Ruby/Tk

 ここでも汎用性と安直さを重視してRuby/Tkを使うことにした。意外とShoesでも行けたんだろうか?
 画像の表示はこのページを参考にPPMフォーマットを使用した。

dRuby

 Ruby/Tkを使うと困るのは、スレッドと相性が悪く、素人が気軽にメインループを2つ組み合わせたりできないことだ。Ruby/Tkについては3階建ての2階角部屋 2ndというブログが大変素晴らしいが、中の人は2013年9月頃ruby/tkとopenGLを繋ごうと格闘したあげく「なかなか言う事を聞いてくれなくて嫌になるね。」というセリフを残してPythonの世界に行ってしまった。
 このようにRubyで2つのイベントループを両立させるのは難しいので、直接対決を避ける。イベントループごとにRubyプロセスを別々に立てて、プロセス同士でデータをやり取りすることに。具体的にはdrubyサーバを立てて、artoo-leapmotion から dRubyにデータを保存。Ruby/TkはdRubyにデータを取りにいくようにした。計測してみると、この方法でタイムラグはほとんどない。

artoo-leapmotion

 シンプルそうなshokai氏の作成したleapmotionライブラリを使いたかったが、GitHubのissueにも書かれている問題がある。そこで、よくメンテされてそうな、artoo-leapmotionを使った。ArtooはRubyを使ってロボットを開発するライブラリを提供するという夢膨らむプロジェクトだ。(最近はJavaScriptに注力しているようだ。)Celluloidとかいう並列化のライブラリを使っており、タイムラグがない。正直よくわかりません。そんなわからない代物と、Ruby/Tkを両立させてくれるdRubyは助かります。

NArray

 NAarrayというすごいライブラリがある話を聞いていた。しかし公式サイトが取っ付きにくそう。
 しかし、今回Rubyのループを使った座標計算が遅すぎて実用に耐えなかったので、上述の3階建ての2階角部屋ブログに影響されて手を出してみた。すごかった。爆速です(丁寧語)。しかも直感的。数学音痴でも使えた。とりあえずここ一通り読むと何となくわかった気になる。
(同種のライブラリに、驚異的なNyaplotライブラリが個人的に非常に気になるSciRubyの、NMatrixというライブラリもあるが、概してSciRubyの成果物は依存や導入が面倒で「手軽さ」に欠ける。そのため一概にNMatrixの方がNArrayよりもよいと言えないと思う。)

LeapMotionからの情報取得

とりあえず、hand.palmPositionで、位置座標を取得し、hand.directionで掌の進行方向の単位ベクトルを取得し、hand.palmNormalで掌の法線方向の単位ベクトルを取得するようにしている。まだLeapMotionでどんな情報が取れるのか知らないので勉強中。

こう思った

 医療データを、コンピュータを用いて自動解析して、より人間にとって親しみやすいインプット(そう、アウトプットではなくインプット)に変換することは意外と簡単です。一見すると革新的な全く新しい発想のように見えますが、これは音波を使った打診から聴診へ、聴診から超音波へ、といった旧来からの情報処理の進歩の延長線上にあります。いずれも音波という共通の道具を使っているけれど、情報量が何千倍にもなったとき、新しい情報処理装置と組み合わせることで、そこにあたかも新規性のあるモダリティが誕生する。
 旧来との連続性があること。それは決して悪いことではなくて、このように医療データをコンピュータやスクリプト言語を使ってより人間のインターフェイスに沿った方法で提示する試みが、ゆっくりと確実に現場に進出していくと思います。CTなんか大昔からそれやってるしね。

 このようにデータを加工して、人間によりやさしいインプットに変換することを人工知能と言うならば、医療界はデータを集め、昔からコンピュータを使用しない人工知能を使用してきました。(その件について書きたいことはたくさんあるけど自分の中で結論出てないから書けない。)

 しかし、残念ながら、医師はプログラミングの世界を理解することができず、またそのような時間もなく、IT関係者は医療の本質である「生臭いハイリスク」と「情」の世界について頭で知ることができても心で知ることができません。

 私らは、そんな分断された時代の狭間で中庸を探し求めているのかなと思います。あとエントリーが医療ネタとプログラミングネタが融合して嬉しい。

LeapMotion による CT データ を用いたバーチャルエコーを自作したメモ」への3件のフィードバック

  1. ピンバック: Medfreak / Numo::NArray を試してみる

  2. mat

    はじめまして。記事楽しく拝見させて頂いております。matと申します。
    ご連絡先を探したのですが見当たらずコメントにて失礼しております。

    今、超音波を使用し、身体の臓器をスマホ・PC上で閲覧しようとしています。
    madfreakさんの動画を見て手の内部がリアルタイムに表示されており大変感動しました。これはなんのセンサーを用いていくら位なのでしょうか?
    leapMotionも調べてみたのですが、これは座標を得るだけのものですよね。

    お手数かけますが他に聞ける人もおらずメールで返信いただけると嬉しいです。
    宜しくお願いします。

    返信
    1. user 投稿作成者

      matさんこんにちは。

      残念ながら、これは手の内部がリアルタイムに表示されるサンプルではありません。
      手を超音波断層装置のプローブに見立てて、あらかじめ読み込んだ胴体のCTのデータを任意の断面で表示しているだけです。
      だから”バーチャル”エコーです。

      超音波断層装置の自作は、やってみたいと思ったことはあります。
      しかし超音波を発生させるプローブは定価数百万することもある代物なので、自作するのはかなり難しいのではないかと想像します。

      返信

コメントを残す

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