SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
第2回「コンピュータビジョン最先端
     ガイド」勉強会
       5.1-5.2章
    presented by takmin
5. グラフカットによる大域最小化
• この章の目的
 – データ項+平滑化項で表される以下のエネル
   ギーを最小切断アルゴリズムを使って,最小化す
   る


E( X )   gv ( X v )      h         uv   (Xu, Xv)
         vV              ( u ,v )E
この章の流れ
• 2値の場合
 – 5.1 2値の大域最小化
 – 5.2 実装例
• 大域最小解を持つための辺の重みの決め方
 – 5.3 劣モジュラ条件
 – 5.4 劣モジュラでないとき:QPBO
• 多値の場合
 – 5.5 多値の大域最小化
 – 5.6 実装例
 – 5.7 一般の凸な平滑化項
5.1 2値の大域最小化
  E( X )   gv ( X v )      h         uv   (Xu, Xv)
           vV              ( u ,v )E



 このエネルギーの大域最小化を行う


問題をグラフで表し,最小切断問題として解く
グラフの構築
       E( X )   gv ( X v )      h         uv   (Xu, Xv)
                vV              ( u ,v )E

頂点を設定: V1  wv | v  V 




wv
グラフの構築
    E( X )   gv ( X v )          h         uv   (Xu, Xv)
             vV                  ( u ,v )E

頂点s,tを追加:   V  V1  s, t
                              t




                          S
グラフの構築
          E( X )   gv ( X v )               h      uv   (Xu, Xv)
                      vV                 ( u ,v )E

辺を追加:  1  ( s, wv ), ( wv , t ) | v  V 
                                      t




                                     S
グラフの構築
        E( X )   gv ( X v )           h       uv   (Xu, Xv)
                    vV              ( u ,v )E

辺を追加:  2  ( wu , wv ) | (u, v)  E
                                 t




      完成!
                                S
グラフの切断
         E( X )   gv ( X v )           h         uv   (Xu, Xv)
                     vV                ( u ,v )E

このグラフの任意の切断(S,T)について:
     0  v  Sのとき
        (w       )
Xv                                t
     1  v  Tのとき
        (w       )



     0           1              0              0              1      1
                wv         wu



                                    S
グラフの切断
              E( X )   gv ( X v )                     h         uv   (Xu, Xv)
                                vV                    ( u ,v )E

   各辺の切断コストを定義:
                           c( wv , t )  g v (0)
                                                   t
c( wu , wv )  huv (0,1)  hvu (1,0)



                             wv            wu


    c( s, wv )  g v (1)
                                                   S
グラフの切断
       E( X )   gv ( X v )      h         uv   (Xu, Xv)
                   vV           ( u ,v )E

切断されたsからtへ向かう辺の切断コストの和とEは等しい
                             t




   0           1         0              0              1      1




                             S
ノイズ除去の例
                                                 
         E ( X )    Yv  X v                    Xu  Xv   (2)
                  vV               ( u ,v )E   2
     エネルギーを計算する

                                                     
     E (X )  (0    0  0  0  0)   0  1  1  0 
                                        2       2      
              
Yv


Xv
ノイズ除去の例
                                                                    
             E ( X )    Yv  X v                                   Xu  Xv         (2)
                           vV                         ( u ,v )E   2
      グラフカットで切断コストを計算する

c( s, wv )   Yv  1
                                           t
c( wv , t )   Yv  0
c( wu , wv )             0                                                λ
                                  λ    0                   0            λ
                   κ             κ             κ                    κ           κ
 Yv
                       κ           κ               κ                    κ           κ

                       λ         0     λ                  λ             0
                                                                                0

                                           S
ノイズ除去の例
                                                         
     E ( X )    Yv  X v                                Xu  Xv         (2)
                vV                         ( u ,v )E   2
     E(X )  0    0  0    0  0    
                                t

                0                                                λ
                       λ    0                   0            λ
        κ             κ             κ                    κ           κ
Yv
            κ           κ               κ                    κ           κ

            λ         0     λ                  λ             0
                                                                     0

                                S
2次元の場合
2次元の場合
3次元の場合
5.2 実装例
• GCライブラリ入手先
 – Vladimir Kolmogorovさんのページ
 – http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/
 – Max Flowライブラリをダウンロード
ライブラリ入手先
Vladimir Kolmogorovさんのページ




        http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/
