プログラミングの実験場

Haskell/Webアプリ/画像処理/可視化/ITによる生産性向上 など

関数型言語による画像処理環境の追求 その1 現状と背景

Haskellグループができたのを機にはてなブログを作ったので、せっかくなのでHaskellについてなにか書こうと、僕の専門分野で使う、Haskellをつかった生物画像処理の環境について今一度調べてみることにした。

生物研究での画像処理というのは主に、画像に対して処理をして特徴抽出したり、物体検出(対象は細胞や蛍光分子)してその位置・数・大きさ・形などを数えたり、分類したりする、ということである。 解析する画像データは通常denseな2〜5次元(平面 × Z軸 × チャンネル(異なる色の蛍光分子) × 時間)の行列であり、大きさは面あたり数百×数百、Z軸は数10、チャンネルは1-5、時間軸は1-1000個程度のものを使うことが多い。

以下のリンクが参考になる。

Image analysis for biology http://www.rpgroup.caltech.edu/courses/PBoC%20ASTAR/files_2011/Matlab/Image%20Analysis%20with%20Matlab.pdf

この2010年の論文(PLoS Computational Biology)なんかもイントロとして良さそう。

Pattern Recognition Software and Techniques for Biological Image Analysis: http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1000974 

 

これまで僕は画像処理について、MATLABで行き当たりばったりでやっていたのだが、MATLABにはメリットとデメリットがある。 まずはこの記事で、その現状について少し書いてみる(なので、これはまだHaskellの記事ではない)。

MATLABのメリット

  • 組み込み関数はそこそこ速い。
  • 使用例がそこそこある。ウェブで見つかる大学の講義資料などはたいてい(学習しやすいという理由で)MATLABを使っている。また公式サイトのドキュメントも詳しく丁寧。
  • オールインワンで、GUIでの出力も簡単。デバッガが使え、ステップ実行や、変数内容の表示や変更ができる。
  • 生物系の画像処理ではシェアがかなり高い印象。

デメリット

  • 言語仕様やライブラリが主流のモダン言語と比べて圧倒的に劣っている。仕様がチグハグで一貫性がなく、抽象化能力も低い。バッチ処理で必要になる、文字列・ファイル処理も不便。プログラムの再利用性が低い。
  • 変数に型がない。インタプリタなので、実行前の静的チェックができない。
  • 組み込み関数を使わないで行列を手動で操作したりすると実行速度が遅い。
  • ソフトが商用で、非常に高い。アカデミックライセンスもライセンスチェックが厳しい。
  • 組み込みのエディタがしょぼい。

このような考察の結果、もうちょっとクリーンで快適かつ型安全な画像処理プログラミングをしてみたいと思った次第。抽象化能力の高いモダンな言語、できればHaskellで出来ればいいのだけど、ウェブ上でほとんど実用例は見つからない。

ちなみに、MATLAB以外でのオプションは以下の様な感じだろうか。

  • C++ + OpenCV(あるいは他のライブラリ)
  • ImageJ (or Fiji) + プラグイン

ImageJはJavaで書かれたオープンソースで、Java(あるいはJVM上の言語、Scalaなど)で書いたプラグインで拡張可能。実際僕もImageJのプラグインをScalaで書いて、それで画像解析をした。Fijiはそれにプラグインを追加したもので、JRubyやclojureなどでスクリプトを書ける。ImageJはAPIの筋がいいし、Scalaが使えるので悪くない。

次のポストで、Haskellでの画像処理、行列の扱いなどについて現時点でのライブラリの状況についてまとめる。

もちろん、道具選び・道具作りに溺れて実際の解析にとりかかるまでの準備に時間をかけすぎては本末転倒なのだが、もっと計算の意味を高い抽象化で表現して、実装の詳細と分離するようなことができればプログラムの見通しも良くなるし、生産性が上がることは間違いない。

たとえば、MITがHalideというC++用の画像処理ライブラリを最近公開したが、これは純粋関数的な「アルゴリズム」と、実装の詳細の「スケジュール」を分けることで最適化を容易にしている。

http://people.csail.mit.edu/jrk/halide12/

この方向性は関数型言語の考えとも共通するし、並列化などを考えても非常に有望だと思う。