SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
2011-11-11 Kashiwa.R#1



 画像解析とパターン認識における R の利用




                    くつな   なつまろ
              朽名 夏麿
 (東京大学 大学院新領域創成科学研究科 先端生命科学専攻)
生物画像解析の特性
多次元 (時間,立体,波長…)            多様性(生物種,部位,観察法…)


                 t, z, l


データサイズ・枚数 (n)              多目的性 (何に着目するか)
            100 ms/枚           位置・局在 濃度・電位   運動   数・形・長さ
            1024*1024 pixel/枚
            12 bits/pixel
             → 4 GiBytes / 5 分

   自動化・計算機支援に向く             研究者(人間)の柔軟性が不可欠


  AI?? パターン認識?? 機械学習?? データマイニング??
      ・ 多様な画像と目的をカバーできる適応性・汎用性
      ・ 数値化による客観性,自動化による高速性
シロイヌナズナ気孔
  アクチン繊維
              「画像→画像」の例




  共焦点画像 高周波数成分の抽出        二値化像     細線化像
        (繊維等の強調処理)      (白黒画像)


              「画像→数値」の例
              気孔開閉の指標       アクチン繊維の配向の指標

             短径 / 長径   長径   気孔に対する
                            アクチン繊維の角度   q
                       短径               q

                                     気孔
 灰色: 気孔領域    この場合,          この場合,
黒色: アクチン繊維   短径 / 長径=0.47   アクチン繊維の角度=54.3°
159   デジタル画像は数値が並んだもの
           153


                                 x
                       (3, 0)
                       輝度30

    (x,y) = (0, 0)     (3, 2)
    輝度 35              輝度 21

y                                              159列



                                表示を縮小
                                        153行
画像処理・画像解析のソフトウェアツールと要件
NIH Image/Scion Image/ImageJ
Photoshop
                         採用されている画像や処理のモデル
GIMP                     拡張性
MetaMorph                可搬性
OpenCV                   インタラクティビティ(REPL,GUI)
VTK (Mayavi, ParaView) フリーソフトウェア,オープンソース
Amira                    ユーザの多さ,情報の多さ
MATLAB, Octave           開発状況
                         速度や記憶量.スケールするか.
ImageMagick
CImg
Python Imaging Library (PIL)
 :
R
ImageJ
Java .オープンソース.NIH の人が開発.生物学分野で多用される.




                                               拡張性:
                                                * 独自仕様のマクロ
                                                * Java等JVM用言語でのプラグイン
                                                * JavaプラットフォームでのAPI

                                               可搬性・速度・スケール性:
                                                * Java に準ずる.

                                               画像のモデルがバイオ向き
                                               * 画素について u8, u16, float ...
                                               * Z軸,時間軸でのスタック化
                                                 (3次元以上の高次元画像)
以降の顕微鏡画像は全て http://ome.grc.nia.nih.gov/iicbu2008/ (IICBUデータベース) より取得.
ImageJ plugins
http://rsbweb.nih.gov/ij/plugins/ (ImageJ 公式サイト内)




                    このサイトだけでも500個以上のプラグインが紹介されている.
                    Java ソースかクラスファイルか JAR 形式.
Java による ImageJ plugin




          生物画像解析のニーズは多彩すぎており,
          探すよりも書く方が早く済むことも多い.
Python による ImageJ plugin
ImageJ では画像から欲しい情報を
定量化するところまでは容易だが…
高次元・多量の非画像データの
扱いは不得手.
Excel にコピペしてプロットや検定…
ある程度はパッケージがあるようだ.
(試してません…)
R で画像処理の本が出る
共立出版のサイトより引用
http://www.kyoritsu-pub.co.jp/series/arudemanabu.html#11
生物画像解析における R の使いどころ


        画像処理       画像処理   画像処理



               画像からの測定

                                 画像からの測定
  画像の読込
                データ解析

                                  データ解析



 画像データの生成
(シミュレーション等)
ImageJ から R を使うには




      ?
Rserve: TCP/IP を介した R の利用




          connect       R console と ImageJ を別プロセスで動かしつつ,
ImageJ                  データのやりとりをすることができれば
                    R   便利そうなので,そのうちトライしたい.
 (Java)                                    http://www.rforge.net/Rserve/
rJava: R から Java を呼出す
           JRI: Java から R を呼出す




          call