ソース
void NR2(unsigned char* X, unsigned char* Y, int m, int n)
{
                typedef Graph<int,int,int> GraphType;
                int lambda=100;
                int kappa = 25;
                GraphType* g = new GraphType(n*m, 4*n*m);     // 頂点と辺の概数
                g->add_node(n*m);                    // 画素の数だけ頂点を作る

              int dx[4] = {1,-1,0,1};
              int dy[4] = {0, 1, 1, 1};
              for(int j=0; j<m; j++){
                                  for(int i=0; i<n; i++){
                                                      int g0 = *(Y + n*j + i) * lambda; //g(0)
                                                      int g1 = (1-*(Y + n*j + i)) * lambda; // g(1)
                                                      g->add_tweights(j*n+i,g1,g0);         // (i,j)の頂点はnj+i番目
                                                      for(int d=0; d<4; d++){
                                                                         int x = i + dx[d];
                                                                         int y = j + dy[d];
                                                                         if(0<=x && 0<=y && x<n && y<m){
                                                                                            g->add_edge(j*n+i,y*n+x,kappa,kappa);   // 両方向
                                                                         }
                                                      }
                                  }
              }
              g->maxflow();
              for(int j=0; j<m; j++){
                                  for(int i=0; i<n; i++){
                                                      if(g->what_segment(j*n+i)==GraphType::SOURCE)
                                                                         *(X + n*j + i)=0;
                                                      else
                                                                         *(X + n*j + i)=1;
                                  }
              }
              delete g;
}
手順
1. GraphTypeインスタンス生成
 – GraphType* g = new GraphType(n*m, n*m*4);
                                               頂点の   辺の概数
                                               概数

2. 画素の数だけ頂点を作る
 – g->add_node(n*m);


3. データ項(=C(s, wv),C(wv,t))を設定
 – g->add_tweights(j*n+i, g1, g0)
                      wu   c(s, wv) c(wv, t)
手順
4. 頂点間の辺を作成(双方向)
 – g->add_edge (j*n+i, y*n+x, kappa, kappa);
                   wu    wv    c(wu, wv)   c(wv, wu)


5. 最小切断(最大流)を求める
 – g->maxflow();

6. 各頂点でs,tのどちらが切断されたかを結果
   に格納
 – g->what_segment(j*n+i)
結果
最後に
• 図は,石川先生の講演資料から拝借しました。
 – http://w01.tp1.jp/~a031464501/indexJ.html

Weitere ähnliche Inhalte

Was ist angesagt?

Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説kuno4n
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform信之 岩永
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Inc.
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
Shunsuke Horii
Shunsuke HoriiShunsuke Horii
Shunsuke HoriiSuurist
 
シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰Katsuhiro Morishita
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Inc.
 
足し算をつくろう
足し算をつくろう足し算をつくろう
足し算をつくろうYoichi Toyota
 
AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Inc.
 
MySQLのバックアップ運用について色々
MySQLのバックアップ運用について色々MySQLのバックアップ運用について色々
MySQLのバックアップ運用について色々yoku0825
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 

Was ist angesagt? (20)

Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
Shunsuke Horii
Shunsuke HoriiShunsuke Horii
Shunsuke Horii
 
シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰シリーズML-07 ニューラルネットワークによる非線形回帰
シリーズML-07 ニューラルネットワークによる非線形回帰
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
Fractional cascading
Fractional cascadingFractional cascading
Fractional cascading
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
1 introduction.key
1 introduction.key1 introduction.key
1 introduction.key
 
2
22
2
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
足し算をつくろう
足し算をつくろう足し算をつくろう
足し算をつくろう
 
AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Regular Contest 001
AtCoder Regular Contest 001
 
MySQLのバックアップ運用について色々
MySQLのバックアップ運用について色々MySQLのバックアップ運用について色々
MySQLのバックアップ運用について色々
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 

Ähnlich wie Graph cut5.1 5.2_takmin

今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシンShinya Shimizu
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装するShuhei Iitsuka
 
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) Takahiro (Poly) Horikawa
 
クラシックな機械学習の入門 3. 線形回帰および識別
クラシックな機械学習の入門 3. 線形回帰および識別クラシックな機械学習の入門 3. 線形回帰および識別
クラシックな機械学習の入門 3. 線形回帰および識別Hiroshi Nakagawa
 
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう 「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう Junpei Tsuji
 
introductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisTatsuki SHIMIZU
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 

Ähnlich wie Graph cut5.1 5.2_takmin (18)

prml4.1.3-4.1.4
prml4.1.3-4.1.4prml4.1.3-4.1.4
prml4.1.3-4.1.4
 
Re revenge chap03-1
Re revenge chap03-1Re revenge chap03-1
Re revenge chap03-1
 
今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン
 
Prml 4.1.1
Prml 4.1.1Prml 4.1.1
Prml 4.1.1
 
Ppt minagawa
Ppt minagawaPpt minagawa
Ppt minagawa
 
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
 
Linera lgebra
Linera lgebraLinera lgebra
Linera lgebra
 
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
 
2013 03 25
2013 03 252013 03 25
2013 03 25
 
Master Thesis
Master ThesisMaster Thesis
Master Thesis
 
クラシックな機械学習の入門 3. 線形回帰および識別
クラシックな機械学習の入門 3. 線形回帰および識別クラシックな機械学習の入門 3. 線形回帰および識別
クラシックな機械学習の入門 3. 線形回帰および識別
 
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう 「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
「3.1.2最小二乗法の幾何学」PRML勉強会4 @筑波大学 #prml学ぼう
 
分布 isseing333
分布 isseing333分布 isseing333
分布 isseing333
 
数式からみるWord2Vec
数式からみるWord2Vec数式からみるWord2Vec
数式からみるWord2Vec
 
introductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysis
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
Topic model
Topic modelTopic model
Topic model
 
PRML Chapter5.2
PRML Chapter5.2PRML Chapter5.2
PRML Chapter5.2
 

Mehr von Takuya Minagawa

Machine Learning Operations (MLOps): Overview, Definition, and Architecture
Machine Learning Operations (MLOps): Overview, Definition, and ArchitectureMachine Learning Operations (MLOps): Overview, Definition, and Architecture
Machine Learning Operations (MLOps): Overview, Definition, and ArchitectureTakuya Minagawa
 
点群SegmentationのためのTransformerサーベイ
点群SegmentationのためのTransformerサーベイ点群SegmentationのためのTransformerサーベイ
点群SegmentationのためのTransformerサーベイTakuya Minagawa
 
Learning to Solve Hard Minimal Problems
Learning to Solve Hard Minimal ProblemsLearning to Solve Hard Minimal Problems
Learning to Solve Hard Minimal ProblemsTakuya Minagawa
 
ConditionalPointDiffusion.pdf
ConditionalPointDiffusion.pdfConditionalPointDiffusion.pdf
ConditionalPointDiffusion.pdfTakuya Minagawa
 
楽しいコンピュータビジョンの受託仕事
楽しいコンピュータビジョンの受託仕事楽しいコンピュータビジョンの受託仕事
楽しいコンピュータビジョンの受託仕事Takuya Minagawa
 
20200910コンピュータビジョン今昔物語(JPTA講演資料)
20200910コンピュータビジョン今昔物語(JPTA講演資料)20200910コンピュータビジョン今昔物語(JPTA講演資料)
20200910コンピュータビジョン今昔物語(JPTA講演資料)Takuya Minagawa
 
2020/07/04 BSP-Net (CVPR2020)
2020/07/04 BSP-Net (CVPR2020)2020/07/04 BSP-Net (CVPR2020)
2020/07/04 BSP-Net (CVPR2020)Takuya Minagawa
 
20190706cvpr2019_3d_shape_representation
20190706cvpr2019_3d_shape_representation20190706cvpr2019_3d_shape_representation
20190706cvpr2019_3d_shape_representationTakuya Minagawa
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summaryTakuya Minagawa
 
20190131 lidar-camera fusion semantic segmentation survey
20190131 lidar-camera fusion semantic segmentation survey20190131 lidar-camera fusion semantic segmentation survey
20190131 lidar-camera fusion semantic segmentation surveyTakuya Minagawa
 
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentationTakuya Minagawa
 
run Keras model on opencv
run Keras model on opencvrun Keras model on opencv
run Keras model on opencvTakuya Minagawa
 
20181130 lidar object detection survey
20181130 lidar object detection survey20181130 lidar object detection survey
20181130 lidar object detection surveyTakuya Minagawa
 
