SlideShare a Scribd company logo
1 of 30
Download to read offline
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...

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

More Related Content

What's hot

CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法Hirokatsu Kataoka
 
[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learningDeep Learning JP
 
DNAマイクロアレイの解析と多重検定補正
DNAマイクロアレイの解析と多重検定補正DNAマイクロアレイの解析と多重検定補正
DNAマイクロアレイの解析と多重検定補正弘毅 露崎
 
GAN(と強化学習との関係)
GAN(と強化学習との関係)GAN(と強化学習との関係)
GAN(と強化学習との関係)Masahiro Suzuki
 
機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論Taiji Suzuki
 
【DL輪読会】HyperTree Proof Search for Neural Theorem Proving
【DL輪読会】HyperTree Proof Search for Neural Theorem Proving【DL輪読会】HyperTree Proof Search for Neural Theorem Proving
【DL輪読会】HyperTree Proof Search for Neural Theorem ProvingDeep Learning JP
 
一般化線形混合モデル isseing333
一般化線形混合モデル isseing333一般化線形混合モデル isseing333
一般化線形混合モデル isseing333Issei Kurahashi
 
相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心takehikoihayashi
 
Curriculum Learning (関東CV勉強会)
Curriculum Learning (関東CV勉強会)Curriculum Learning (関東CV勉強会)
Curriculum Learning (関東CV勉強会)Yoshitaka Ushiku
 
遺伝的アルゴリズム・遺伝的プログラミング
遺伝的アルゴリズム・遺伝的プログラミング遺伝的アルゴリズム・遺伝的プログラミング
遺伝的アルゴリズム・遺伝的プログラミングMatsuiRyo
 
[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論Deep Learning JP
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門joisino
 
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)Shota Imai
 
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process ModelsDeep Learning JP
 
強化学習と逆強化学習を組み合わせた模倣学習
強化学習と逆強化学習を組み合わせた模倣学習強化学習と逆強化学習を組み合わせた模倣学習
強化学習と逆強化学習を組み合わせた模倣学習Eiji Uchibe
 
Deep State Space Models for Time Series Forecasting の紹介
Deep State Space Models for Time Series Forecasting の紹介Deep State Space Models for Time Series Forecasting の紹介
Deep State Space Models for Time Series Forecasting の紹介Chihiro Kusunoki
 
強化学習その3
強化学習その3強化学習その3
強化学習その3nishio
 
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR  #11「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR  #11
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11Koichi Hamada
 

What's hot (20)

CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
 
[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning
 
DNAマイクロアレイの解析と多重検定補正
DNAマイクロアレイの解析と多重検定補正DNAマイクロアレイの解析と多重検定補正
DNAマイクロアレイの解析と多重検定補正
 
GAN(と強化学習との関係)
GAN(と強化学習との関係)GAN(と強化学習との関係)
GAN(と強化学習との関係)
 
機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論機械学習におけるオンライン確率的最適化の理論
機械学習におけるオンライン確率的最適化の理論
 
【DL輪読会】HyperTree Proof Search for Neural Theorem Proving
【DL輪読会】HyperTree Proof Search for Neural Theorem Proving【DL輪読会】HyperTree Proof Search for Neural Theorem Proving
【DL輪読会】HyperTree Proof Search for Neural Theorem Proving
 
一般化線形混合モデル isseing333
一般化線形混合モデル isseing333一般化線形混合モデル isseing333
一般化線形混合モデル isseing333
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
Rcppのすすめ
RcppのすすめRcppのすすめ
Rcppのすすめ
 
相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心
 
Curriculum Learning (関東CV勉強会)
Curriculum Learning (関東CV勉強会)Curriculum Learning (関東CV勉強会)
Curriculum Learning (関東CV勉強会)
 
遺伝的アルゴリズム・遺伝的プログラミング
遺伝的アルゴリズム・遺伝的プログラミング遺伝的アルゴリズム・遺伝的プログラミング
遺伝的アルゴリズム・遺伝的プログラミング
 
[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
 
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)
強化学習エージェントの内発的動機付けによる探索とその応用(第4回 統計・機械学習若手シンポジウム 招待公演)
 
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
[DL輪読会]Scalable Training of Inference Networks for Gaussian-Process Models
 
強化学習と逆強化学習を組み合わせた模倣学習
強化学習と逆強化学習を組み合わせた模倣学習強化学習と逆強化学習を組み合わせた模倣学習
強化学習と逆強化学習を組み合わせた模倣学習
 
Deep State Space Models for Time Series Forecasting の紹介
Deep State Space Models for Time Series Forecasting の紹介Deep State Space Models for Time Series Forecasting の紹介
Deep State Space Models for Time Series Forecasting の紹介
 
強化学習その3
強化学習その3強化学習その3
強化学習その3
 
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR  #11「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR  #11
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11
 

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

Opencv object detection_takmin
Opencv object detection_takminOpencv object detection_takmin
Opencv object detection_takminTakuya Minagawa
 
C#のすばらしさを語る会用
C#のすばらしさを語る会用C#のすばらしさを語る会用
C#のすばらしさを語る会用Hideaki Kazaoka
 
画像処理でのPythonの利用
画像処理でのPythonの利用画像処理でのPythonの利用
画像処理でのPythonの利用Yasutomo Kawanishi
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群Norishige Fukushima
 
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"Isao Takaesu
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
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
 
画像認識で物を見分ける
画像認識で物を見分ける画像認識で物を見分ける
画像認識で物を見分けるKazuaki Tanida
 
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 勉強会資料Recruit Technologies
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016kyoto university
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類Tetsuya Hasegawa
 

Similar to 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
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 

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