ImageJ               これを使って ImageJ と R をむすんだ
                 R   プロダクトを簡単に 2 つ紹介します.
 (Java)   call                    http://www.rforge.net/rJava/
RImageJ: R から ImageJ を呼出す




                                  R で実質6行のパッケージ.
                                  これだけでも ImageJ マクロのサブセット
                                  が R コンソールから使える.
                                  インタラクティブな操作は不明.
 http://romainfrancois.blog.free.fr/index.php?post/2009/06/22/using-ImageJ-from-R%3A-the-RImageJ-package
Bio7: ImageJ と R,その他を統合




        ImageJ や R の良さが一部
        失なわれているように思う.
        あと挙動が怪しい気が…?
JRI (Java → R) を試す
導入 (ubuntuの場合)
export   R_HOME=/usr/lib/R
export   CLASSPATH=${CLASSPATH}:${R_HOME}/site-library/rJava/jri/JRI.jar
export   LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${R_HOME}/site-library/rJava/jri
% sudo   apt-get install r-cran-rjava

試用
% scala
scala> val engine=new org.rosuda.JRI.Rengine(Array("--no-save"),false,null)
engine: org.rosuda.JRI.Rengine = Thread[Thread-4,5,main]
                                                    Rは別のJavaスレッドで動く
scala> engine.eval("sum(iris$Sepal.Length)").asDouble
res0: Double = 876.5

scala> engine.eval("iris$Sepal.Length").asDoubleArray.sum
res1: Double = 876.5000000000002




    これを使って ImageJ から R を使ってみることにした.
ImageJ から R を使って画像の学習と分類をする


                       ?
 ゴルジ体  リソソーム         課題画像        4. 教師データから分類森を作り,
    教師画像群
                                      課題データを分類
        ImageJ                      randomForest package
1. 画像            7. 表示            3. 特徴等         5. 分類結果
   今回の plugin                                R
2. 特徴等       6. 分類結果
                         JRI (Java/R)
                         JNI (Java/C)
今回のプラグインのソースリスト (一部)
object Ijp extends KbiPlugIn {
  private val imgClassA = arg("imgClassA", KbiGenericDialogObj.Choice.empty)
  private val imgClassB = arg("imgClassB", KbiGenericDialogObj.Choice.empty)

    def config(argStr: String): Option[() => Any] = runWith(imp => {
       val winList = KbiWinListObj.all()
       imgClassA.resetChoice(winList)    ユーザに教師画像を
       imgClassB.resetChoice(winList)
       input(imgClassA, imgClassB)       2セット(A, B)指定してもらう.
       def idx2imp(idx: Int): Imp = winList.getImpFromIdx(idx) match {
         case null => KbiExc("image not found")
         case imp => imp
       }
       new TrainAndClassifier(idx2imp(imgClassA().idx), idx2imp(imgClassB().idx))
    })
}

                            R engine の管理.
private object Rengine {    R は初回使用時のみ初期化する.
  private lazy val engine = new org.rosuda.JRI.Rengine(Array("--no-save"),
                                                       false, null)
  def eval(s: String): org.rosuda.JRI.REXP = engine.eval(s)
}
private class TrainAndClassifier(impA: Imp, impB: Imp) extends ProcNotShow {
  private val featureExtractor = str2featureSet("glcmPlain")
  private val vectorsA = ips2features(UtilImg.ist2ips(impA.getStack))
  private val vectorsB = ips2features(UtilImg.ist2ips(impB.getStack))
  private val nDim = vectorsA(0).size        教師画像からの特徴抽出
  private def ips2features(ips: Array[Ip]) = for (ip <- ips) yield
    featureExtractor.extract(ip).values.drop(2).toArray