object detection with lidar-camera fusion: survey (updated)
object detection with lidar-camera fusion: survey (updated)object detection with lidar-camera fusion: survey (updated)
object detection with lidar-camera fusion: survey (updated)Takuya Minagawa
 

Mehr von Takuya Minagawa (20)

Machine Learning Operations (MLOps): Overview, Definition, and Architecture
Machine Learning Operations (MLOps): Overview, Definition, and ArchitectureMachine Learning Operations (MLOps): Overview, Definition, and Architecture
Machine Learning Operations (MLOps): Overview, Definition, and Architecture
 
MobileNeRF
MobileNeRFMobileNeRF
MobileNeRF
 
点群SegmentationのためのTransformerサーベイ
点群SegmentationのためのTransformerサーベイ点群SegmentationのためのTransformerサーベイ
点群SegmentationのためのTransformerサーベイ
 
Learning to Solve Hard Minimal Problems
Learning to Solve Hard Minimal ProblemsLearning to Solve Hard Minimal Problems
Learning to Solve Hard Minimal Problems
 
ConditionalPointDiffusion.pdf
ConditionalPointDiffusion.pdfConditionalPointDiffusion.pdf
ConditionalPointDiffusion.pdf
 
楽しいコンピュータビジョンの受託仕事
楽しいコンピュータビジョンの受託仕事楽しいコンピュータビジョンの受託仕事
楽しいコンピュータビジョンの受託仕事
 
20210711 deepI2P
20210711 deepI2P20210711 deepI2P
20210711 deepI2P
 
20201010 personreid
20201010 personreid20201010 personreid
20201010 personreid
 
20200910コンピュータビジョン今昔物語(JPTA講演資料)
20200910コンピュータビジョン今昔物語(JPTA講演資料)20200910コンピュータビジョン今昔物語(JPTA講演資料)
20200910コンピュータビジョン今昔物語(JPTA講演資料)
 
2020/07/04 BSP-Net (CVPR2020)
2020/07/04 BSP-Net (CVPR2020)2020/07/04 BSP-Net (CVPR2020)
2020/07/04 BSP-Net (CVPR2020)
 
20200704 bsp net
20200704 bsp net20200704 bsp net
20200704 bsp net
 
20190825 vins mono
20190825 vins mono20190825 vins mono
20190825 vins mono
 
20190706cvpr2019_3d_shape_representation
20190706cvpr2019_3d_shape_representation20190706cvpr2019_3d_shape_representation
20190706cvpr2019_3d_shape_representation
 
20190307 visualslam summary
20190307 visualslam summary20190307 visualslam summary
20190307 visualslam summary
 
Visual slam
Visual slamVisual slam
Visual slam
 
20190131 lidar-camera fusion semantic segmentation survey
20190131 lidar-camera fusion semantic segmentation survey20190131 lidar-camera fusion semantic segmentation survey
20190131 lidar-camera fusion semantic segmentation survey
 
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
2018/12/28 LiDARで取得した道路上点群に対するsemantic segmentation
 
run Keras model on opencv
run Keras model on opencvrun Keras model on opencv
run Keras model on opencv
 
20181130 lidar object detection survey
20181130 lidar object detection survey20181130 lidar object detection survey
20181130 lidar object detection survey
 
object detection with lidar-camera fusion: survey (updated)
object detection with lidar-camera fusion: survey (updated)object detection with lidar-camera fusion: survey (updated)
object detection with lidar-camera fusion: survey (updated)
 

