Comments
Description
Transcript
グラフカット
グラフカット http://www.vision.cs.chubu.ac.jp/ 2011年3月18日 藤吉研究室 中部大学工学部情報工学科 • グラフカットの概要 • グラフカットアルゴリズム • C++による実装 • コンピュータビジョンへの応用例 Graph Cuts [Boykov, PAMI2004] • できること ‒ 1階のマルコフ確率場(Markov Random Field)の 事後確率最大化(エネルギー最小化)する最適化アルゴリズム • 特徴 ‒ 2値ならば必ず大域解が求まる • コンピュータビジョンへの応用例 ‒ ラベリング問題 • Image Restoration, Stereo, Image Segmentation etc... ラベリング問題 • 各サイト(場所)にラベルを割り当てる問題 ‒ Image Restoration → 輝度値 ‒ Stereo → 視差 ‒ Image Segmentation → カテゴリ(物体,背景 etc.) 入力画像 ラベリング結果(領域分割) マルコフ確率場(Markov Random Field) • 無向グラフで確率変数の間の依存関係を表した グラフィカルモデル • ラベルLが与えられたときのエネルギー関数E(L) E(L) = � V1 (Li ) + � V2 (Li , Lj ) + i,j∈P i∈P � i,j,k∈P V3 (Li , Lj , Lk ) + · · · • グラフカットでは1階のエネルギー関数を最適化可能 E(L) = � i∈P V1 (Li ) + � V2 (Li , Lj ) i,j∈P V1(Li) Li V2(Li,Lj) エネルギー最小化問題 • エネルギー関数E(L)が最小となるLを求める問題 • 従来の最適化手法 ‒ Iterated Conditional Model → 局所解に落ち込みやすい ‒ Simulated Annealing → 無限時間かかる可能性(NP困難) • グラフカットアルゴリズム ‒ グラフ理論のネットワーク流問題の解法を利用 ‒ オペレーションズリサーチで利用されていた ‒ ラベルが2値ならば大域最小化が保証 グラフカットアルゴリズム グラフの基礎 • • • • Flow:流れ Capacity:そのEdgeに流すことができるFlowの容量 Source:Flowが発生する場所 Sink:Flowが到着する場所 Network Edge Node Flow 1/1 Source Capacity 4/4 2/6 Sink 1/3 S 2/5 0/2 t 1/3 2/2 2/2 s-t cut • エッジを切断してsとtの部分グラフへ分割 • カットの容量 ‒ s-t cutの間に,sの集合からtの集合へ向かうエッジの容量 1+3+2+2=8 1+5+3=9 1+3+2=6 6+2=8 1 4 6 3 S 5 2 t 3 2 2 最小カットと最大フロー • 目的 ‒ 最小となるs-t cutを見つけた → 最小カット問題 • 最大フロー・最小カットの定理 ‒ 最大フローの値 = 最小カットの値 → 最大フロー問題と最小カット問題は同じ (最大フローが求まれば最小カットも求められる) ネットワーク流問題(最大流問題) • 与えられたネットワークに対して,最大の流れを求める 問題 ‒ Min-Cut/Max-Flow Algorithm • フォードファルカーソン法 (Ford-Fulkerson s method) • プッシュリラベル法 (Push-Relabel method) • New Algorithm by Boykov, etc. 100M 10M 10M 10 sink source 20M 100 10 10M 10 s t 20 10 Ford-Fulkerson's method • フローが最大のときの条件 ‒ 残余ネットワーク上で s-t path が存在しない → s-t pathが存在すればフローは増加可能 Step1:全ての枝のフローを0で初期化 Step2:現在のフローに関する残余ネットワークを作成 Step3:残余ネットワークにs-t pathが存在場合は終了 Step4:残余ネットワークのs-t pathをひとつ求め、 それを用いて現在のフローを更新 Step5:Step2へ戻る 残余ネットワーク • フローが流れているネットワークがあとどれだけの フローを流せるかを表したネットワーク 1/1 4/4 2/6 1/3 S 2/5 0/2 1/3 2/2 2/2 1 2 2 0 2 S 0 4 0 4 残余ネットワーク ネットワーク t 2 1 2 3 2 0 2 1 0 t Ford-Fulkerson‘s methodの例 0/4 0/3 0/2 S 0/3 t 0/2 4 ネットワーク 3 0 0 0 S 0 2 t 0 3 2 残余ネットワーク Ford-Fulkerson‘s methodの例 3/4 3/3 0/2 S 0/3 t 0/2 1 ネットワーク 0 3 3 0 S 0 2 t 0 3 2 残余ネットワーク Ford-Fulkerson‘s methodの例 4/4 3/3 1/2 S 0/3 t 1/2 0 ネットワーク 0 3 4 1 S 0 1 t 1 3 1 残余ネットワーク Ford-Fulkerson‘s methodの例 4/4 3/3 1/2 S 1/3 t 2/2 0 ネットワーク 0 3 4 1 S 1 1 t 2 2 残余ネットワークにs-t pathが存在しない → 最大フロー 5 0 残余ネットワーク 2値MRF最小化のためのグラフ • MRFのエネルギー関数E(L)をグラフで表現 E(L) = � V1 (Li ) + i∈P � V2 (Li , Lj ) i,j∈P t t V1(Li =0) V2(Li,Lj) V1(Li =1) s 1次元データ s 2次元データ MRFのエネルギー関数とs-t cutの関係 E(L) = � V1 (Li ) + i∈P t � V2 (Li , Lj ) i,j∈P V1(Li =0) V2(Li,Lj) V1(Li =0) ×6 V1(Li =1) ×1 V2(Li,Lj) ×1 V1(Li =1) ラベル L 1 0 1 0 V1(Li =0) ×3 V1(Li =1) ×4 V2(Li,Lj) ×3 1 0 s 0 0 1 0 0 0 0 1 → 最小カットからエネルギー関数を最小とするラベルを求められる 多値MRF最小化のためのグラフ • 多値の大域最小化が可能 ‒ 条件:平滑化項が凸 t V1(Li =0) t V1(Li =1) V1(Li =0) V2(Li,Lj) V1(Li =2) V1(Li =3) V1(Li =1) s 2値グラフカット s 多値グラフカット Graph Cutsの拡張手法 • 多値の近似最小化 ‒ 平滑化項が凸である必要がない • α拡張 • α-β交換 • 高階MRFへの拡張 ‒ 高階グラフカット [Ishikawa, CVPR2009] C++による実装 例:2値画像ノイズ除去 • アイデア ‒ 入力画像との変化は小さい ‒ 近隣画素との変化は小さい • エネルギー関数 ‒ データ項:入力画像との差 ‒ 平滑化項:近傍画素との差 E(X) = � i∈P λ|Yi − Xi | + データ項(data term) � (i,j)∈P κ|Xi − Xj | 平滑化項(smoothing term) Y :入力画像 X :出力結果 グラフカットライブラリの入手 • Yuri BoykovのMax-flow/min-cut ‒ http://vision.csd.uwo.ca/code/ ‒ C++により実装 ‒ グラフの作成,maxflowを求めることが可能 ライブラリの使い方 • ヘッダーを読み込む ‒ • #include graph.h 使うクラス,関数 ‒ グラフクラス • Graph<typename captype, typename tcaptype, typename flowtype> ‒ ノードの作成 • add_node(int num) ‒ データ項のエッジを作成 • add_tweights(node_id i, tcaptype cap_source, tcaptype cap_sink) ‒ 平滑化項のエッジを作成 • void add_edge(node_id i, node_id j, captype cap, captype rev_cap) ‒ 最大フローを求める • maxflow(bool reuse_trees = false, Block<node_id>* changed_list = NULL) ‒ ノードがs側かt側かを判定 • what_segment(node_id i, termtype default_segm = SOURCE) プログラム例 (1/3) int Denoise(IplImage* img, IplImage* result) { // 入力画像情報 int width = img->width; int height = img->height; int wstep = img->widthStep; int bpp = ((img->depth & 255) / 8) * img->nChannels; unsigned char* image = (unsigned char*)img->imageData; unsigned char* image_result = (unsigned char*)result->imageData; // parameter int lambda = 90; int kappa = 25; // グラフクラス (ノードサイズとエッジのサイズの大まかな数を指定) typedef Graph<int, int, int> GraphType; GraphType* g = new GraphType(width*height, width*height*4); // ノードの作成 g->add_node(width*height); プログラム例 (2/3) int dx[4] = {1, -1, 0, 1}; int dy[4] = {0, 1, 1, 1}; for(int i = 0; i < height; i++){ for(int j = 0; j < width; j++){ // データ項の計算 int data1 = ( bin(image[ i*wstep + j*bpp]) ) * lambda; int data2 = (1 - bin(image[ i*wstep + j*bpp]) ) * lambda; g->add_tweights( i*width + j, data1, data2); // 平滑化項の計算 for(int d = 0; d < 4; d++){ int x = j+dx[d]; int y = i+dy[d]; if(0 <= x && 0 <= 0 && x < width && y < height){ g->add_edge( i*width + j, y*width + x, kappa, kappa); } } } } プログラム例 (3/3) // maxflow/mincut int flow = g->maxflow(); // 出力結果 for(int i = 0; i < height; i++){ for(int j = 0; j < width; j++){ if(g->what_segment( i*width + j ) == GraphType::SOURCE){ image_result[ i*wstep + j*bpp] = 255; } else{ image_result[ i*wstep + j*bpp] = 0; } } } delete g; return 0; } 実行例 入力画像 λ=10, κ=25 λ=20, κ=25 λ=90, κ=25 λ=130, κ=25 コンピュータビジョンへの応用例 画像セグメンテーション • エネルギー関数 ‒ データ項:輝度値の前景 or 背景の確率 ‒ 平滑化項:近傍ピクセルとの類似度 Edge Weight Condition n-link {p, q} B{p, q} {p, q} N t-link {p, s} λ · Rp( bkg ) p P, p OUB t-link {p, t} K p O 0 p B λ · Rp ( obj ) p P, p OUB 0 p O K p B 画像セグメンテーション例 Lazy Snapping ボクセルデータのセグメンテーション セグメンテーションの高精度化 • GrabCut [C. Rother et al , SIGGRAPH2004] ‒ セグメンテーションの繰り返し処理により色分布を再学習 • 平滑化処理の繰返しによるグラフカットを用いた 画像セグメンテーション[永橋, 情処論2008] ‒ 色と形状を段階的に繰り返し再学習 平滑化処理の繰返しによるグラフカット[永橋, 情処論2008] ステレオ • エネルギー関数 ‒ ラベル:視差 ‒ サイト:左画像の画素 ‒ データ項:左画像と右画像のピクセル値の類似度 ‒ 平滑化項:近傍ピクセルの視差が同じかどうか E(L) = � D(IL , IR , i, j, d) + � λ · δ(Li,j , Li+x,j+y ) スレテオ結果例 !"#$%&'()*$(+&#&(,&)$()*$-%".&#)/010$()2334)5))67#'%8)*".1)91:);&9&<)=&.1>?))@:)A$BC$9)DEFGH?)I:)*#&-)DE:)$+)A$((H?)/:)J$<-$K$#$9)DE*;H) Multi-way graph cuts テクスチャ合成 Graph-cut textures (Kwatra, Schodl, Essa,SIGGRAPH2003] Bobick 2003) • Graph-cut textures [Kwatra, " ! $ # " ! $ # & !"#$%&'()*$(+&#&(,&)$()*$-%".&#)/010$()2334)5))67#'%8)*".1)91:);&9&<)=&.1>?))@:)A$BC$9)DEFGH?)I:)*#&-)DE:)$+)A$((H?)/:)J$<-$K$#$9)DE*;H) % % ( Graph cuts for video textures ( ' & ' * ) ) * Graph-cuts video textures (Kwatra, Schodl, Essa, Bobick 2003) similar to “image-quilting” (Efros & Freeman, 2001) 3&+4% / !"#$%&'()*#&+,(- . 0#12&'()*#&+,(- 3D generalization of “image-quilting” (Efros & Freeman, 2001) 結果 • まとめ • Graph Cuts ‒ グラフ理論を用いたMRFのエネルギー最小化 • 大域最小解が得られる ‒ 応用例 • 画像復元 • セグメンテーション • ステレオ • テクスチャ合成