  def proc(istQ: Ist, impQ: Imp, kpl: KbiPlugIn) {
    val ipsQ = UtilImg.ist2ips(istQ)
    val vectorsQ = ips2features(ipsQ)       課題画像からの特徴抽出
    val cmdsForR = Util.withArrBuf[String](acc => {
       def addVectorStr(i: Int) {
         acc += "tf%d <- c(%s,%s)".format(i, vectorsA.map(_(i)).mkString(","),
                                             vectorsB.map(_(i)).mkString(","))
         acc += "qf%d <- c(%s)".format(i, vectorsQ.map(_(i)).mkString(","))
       }
       acc += "library(randomForest)"         R に渡すコマンドを生成
       for (i <- 0 until nDim) addVectorStr(i)
       acc += "imgClass <- c(%s,%s)".format(  (学習と分類)
                     Array.fill(vectorsA.size)("'A'").mkString(","),
                     Array.fill(vectorsB.size)("'B'").mkString(","))
       acc += "dTeach <- data.frame(%s,imgClass)".format((0 until nDim).map(n =>
                     "f%d=tf%d".format(n, n)).mkString(","))
       acc += "dQuery <- data.frame(%s)".format((0 until nDim).map(n =>
                     "f%d=qf%d".format(n, n)).mkString(","))
       acc += "rf <- randomForest(formula=imgClass ~., data=dTeach)"
       acc += "predicted <- as.integer(predict(rf, dQuery))"
    })
cmdsForR.forall(cmd => Rengine.eval(cmd) != null) match {
          case false => KbiExc("error occurred in R")             R の呼出
          case true => {
            val predicted = Rengine.eval("predicted").asIntArray
            KbiExc.assert(predicted != null, "error occurred in R: predicted")
            val (ipsEstA, ipsEstB) = Util.withArrBuf[Ip, Ip]((accA, accB) =>
              for ((lbl, idx) <- predicted.zipWithIndex) lbl match {
                case 1 => accA += ipsQ(idx)
                case 2 => accB += ipsQ(idx)
                                                        分類結果に応じて
              })
            if (ipsEstA.size > 0) UtilImg.show(ipsEstA)
                                                        課題画像を
          }
            if (ipsEstB.size > 0) UtilImg.show(ipsEstB) 2つに分けて表示.
        }
    }
}

    今回は R script を生成するために
      double[] a = { 1.2, 2.4, 3.6 };
    を
      String s = String.format("f1 <- c(%g, %g, %g)", a[0]…
      Rengine.eval(s);
    のようにデータを文字列中に埋め込んでから評価しているが,
      Rengine.assign("f1", array);
    の方が速度や誤差の面では望ましい.
実行のようす: 教師画像群A, Bと課題画像の指定


         ゴルジ体   リソソーム




                 ?
             (エンドソーム)
実行のようす: 分類結果の表示等




             R engine に渡した R script
           → 後で R コンソールで検討可能.

分類




 8 vs 83
ゴルジ体                リソソーム




           エンドソームの分類状況(一部)    リソソームぽい
       ゴルジ体ぽい
                8 vs 83

エンドソームは今回の特徴量と分類法と
画像セットでは,ゴルジ体よりリソソームに
似た局在をしている.
Next...

クラスタリングについて
当研究室の湖城さんから

Más contenido relacionado

La actualidad más candente

5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
Nagi Teramo
 
比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!
takehikoihayashi
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木
Miyoshi Yuya
 
Rで階層ベイズモデル
Rで階層ベイズモデルRで階層ベイズモデル
Rで階層ベイズモデル
Yohei Sato
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
Nagi Teramo
 

La actualidad más candente (20)

5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
 
ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜
ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜
ImageJを使った画像解析実習〜大量の画像データに対する処理の自動化〜
 
pymcとpystanでベイズ推定してみた話
pymcとpystanでベイズ推定してみた話pymcとpystanでベイズ推定してみた話
pymcとpystanでベイズ推定してみた話
 
比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!
 
GEE(一般化推定方程式)の理論
GEE(一般化推定方程式)の理論GEE(一般化推定方程式)の理論
GEE(一般化推定方程式)の理論
 
非劣性試験の入門
非劣性試験の入門非劣性試験の入門
非劣性試験の入門
 
Rで学ぶ回帰分析と単位根検定
Rで学ぶ回帰分析と単位根検定Rで学ぶ回帰分析と単位根検定
Rで学ぶ回帰分析と単位根検定
 
ImageJを使った画像解析実習〜2値化・領域抽出〜
ImageJを使った画像解析実習〜2値化・領域抽出〜ImageJを使った画像解析実習〜2値化・領域抽出〜
ImageJを使った画像解析実習〜2値化・領域抽出〜
 
パターン認識 第10章 決定木
パターン認識 第10章 決定木 パターン認識 第10章 決定木
パターン認識 第10章 決定木
 
Rでのtry関数によるエラー処理
Rでのtry関数によるエラー処理Rでのtry関数によるエラー処理
Rでのtry関数によるエラー処理
 
チュートリアル:細胞画像を使った初めてのディープラーニング
チュートリアル:細胞画像を使った初めてのディープラーニングチュートリアル:細胞画像を使った初めてのディープラーニング
チュートリアル:細胞画像を使った初めてのディープラーニング
 
Rで階層ベイズモデル
Rで階層ベイズモデルRで階層ベイズモデル
Rで階層ベイズモデル
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
 
Rによるprincomp関数を使わない主成分分析
Rによるprincomp関数を使わない主成分分析Rによるprincomp関数を使わない主成分分析
Rによるprincomp関数を使わない主成分分析
 
Semi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learningSemi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learning
 
PRMLの線形回帰モデル(線形基底関数モデル)
PRMLの線形回帰モデル(線形基底関数モデル)PRMLの線形回帰モデル(線形基底関数モデル)
PRMLの線形回帰モデル(線形基底関数モデル)
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について
 
Rによる分類木 入門
Rによる分類木 入門Rによる分類木 入門
Rによる分類木 入門
 
正準相関分析
正準相関分析正準相関分析
正準相関分析
 
生成モデルの Deep Learning
生成モデルの Deep Learning生成モデルの Deep Learning
生成モデルの Deep Learning
 

Similar a Kashiwa.R#1 画像解析とパターン認識における R の利用

画像処理でのPythonの利用
画像処理でのPythonの利用画像処理でのPythonの利用
画像処理でのPythonの利用
Yasutomo Kawanishi
 
How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)
sleipnir002
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
Shintaro Fukushima
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
AV 画像認識とその周辺 - UT Startup Gym 講演資料
AV 画像認識とその周辺 - UT Startup Gym 講演資料AV 画像認識とその周辺 - UT Startup Gym 講演資料
AV 画像認識とその周辺 - UT Startup Gym 講演資料
ぱろすけ
 