Graph cut5.1 5.2_takmin

  • 1. 第2回「コンピュータビジョン最先端 ガイド」勉強会 5.1-5.2章 presented by takmin
  • 2. 5. グラフカットによる大域最小化 • この章の目的 – データ項+平滑化項で表される以下のエネル ギーを最小切断アルゴリズムを使って,最小化す る E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E
  • 3. この章の流れ • 2値の場合 – 5.1 2値の大域最小化 – 5.2 実装例 • 大域最小解を持つための辺の重みの決め方 – 5.3 劣モジュラ条件 – 5.4 劣モジュラでないとき:QPBO • 多値の場合 – 5.5 多値の大域最小化 – 5.6 実装例 – 5.7 一般の凸な平滑化項
  • 4. 5.1 2値の大域最小化 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E このエネルギーの大域最小化を行う 問題をグラフで表し,最小切断問題として解く
  • 5. グラフの構築 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 頂点を設定: V1  wv | v  V  wv
  • 6. グラフの構築 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 頂点s,tを追加: V  V1  s, t t S
  • 7. グラフの構築 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 辺を追加:  1  ( s, wv ), ( wv , t ) | v  V  t S
  • 8. グラフの構築 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 辺を追加:  2  ( wu , wv ) | (u, v)  E t 完成! S
  • 9. グラフの切断 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E このグラフの任意の切断(S,T)について: 0  v  Sのとき (w ) Xv   t 1  v  Tのとき (w ) 0 1 0 0 1 1 wv wu S
  • 10. グラフの切断 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 各辺の切断コストを定義: c( wv , t )  g v (0) t c( wu , wv )  huv (0,1)  hvu (1,0) wv wu c( s, wv )  g v (1) S
  • 11. グラフの切断 E( X )   gv ( X v )  h uv (Xu, Xv) vV ( u ,v )E 切断されたsからtへ向かう辺の切断コストの和とEは等しい t 0 1 0 0 1 1 S
  • 12. ノイズ除去の例  E ( X )    Yv  X v   Xu  Xv (2) vV ( u ,v )E 2 エネルギーを計算する    E (X )  (0    0  0  0  0)   0  1  1  0  2 2     Yv Xv
  • 13. ノイズ除去の例  E ( X )    Yv  X v   Xu  Xv (2) vV ( u ,v )E 2 グラフカットで切断コストを計算する c( s, wv )   Yv  1 t c( wv , t )   Yv  0 c( wu , wv )   0 λ λ 0 0 λ κ κ κ κ κ Yv κ κ κ κ κ λ 0 λ λ 0 0 S
  • 14. ノイズ除去の例  E ( X )    Yv  X v   Xu  Xv (2) vV ( u ,v )E 2 E(X )  0    0  0    0  0     t 0 λ λ 0 0 λ κ κ κ κ κ Yv κ κ κ κ κ λ 0 λ λ 0 0 S
  • 18. 5.2 実装例 • GCライブラリ入手先 – Vladimir Kolmogorovさんのページ – http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/ – Max Flowライブラリをダウンロード
  • 19. ライブラリ入手先 Vladimir Kolmogorovさんのページ http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/
  • 20. ソース void NR2(unsigned char* X, unsigned char* Y, int m, int n) { typedef Graph<int,int,int> GraphType; int lambda=100; int kappa = 25; GraphType* g = new GraphType(n*m, 4*n*m); // 頂点と辺の概数 g->add_node(n*m); // 画素の数だけ頂点を作る int dx[4] = {1,-1,0,1}; int dy[4] = {0, 1, 1, 1}; for(int j=0; j<m; j++){ for(int i=0; i<n; i++){ int g0 = *(Y + n*j + i) * lambda; //g(0) int g1 = (1-*(Y + n*j + i)) * lambda; // g(1) g->add_tweights(j*n+i,g1,g0); // (i,j)の頂点はnj+i番目 for(int d=0; d<4; d++){ int x = i + dx[d]; int y = j + dy[d]; if(0<=x && 0<=y && x<n && y<m){ g->add_edge(j*n+i,y*n+x,kappa,kappa); // 両方向 } } } } g->maxflow(); for(int j=0; j<m; j++){ for(int i=0; i<n; i++){ if(g->what_segment(j*n+i)==GraphType::SOURCE) *(X + n*j + i)=0; else *(X + n*j + i)=1; } } delete g; }
  • 21. 手順 1. GraphTypeインスタンス生成 – GraphType* g = new GraphType(n*m, n*m*4); 頂点の 辺の概数 概数 2. 画素の数だけ頂点を作る – g->add_node(n*m); 3. データ項(=C(s, wv),C(wv,t))を設定 – g->add_tweights(j*n+i, g1, g0) wu c(s, wv) c(wv, t)
  • 22. 手順 4. 頂点間の辺を作成(双方向) – g->add_edge (j*n+i, y*n+x, kappa, kappa); wu wv c(wu, wv) c(wv, wu) 5. 最小切断(最大流)を求める – g->maxflow(); 6. 各頂点でs,tのどちらが切断されたかを結果 に格納 – g->what_segment(j*n+i)