実践コンピュータビジョン 9章 画像の領域分割

Post on 25-Jun-2015

5.327 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

静岡Developes勉強会のコンピュータビジョン9章の資料です。

TRANSCRIPT

実践コンピュータビジョン

9章 画像の領域分割

はじめに

本資料は静岡Developes勉強会「コンピュー

タビジョン vol.9」のための資料です。

オライリー社の実践コンピュータビジョン

www.oreilly.co.jp/books/9784873116075/

を教科書として使います。

自己紹介

やじゅ@静岡・・・漢字名は「八寿」

平口 八寿人(https://www.facebook.com/yasuhito.hiraguchi)

アラフォーエンジニア、元MSMVP(Visual Basic)

静岡県島田市のSL(大井川鉄道)が走っている所に在住

Twitter:yaju はてなID:Yaju3D

http://blogs.wankuma.com/yaju/

http://yaju3d.hatenablog.jp/ (数学と物理を基礎からやり直す)

http://www.slideshare.net/yaju88/presentations (スライド)

開発環境

共通開発環境

python 2.7 (3.x系では本書に沿わないのでNG)

環境変数 Path

「C:¥Python27;C:¥Python27¥Scripts;」を追加

開発環境

私の開発環境

OS Windows 8.1

IDE pyCharm 3.0.2 (Community Edition FREE)

http://www.jetbrains.com/pycharm/download/

開発環境

別の開発環境

IPython NoteBook

ブラウザ上で対話的にPythonを実行できるツール

Windows版導入方法 http://www.aoki.ecei.tohoku.ac.jp/~ito/python_windows.html

Mac版導入方法 http://slowquery.hatenablog.com/entry/2013/04/01/010927

事前準備 その1

サンプルソースコード

実践コンピュータビジョンのWebサイトの関連ファイ

ルタブからダウンロードしてください。

画像データ

原著者のサイトから pcv_data.zip をダウンロード

してください。

事前準備 その2

NumPy、Matplotlib、SciPy、 PILインストール(Windows)

NumPy、Matplotlib、 SciPyのインストール

http://qiita.com/mojaie/items/995661f7467ffdb40331

PIL インストール Python2.7用

http://www.pythonware.com/products/pil/index.htm

easy_installのインストール(Windows)

https://pypi.python.org/pypi/setuptools/1.1.5#installing-and-using-setuptools

setuptools-1.1.5.tar.gzを解凍し、ez_setup.pyをダブルクリック

C:¥Python27¥Scripts内にeasy_install関連のファイルが入る。

pipのインストール(Windows)

http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html

easy_install pip をコマンドプロンプト上で入力する。

事前準備 その3

サンプルソースコードと画像データを展開

PycharmProjects (私の場合のフォルダ構成)

├─pcv_data (画像データ pca_data.zipを展開)

├─chap8

├─chap9 (サンプルソース pcv_j.zipを展開)

Phython-graphパッケージのインストール

http://code.google.com/p/python-graph/ からDLするより

「easy_install python-graph-core」でインストールが簡単

事前準備 その4

pca_data.zipから、empire.jpgを展開してカレントディレクトリ

(chap9)に置きます。

http://research.microsoft.com/en-

us/um/cambridge/projects/visionimagevideoediting/segmentat

ion/grabcut.htmの「Ground truth database」の「Labelling -

Rectangle」をクリックし、boundary_GT_rect.zipをダウンロード

カレントディレクトリ(chap9)に展開します。

376043.bmp 兵隊用、86016. bmp 庭用、 153077. bmp 水泳用

事前準備 その5

http://www.eecs.berkeley.edu/Research/Projects/CS/vision/

grouping/segbench/の「Downloads Segmentation Dataset」の

[images]をクリックして、BSD300-images.tgz をダウンロード

BSD300/images/test/の下記ファイルをchap9内に展開します。

376043.jpg 兵隊、86016.jpg 庭、 153077.jpg 水泳選手

8章から「Sebastien Marcel Static Hand Posture Database」の

shp_marcel_test.tar.gzから下記ファイルをchap9内に展開します。

C/uniform/C-uniform03.ppm

事前準備 その6

IPython notebook を使う場合

Windows版では、コマンドプロンプトにてカレントディレクトリ(自

分の場合は、PycharmProjects¥chap9)にしてから「iPython

notebook」を入力して実行。

基礎知識

画像の領域分割

グラフ

グラフカット

ベイズの定理

スペクトルグラフ理論

ラプラシアン行列

画像領域の分割

画像を意味のある領域に分割する処理のこと

例 犬のいる背景画像から、犬の領域を取り出す

グラフ

グラフは主に、2つ以上の要素(人物、駅、場所など)を結んで行

き、節点同士の関連性を見いだすことに用いられます。

下図の線の数値は各地点を移動にかかる時間(分)である。

線に時間などの重みを持ったグラフを「重み付きグラフ」と言う。

グラフ

A地点→C地点に速く着くには?

A地点からC地点に速く着く時間を考えてみる。

今回の場合、4通り行き方があるのでその全てを列挙してみる。

A(上)→Cまでかかる時間:17分

A(下)→Cまでかかる時間:19分

A(左)→B→Cまでかかる時間:5分+11分=16分

A(右)→B→Cまでかかる時間:7分+11分=18分

グラフカット

カットとは

点を2つのグループに分ける

1. 始点を含むグループ

2. 終点を含むグループ

始点を含むグループから終点を含むグループへ

向かっている有向枝の集合をカットとよぶ

カットに含まれる枝の容量の合計を

カットの容量とよぶ

グラフカット

大名の最大流問題

富士山から江戸までなるべくたくさんの氷を送りたいどのように

運ぶ? ※道が広く(例 8)なっても運ぶ量(例 5)は変化しない

s

t1

2 3

5

8

2

8

5

6

飛脚が運べる量(容量)

最大で12個(5 + 2 + 5)しか運べない

8

5

2 5

25

5

グラフカット

最大フロー=最小カット (最大フロー最小カット定理)

最大12個運べるのは最後まで調べなくても、最小カットで分かる

ベイズの定理

条件付き確率に関し、イギリスの数学者トーマ

ス・ベイズ(1702~1761)によって示された定理

で、コンピュータ上ではスパムメールフィルター

として活用されるようになった。

http://blog.oscarbonilla.com/2009/05/visualizing-bayes-theorem/

ベイズの定理

ベイズ推定の例題とその解

喫煙者の推定の問題 http://www.yasuienv.net/BayesExamples.htm

問題:「男性10人、女性7人が一室でパーティーを開いた。男子の喫煙者は5人、女性は3人である。部屋に

入ったら煙草の吸殻が1本、灰皿の上にあった。このとき、吸った人が女性である確率を求めなさい(煙草の

吸い回しはしていないと仮定する)」。

解法: (a) ベイズの定理による解法

吸った人が女性である確率を求めるということは、P(女性|喫煙者)を求めることである。

ベイズの定理によって、下記式を求めることになる。

P(喫煙者|女性)・P(女性)

P(女性|喫煙者) = ---------------------------

P(喫煙者)

P(喫煙者|女性) = 3/7

P(女性) = 7 / (7+10) = 7/17 P(喫煙者) = (3+5) / (7+10) = 8/17

上式に代入して、

P(女性|喫煙者) = (3/7 × 7/17) / (8/17) = 3/8 (答)

ベイズの定理

解法 (b)集合論による解法

次の図のような状況であった。吸殻を残したのは喫煙者の誰かであり、喫煙者が女性である確

率は、図から明らかに3/8である。

スペクトルグラフ理論

グラフを解析する手法

グラフの隣接行列(のようなもの)の固有値・固有ベクトルが、

元のグラフの何らかの性質を物語っている。

参照:スペクトラルグラフ理論入門

ラプラシアン行列

グラフの構造を行列で表したもので、対角成分で頂点の価数を、その他の

成分で隣接関係を表す。

具体的には、成分(i, j)の値は次のように決まる。

・i = j のとき:頂点 i に接続する辺の数

・i≠j のとき:頂点 i と頂点 j が辺でつながっていれば-1。そうでなければ0

参照:ラプラシアン行列 - 大人になってからの再学習

ラプラシアン行列の作り方 その①

ラプラシアン行列

A

B

C

D

E

ラプラシアン行列の作り方 その②

ラプラシアン行列

上-下

第3章の目次

9.1 グラフカット

9.1.1 画像からグラフを構成する

9.1.2 ユーザー入力を用いた領域分割

9.2 クラスタリングを用いた領域分割

9.3 変分法

9.4 演習問題

実行ファイル説明

9.1.graphcut.py 小さなグラフの最大フロー/最小カットを計算

9.1.1.graphcut.py empire.jpgを使って、グラフを作成する

9.1.2.graphcut.py グラフカットによる画像領域を行う

9.2.ncut.py クラスタリングを用いた画像領域分割を行う

9.3.chanvese.py Chan-Veseモデルの最小化による画像領域分割を行う

9.1 グラフカット

グラフカットとは

有向グラフを2つの部分集合に分離すること

有向グラフ・・・辺が向きを持つグラフ

無向グラフ・・・辺が向きを持たないグラフ

グラフカットは、ステレオ画像の奥行き復元、画像のステッチン

グ(つなぎ目を滑らかにする)、画像の領域分割などにコン

ピュータビジョンのさまざまな問題を解決するのに使うことが出

来る。

9.1 グラフカット

有向グラフを2つに分離とは

点を2つのグループに分ける

1. 始点(ソース S)を含むグループ

2. 終点(シンク T)を含むグループ

始点を含むグループから終点を含むグループへ向かっている

有向枝の集合をカットと呼ぶ

カットに含まれる枝の容量の合計をカットの容量と呼ぶ参照 大人になってからの再学習 グラフカット(Graph Cut)

9.1 グラフカット

9.1.graphcut.py の実行

※python-graphパッケージは、「easy_install python-graph-core」でインストール

小さなグラフの最大フロー/最小カットを計算

ノード0:始点(ソース)

ノード3:終点(シンク)

flow is: {(0, 1): 4, (1, 2): 0, (1, 3): 4, (2, 3): 3, (0, 2): 3}

cut is: {0: 0, 1: 1, 2: 1, 3: 1} … 戻り値は、0と1のみ

9.1 グラフカット

最大フローとは

始点0から終点3に最も多く物を流すことを考える

flow is: {(0, 1): 4, (1, 2): 0, (1, 3): 4, (2, 3): 3, (0, 2): 3}

0→1に4個、1→3は1→2により多く流せるから1→3に4個

1→2は流す物がなくなったので0個になる。

0→2に3個、2→3はそのまま3個流す。

(2→3は5だが、流す物は3個しかない)

9.1 グラフカット

最小カット

cut is: {0: 0, 1: 1, 2: 1, 3: 1} … 戻り値は、0と1のみ

1. 始点(ソース S)を含むグループ

0: 0

2. 終点(シンク T)を含むグループ

1: 1, 2: 1, 3: 1

最小コストは、赤の線で7になります。

赤の線でカットすると、4 + 3 = 7

青の線でカットすると、4 + 5 = 9

9.1.1 画像からグラフを構成する

最も単純な4近傍(きんぼう)ピクセルを用い、2つの画像領域

(前景と背景)に分ける。4近傍とはピクセルの上下左右です。

(左)モデルの学習に用いるラベル画像。

(中)画像に重ねた訓練データ領域。(右)領域分割結果

9.1.1 画像からグラフを構成する

ベイズの定理によって、スパムメールを振り分けるみたいに

画像に応用して前景と背景を判定させる。

ベイズ決定則は最大事後確率則,最小誤識別率則(誤りを最小化)

グラフの辺(エッジ)の重みを、下記の式で求める

グラフカットにより、前景と背景を切り取る(下図はイメージ)

9.1.1 画像からグラフを構成する

9.1.1.graphcut.py の実行

実行すると自分の環境では、40分かかったので画像を小さく

するといいかも。

また、実行した場合に0割エラーが発生したので、下記を修正しました。

grapchut.py

# 正規化

for i in range(vim.shape[0]):

n = linalg.norm(vim[i])

if n !=0:

vim[i] = vim[i] / n

9.1.1 画像からグラフを構成する

変数kappaは、近傍ピクセル間のエッジの相対的な重みを決定するものです。

kappaを変化させたときの影響を下図となります。

値が増えるにつれ、領域分割の境界は滑らかになり詳細が失われていきます。

9.1.2 ユーザー入力を用いた領域分割

ユーザーが四角形領域や「投げ縄」ツールで領域選択して、前

景と背景を指定するのを模擬した情報をグラフカットに適用して、

ユーザー入力による領域分割を模擬します。

自動ではまだ限界がある、ある程度ユーザーが領域を指定するInteractive Foreground Extraction using GrabCut Algorithm 【動画】Grabcutを実装してみた

9.1.2 ユーザー入力を用いた領域分割

ユーザーが四角形領域や「投げ縄」ツールで領域選択して、

前景と背景を指定するのを模擬した「注釈情報」をグラフカット

に適用して、ユーザー入力による領域分割を模擬します。

注釈情報は下記のようなピクセル値を持つビットマップ画像

として符号化されています。

9.1.2 ユーザー入力を用いた領域分割

9.1.2.graphcut.py の実行

86016.jpg 庭、 376043.jpg 兵隊、 153077.jpg 水泳選手

PDFが出力されるだけなので、

savefig('labelplot.pdf')

の下に下記を追加

axis('off')

show()

9.2 クラスタリングを用いた領域分割

「正規化カット(Normalized Cut:Ncut)」アルゴリズムは、スペク

トラルグラフ理論に基づき、ピクセルの類似度と空間的近接性

を組み合わせて画像を領域分割する手法です。

その考え方はグループのサイズを考慮したコストを定義するも

ので、コストをグループのサイズで「正規化」します。

参照:スペクトラルグラフ理論入門

9.2 クラスタリングを用いた領域分割

正規化カット法を使った画像の領域分割

Static Hand Posture Databaseの手話画像(詳細は8.1節を参照)を用い、k =

3とします。領域分割結果と上位4個の固有ベクトル

(上)原画像と3 クラスの領域分割結果

(下)グラフ類似度行列の上位4 個の固有ベクトル

9.2 クラスタリングを用いた領域分割

正規化カットを用いた2クラスの画像の領域分割

(左)原画像。(右)領域分割結果

9.2 クラスタリングを用いた領域分割

9.2.ncut.py の実行

自分の環境では、エラーで実行できなかった。

9.3 変分法

変分法とは

関数について最適化する問題を「変分問題」といい、このような

問題を解くアルゴリズムを「変分法」といいます。

Chan-Vese領域分割モデル

分割する画像領域に対して区分定数画像モデルを仮定します。

ここでは、前景と背景という2つの領域の場合に着目しますが、

このモデルは多領域に拡張することもできます。

9.3 変分法

Chan-Vese領域分割モデル

曲線の集合画像を2つの領域1と2に分割するとき、次のような

Chan-Veseモデルのエネルギーの最小値を求めることで領域

分割できます。

9.3 変分法

9.3.chanvese.py の実行

ROFノイズ除去を用いたChan-Veseモデルの最小化

による画像領域分割

(左)原画像。

(中)ROFノイズ除去後の画像

(右)最終的な領域分割

9.4 演習問題

1.グラフカットを最適化するために、エッジの数を減らせば計算を高速化すること

ができます。このようなグラフの構築法が文献[16]の4.2節で解説されています。

これを試して、本書の単純な構築法と、グラフの大きさや領域分割にかかる時間

を比較してください。

2.グラフカットによる領域分割のために、ユーザーインタフェースを作るか、ユーザ

ーが領域を選択するのを模擬してください。それから、重みに大きな値を設定して

、強制的に背景と前景を設定してください。

3.グラフカットによる領域分割において、特徴量ベクトルをRGB値のベクトルから

他の記述子に変更してください。領域分割結果を改善できますか?

4.現在の領域分割結果を次の前景と背景のモデル学習に用いる「繰り返し型の

領域分割」を実装してください。本章で用いた画像について領域分割の品質を向

上できますか?

3.4 演習問題

5.マイクロソフトリサーチのGrabCutデータセットには、領域分割の正解デ

ータが含まれています。領域分割の誤差を測定する関数を実装して、設

定の違いや演習問題1.~4.のアイデアを評価してください。

6.正規化カットのエッジの重みのパラメータを変更して、固有ベクトルと領

域分割結果にどのような影響があるか調べてください。

7.正規化カットの第1固有ベクトルに画像勾配を計算してください。この勾

配画像を組み合わせて物体の画像輪郭を検出してください。

8.Chan-Vese領域分割のノイズ除去画像の閾値を線形探索するプログラ

ムを実装してください。閾値ごとにエネルギーE(Γ)を保存して、最小値に

なる場合の領域分割を選びます。

終了

ご清聴ありがとうございました!

top related