Similar a Kashiwa.R#1 画像解析とパターン認識における R の利用 (20)

Opencv object detection_takmin
Opencv object detection_takminOpencv object detection_takmin
Opencv object detection_takmin
 
C#のすばらしさを語る会用
C#のすばらしさを語る会用C#のすばらしさを語る会用
C#のすばらしさを語る会用
 
画像処理でのPythonの利用
画像処理でのPythonの利用画像処理でのPythonの利用
画像処理でのPythonの利用
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群
 
introduce "Stealing Machine Learning Models via Prediction APIs"
introduce "Stealing Machine Learning Models  via Prediction APIs"introduce "Stealing Machine Learning Models  via Prediction APIs"
introduce "Stealing Machine Learning Models via Prediction APIs"
 
MIRU2018 tutorial
MIRU2018 tutorialMIRU2018 tutorial
MIRU2018 tutorial
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
画像認識で物を見分ける
画像認識で物を見分ける画像認識で物を見分ける
画像認識で物を見分ける
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
AV 画像認識とその周辺 - UT Startup Gym 講演資料
AV 画像認識とその周辺 - UT Startup Gym 講演資料AV 画像認識とその周辺 - UT Startup Gym 講演資料
AV 画像認識とその周辺 - UT Startup Gym 講演資料
 
2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 

Último

Último (11)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

Kashiwa.R#1 画像解析とパターン認識における R の利用

  • 1. 2011-11-11 Kashiwa.R#1 画像解析とパターン認識における R の利用 くつな なつまろ 朽名 夏麿 (東京大学 大学院新領域創成科学研究科 先端生命科学専攻)
  • 2. 生物画像解析の特性 多次元 (時間,立体,波長…) 多様性(生物種,部位,観察法…) t, z, l データサイズ・枚数 (n) 多目的性 (何に着目するか) 100 ms/枚 位置・局在 濃度・電位 運動 数・形・長さ 1024*1024 pixel/枚 12 bits/pixel → 4 GiBytes / 5 分 自動化・計算機支援に向く 研究者(人間)の柔軟性が不可欠 AI?? パターン認識?? 機械学習?? データマイニング?? ・ 多様な画像と目的をカバーできる適応性・汎用性 ・ 数値化による客観性,自動化による高速性
  • 3. シロイヌナズナ気孔 アクチン繊維 「画像→画像」の例 共焦点画像 高周波数成分の抽出 二値化像 細線化像 (繊維等の強調処理) (白黒画像) 「画像→数値」の例 気孔開閉の指標 アクチン繊維の配向の指標 短径 / 長径 長径 気孔に対する アクチン繊維の角度 q 短径 q 気孔 灰色: 気孔領域 この場合, この場合, 黒色: アクチン繊維 短径 / 長径=0.47 アクチン繊維の角度=54.3°
  • 4. 159 デジタル画像は数値が並んだもの 153 x (3, 0) 輝度30 (x,y) = (0, 0) (3, 2) 輝度 35 輝度 21 y 159列 表示を縮小 153行
  • 5. 画像処理・画像解析のソフトウェアツールと要件 NIH Image/Scion Image/ImageJ Photoshop 採用されている画像や処理のモデル GIMP 拡張性 MetaMorph 可搬性 OpenCV インタラクティビティ(REPL,GUI) VTK (Mayavi, ParaView) フリーソフトウェア,オープンソース Amira ユーザの多さ,情報の多さ MATLAB, Octave 開発状況 速度や記憶量.スケールするか. ImageMagick CImg Python Imaging Library (PIL) : R
  • 6. ImageJ Java .オープンソース.NIH の人が開発.生物学分野で多用される. 拡張性: * 独自仕様のマクロ * Java等JVM用言語でのプラグイン * JavaプラットフォームでのAPI 可搬性・速度・スケール性: * Java に準ずる. 画像のモデルがバイオ向き * 画素について u8, u16, float ... * Z軸,時間軸でのスタック化 (3次元以上の高次元画像) 以降の顕微鏡画像は全て http://ome.grc.nia.nih.gov/iicbu2008/ (IICBUデータベース) より取得.
  • 7. ImageJ plugins http://rsbweb.nih.gov/ij/plugins/ (ImageJ 公式サイト内) このサイトだけでも500個以上のプラグインが紹介されている. Java ソースかクラスファイルか JAR 形式.
  • 8. Java による ImageJ plugin 生物画像解析のニーズは多彩すぎており, 探すよりも書く方が早く済むことも多い.
  • 12.
  • 16. 生物画像解析における R の使いどころ 画像処理 画像処理 画像処理 画像からの測定 画像からの測定 画像の読込 データ解析 データ解析 画像データの生成 (シミュレーション等)
  • 17. ImageJ から R を使うには ?
  • 18. Rserve: TCP/IP を介した R の利用 connect R console と ImageJ を別プロセスで動かしつつ, ImageJ データのやりとりをすることができれば R 便利そうなので,そのうちトライしたい. (Java) http://www.rforge.net/Rserve/
  • 19. rJava: R から Java を呼出す JRI: Java から R を呼出す call ImageJ これを使って ImageJ と R をむすんだ R プロダクトを簡単に 2 つ紹介します. (Java) call http://www.rforge.net/rJava/
  • 20. RImageJ: R から ImageJ を呼出す R で実質6行のパッケージ. これだけでも ImageJ マクロのサブセット が R コンソールから使える. インタラクティブな操作は不明. http://romainfrancois.blog.free.fr/index.php?post/2009/06/22/using-ImageJ-from-R%3A-the-RImageJ-package
  • 21. Bio7: ImageJ と R,その他を統合 ImageJ や R の良さが一部 失なわれているように思う. あと挙動が怪しい気が…?
  • 22. JRI (Java → R) を試す 導入 (ubuntuの場合) export R_HOME=/usr/lib/R export CLASSPATH=${CLASSPATH}:${R_HOME}/site-library/rJava/jri/JRI.jar export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${R_HOME}/site-library/rJava/jri % sudo apt-get install r-cran-rjava 試用 % scala scala> val engine=new org.rosuda.JRI.Rengine(Array("--no-save"),false,null) engine: org.rosuda.JRI.Rengine = Thread[Thread-4,5,main] Rは別のJavaスレッドで動く scala> engine.eval("sum(iris$Sepal.Length)").asDouble res0: Double = 876.5 scala> engine.eval("iris$Sepal.Length").asDoubleArray.sum res1: Double = 876.5000000000002 これを使って ImageJ から R を使ってみることにした.
  • 23. ImageJ から R を使って画像の学習と分類をする ? ゴルジ体 リソソーム 課題画像 4. 教師データから分類森を作り, 教師画像群 課題データを分類 ImageJ randomForest package 1. 画像 7. 表示 3. 特徴等 5. 分類結果 今回の plugin R 2. 特徴等 6. 分類結果 JRI (Java/R) JNI (Java/C)
  • 24. 今回のプラグインのソースリスト (一部) object Ijp extends KbiPlugIn { private val imgClassA = arg("imgClassA", KbiGenericDialogObj.Choice.empty) private val imgClassB = arg("imgClassB", KbiGenericDialogObj.Choice.empty) def config(argStr: String): Option[() => Any] = runWith(imp => { val winList = KbiWinListObj.all() imgClassA.resetChoice(winList) ユーザに教師画像を imgClassB.resetChoice(winList) input(imgClassA, imgClassB) 2セット(A, B)指定してもらう. def idx2imp(idx: Int): Imp = winList.getImpFromIdx(idx) match { case null => KbiExc("image not found") case imp => imp } new TrainAndClassifier(idx2imp(imgClassA().idx), idx2imp(imgClassB().idx)) }) } R engine の管理. private object Rengine { R は初回使用時のみ初期化する. private lazy val engine = new org.rosuda.JRI.Rengine(Array("--no-save"), false, null) def eval(s: String): org.rosuda.JRI.REXP = engine.eval(s) }
  • 25. private class TrainAndClassifier(impA: Imp, impB: Imp) extends ProcNotShow { private val featureExtractor = str2featureSet("glcmPlain") private val vectorsA = ips2features(UtilImg.ist2ips(impA.getStack)) private val vectorsB = ips2features(UtilImg.ist2ips(impB.getStack)) private val nDim = vectorsA(0).size 教師画像からの特徴抽出 private def ips2features(ips: Array[Ip]) = for (ip <- ips) yield featureExtractor.extract(ip).values.drop(2).toArray def proc(istQ: Ist, impQ: Imp, kpl: KbiPlugIn) { val ipsQ = UtilImg.ist2ips(istQ) val vectorsQ = ips2features(ipsQ) 課題画像からの特徴抽出 val cmdsForR = Util.withArrBuf[String](acc => { def addVectorStr(i: Int) { acc += "tf%d <- c(%s,%s)".format(i, vectorsA.map(_(i)).mkString(","), vectorsB.map(_(i)).mkString(",")) acc += "qf%d <- c(%s)".format(i, vectorsQ.map(_(i)).mkString(",")) } acc += "library(randomForest)" R に渡すコマンドを生成 for (i <- 0 until nDim) addVectorStr(i) acc += "imgClass <- c(%s,%s)".format( (学習と分類) Array.fill(vectorsA.size)("'A'").mkString(","), Array.fill(vectorsB.size)("'B'").mkString(",")) acc += "dTeach <- data.frame(%s,imgClass)".format((0 until nDim).map(n => "f%d=tf%d".format(n, n)).mkString(",")) acc += "dQuery <- data.frame(%s)".format((0 until nDim).map(n => "f%d=qf%d".format(n, n)).mkString(",")) acc += "rf <- randomForest(formula=imgClass ~., data=dTeach)" acc += "predicted <- as.integer(predict(rf, dQuery))" })
  • 26. cmdsForR.forall(cmd => Rengine.eval(cmd) != null) match { case false => KbiExc("error occurred in R") R の呼出 case true => { val predicted = Rengine.eval("predicted").asIntArray KbiExc.assert(predicted != null, "error occurred in R: predicted") val (ipsEstA, ipsEstB) = Util.withArrBuf[Ip, Ip]((accA, accB) => for ((lbl, idx) <- predicted.zipWithIndex) lbl match { case 1 => accA += ipsQ(idx) case 2 => accB += ipsQ(idx) 分類結果に応じて }) if (ipsEstA.size > 0) UtilImg.show(ipsEstA) 課題画像を } if (ipsEstB.size > 0) UtilImg.show(ipsEstB) 2つに分けて表示. } } } 今回は R script を生成するために double[] a = { 1.2, 2.4, 3.6 }; を String s = String.format("f1 <- c(%g, %g, %g)", a[0]… Rengine.eval(s); のようにデータを文字列中に埋め込んでから評価しているが, Rengine.assign("f1", array); の方が速度や誤差の面では望ましい.
  • 27. 実行のようす: 教師画像群A, Bと課題画像の指定 ゴルジ体 リソソーム ? (エンドソーム)
  • 28. 実行のようす: 分類結果の表示等 R engine に渡した R script → 後で R コンソールで検討可能. 分類 8 vs 83
  • 29. ゴルジ体 リソソーム エンドソームの分類状況(一部) リソソームぽい ゴルジ体ぽい 8 vs 83 エンドソームは今回の特徴量と分類法と 画像セットでは,ゴルジ体よりリソソームに 似た局在をしている.