8
ʮըͷɾཧղγϯϙδϜ (MIRU2010)ʯ 2010 7 ͰͷөݦஶҬͷಈநग़ Ұഅ ݡ†† ޛ††† ߴ †† ٶେ ෦ ใγεςϜՊ ˟ 889–2192 ٶٶݝԂՖ 1-1 †† ԭೄߴۀใ௨৴γεςϜՊ ˟ 905–2171 ԭೄݝࢢޢ ݹ905 ††† ຊ৴ʢגʣNTT ίϛϡχέʔγϣϯՊجڀݚ˟ 243–0124 ਆಸݝͷཬए ٶ3-1 E-mail: [email protected], ††[email protected] Β· өͷதΒମͱഎܠΛΔॲཧɼମݕग़ը߹ͳͲͰॏཁͳज़ͷҰͰΔɽɼ ਓͷಛʹجग़ΕΔөݦஶΛखΓͱ༻ɼάϥϑΧοτʹΑΓಈతʹମͱഎܠͷ Λߦख๏छఏҊΕΔɽҰͰɼΕΒͷख๏ɼөݦஶͷग़άϥϑΧοτʹඇৗʹܭ ΛඞཁͱɼൺతղͳըͰɼϦΞϧλΠϜʹఔԕॲཧΛཁΔͰΔɽɼ ΕΒͷख๏ͷଟͷॲཧຊతʹଟͷըॲཧͷΈ߹ΘͰ ΕΔΊɼըૉͱΕ ʹΔ୯ҐͰ෦ͷॲཧΛฒԋʹల։ɼଟͷίΞΛϋʔυΣΞͷͰߦΔͱʹΑΓɼख ๏શମͷߴԽظͰΔɽຊڀݚͰɼөݦஶʹجମɾഎܠͷಈख๏ΛϦΞϧλΠϜҎͷॲ ཧͰಈΔͱΛతͱɼϋʔυΣΞͱ Graphic Processor UnitʢGPUʣΛ༻ΔͱΛఆ ख๏ͷฒॲཧͷల։ͱɼͷ๏ʹड़ΔɽөΛ༻ʹݧΑΓɼฒॲཧͷಋೖͰɼ ॲཧେ෯ʹվળΔͱΛɽ Ωʔϫʔυ өҬɼݦஶɼάϥϑΧοτɼgraphic processor unitɼCUDA Fully automatic extraction of salient objects in near real-time Kazuma AKAMINE , Ken FUKUCHI †† , Akisato KIMURA ††† , and Shigeru TAKAGI †† Department of Computer Science and System Engineering, Faculty of Engineering, Miyazaki University 1-1 Gakuen Kibanadai-Nishi, Miyazaki, 889–2192 Japan. †† Department of Information and Communication Systems Engineering, Okinawa National College of Technology Henoko 905, Nago, Okinawa, 905–2171 Japan. ††† NTT Communication Science Laboratories, NTT Corporation Morinosato Wakamiya 3-1, Atsugi, Kanagawa, 243–0198 Japan. E-mail: [email protected], ††[email protected] 1. Ίʹ ө ΒମͱഎܠΛΔॲཧɼϏσΦɼ ମͷɾݕग़ɼը߹ͷԠ༻ғͷॏཁ ͳज़ͰΔɽΕΛਖ਼ʹݱΔ༗ͳ๏ͱɼ άϥϑΧοτʹجख๏ΒΕΔɽը ҬΛϚϧίϑ (MRF) ͷޙ (MAP) ਪఆͱఆԽɼMRF ͷখΧοτʹ ஔΔߟ Greig Β [1] ʹΑॳΊΕɽ Boykov ΒɼͷߟΛଟηάϝϯςʔγϣϯʹ ɼతͳಠͷখΧοτΞϧΰϦζϜΛ༻ Interactive Graph Cuts [2] ΛఏҊɽͷख๏Ε ·ͰଟͷվͳΕΔɽ·ɼKohli ΒͷఏҊ Dynamic Graph Cuts [3] Ͱɼతʹಈతʹม ԽΔ MRF ͷ MAP ਪఆΛߦΞϧΰϦζϜ ΕɽΕΒͷख๏ߴਫ਼ʹΛߦΔ໘ɼମ ͰΔഎܠͰΔͷલใΛɼखಈͰըதͷෳ ͷॴʹ༩ΔඞཁΔͱͰΔɽ ਓͷखΛհʹಈతʹମͰΔഎܠͰΔ ͷલใΛ༩ΔΊʹɼਓͷಛʹج ݦஶΛར༻Δͱ༗ͰΔɽΕΛ༻ಈ ͰମͱഎܠΛΔ๏Β [4]ɼ౻Β [5]ɼ Fu Β [6]ɼΒ [7] ͳͲͷख๏ఏҊΕΔɽΕΒͷ ख๏ಈతʹମͱഎܠΛߴਫ਼ʹͰΔɼҰ ͰඇৗʹܭଟɼൺతղͳըͰ ॲཧͰɼͷԠ༻ΛߟΔͱগͳ

近実時間での映像顕著領域の自動抽出 · 「画像の認識・理解シンポジウム(MIRU2010)」2010 年7 月 近実時間での映像顕著領域の自動抽出

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

「画像の認識・理解シンポジウム (MIRU2010)」 2010 年 7 月

近実時間での映像顕著領域の自動抽出赤嶺 一馬† 福地 賢†† 木村 昭悟††† 高木 茂††

† 宮崎大学 工学部 情報システム工学科 〒 889–2192 宮崎県宮崎市学園木花台西 1-1†† 国立沖縄工業高等専門学校 情報通信システム工学科 〒 905–2171 沖縄県名護市字辺野古 905

††† 日本電信電話(株)NTTコミュニケーション科学基礎研究所 〒 243–0124 神奈川県厚木市森の里若宮 3-1E-mail: †[email protected], ††[email protected]

あらまし 映像の中から物体と背景を分割する処理は,物体検出や画像合成などで重要な技術の一つである.近年,人間の視覚特性に基づいて算出される映像顕著性を手がかりとして用い,グラフカットにより自動的に物体と背景の分割を行う手法が各種提案されている.一方で,これらの手法は,映像顕著性の算出やグラフカットに非常に計算量を必要とし,比較的低解像度な画像であっても,リアルタイムには程遠い処理時間を要する点が問題である.しかし,これらの手法の多くの処理は本質的には多数の画像処理の組み合わせで構成されているため,画素ごともしくはそれに類する単位で各部分の処理を並列演算に展開し,多数のコアをもつハードウェアの上で実行させることにより,手法全体の高速化が期待できる.本研究では,映像顕著性に基づく物体・背景の自動分割手法をリアルタイム以内の処理時間で動作させることを目的として,ハードウェアとしてGraphic Processor Unit(GPU)を用いることを想定した分割手法の並列処理への展開と,その実装方法について述べる.実映像を用いた実験により,並列処理の導入で,処理速度が大幅に改善することを示す.キーワード 映像領域分割,顕著度,グラフカット,graphic processor unit,CUDA

Fully automatic extraction of salient objects in near real-timeKazuma AKAMINE†, Ken FUKUCHI††, Akisato KIMURA†††, and Shigeru TAKAGI††

† Department of Computer Science and System Engineering, Faculty of Engineering, Miyazaki University1-1 Gakuen Kibanadai-Nishi, Miyazaki, 889–2192 Japan.

†† Department of Information and Communication Systems Engineering, Okinawa National College ofTechnology Henoko 905, Nago, Okinawa, 905–2171 Japan.

††† NTT Communication Science Laboratories, NTT Corporation Morinosato Wakamiya 3-1, Atsugi,Kanagawa, 243–0198 Japan.

E-mail: †[email protected], ††[email protected]

1. は じ め に

映像 から物体と背景を分割する処理は,ビデオ分類,物体の認識・検出,画像合成等への応用範囲の広い重要な技術である.これを正確に実現する有望な方法として,グラフカットに基づく手法が広く知られている.画像領域分割問題をマルコフ確率場 (MRF)の最大事後確率(MAP)推定として定式化し,MRFの最小カット問題に置き換える考えは Greigら [1]によって初めて示された.Boykovらは,この考えを多値セグメンテーションに拡張し,効率的な独自の最小カットアルゴリズムを用いたInteractive Graph Cuts [2]を提案した.この手法はこれまで多くの改良がなされている.また,Kohliらの提案

した Dynamic Graph Cuts [3]では,効率的に動的に変化するMRFものMAP推定を行うアルゴリズムが示された.これらの手法は高精度に分割を行える反面,物体であるか背景であるかの事前情報を,手動で画像中の複数の場所に与える必要があることが問題である.人の手を介さずに自動的に物体であるか背景であるかの事前情報を与えるために,人間の視覚特性に基づいた顕著度を利用することは有望である.これを用いた自動で物体と背景を分割する方法は福田ら [4],藤崎ら [5],Fuら [6],福地ら [7]などの手法が提案されている.これらの手法は自動的に物体と背景を高精度に分割できるが,一方で非常に計算量が多く,比較的低解像度な画像であっても処理が遅い点が問題で,実際の応用を考慮すると少な

くともリアルタイムでの実行が求められる.しかし,これらの方法における主要な処理は本質的に多くの画像処理で構成されているため,適切に設計された並列処理により速度を改善することが可能であると考えられる.ゲームや映像再生などリアルタイムな画像処理が必要な分野ではGraphic Processor Unit(GPU)と呼ばれるプログラマブルな SIMD(Single Instruction Multiple Data)プロセッサが用いられてきた.GPUは複雑な処理を苦手とする一方で,単純なコアを多数実装し並列処理に特化させることで,CPUよりも高い処理性能を有しており,価格も安価であるため,膨大な並列計算が要求される科学技術分野 [8]や動画エンコード [9],[10]など,GPUを汎用的に利用する general-purpose GPU(GPGPU) [11]が広まりつつある .また,GPUで実行するプログラムの作成は,C++言語をベースに拡張した CUDA [12]やOpenCL [13] という開発環境の登場によって簡易になっている.これらのことから GPUを用いた並列処理による映像領域分割手法の高速化は有望である.本論文では映像領域分割手法をリアルタイム以内の処

理時間で動作させることを目的とし,GPUを用いることを想定した並列処理への展開とその実装を示す.具体的には処理時間が大きくデータ並列性の高い処理を抽出し,それを並列処理へ展開した上で,CUDAを用いて GPU上へ実装する.また,CUDAを用いたライブラリが公開されている処理の実装も行い,処理速度を改善する.

2節ではGPUの概要と CUDAを用いた利用方法について概説する.3節では,映像領域分割手法として福地らによって提案された手法 [7]を取り上げ,その処理について説明する.また,4節で各処理を GPUに実装する上での処理の並列展開とその実装について具体的に説明する.5節にて,処理速度の改善を定量的に示した結果を示す.6節で本論文のまとめと今後の方向性を提示する.

2. Graphic Processor Unit

本節では GPUの概要と利用方法,今回 GPUの実装に用いた開発環境である CUDAについて説明する.

2. 1 概要と利用方法

GPU(Graphics Processing Unit)は画像処理を目的に設計されたプロセッサである.主に,ゲームや動画再生といったリアルタイムが要求される高負荷な画像処理で大きな効果を発揮する.従来 GPUはハードウェア固定の機能を用いて,描画を行っていたが,表現力を追求する上でプログラマブルになった.GPUは高速に画像処理を行うために,1つの処理を同時に複数のデータに適応できる SIMDを採用し,構造を単純にすることで演算性能を高めている.そのため分岐処理や並列化が難しい処理,メモリアクセスが多い処理などハードウェアの特徴に合わない処理ではパフォーマンスを得にくい.最近

������������ ����������

�� ����������

�� ����������

��� ������� ��

������������ ����������

�� ����������

�� ����������

��� ������� ��

図 1 ブロックとスレッド

では毎秒 1兆回以上の演算性能で,価格も 2万円台と安価であることから,画像処理以外にも,科学技術分野や動画エンコードなど汎用的に GPUを活用する GPGPUに期待が高まっている.GPUで実行されるプログラムの作成には自社 GPU 専用の開発環境として NVIDIA社が提供する CUDA [12]や同じく AMD社が提供するATi Stream [14],マルチコアCPUやGPUなどでも利用できる OpenCL [13],Microsoft社の APIである DirectCompute [15]などを用いることで可能である.

2. 2 CUDA

従来,GPU で実行されるプログラムの記述にはHLSL [15]や GLSL [16]などのシェーダー言語を用いる必要があった.シェーダー言語を記述するためにはグラフィックスパイプラインの理解が必須であり,また,シェーダー言語で記述されたプログラムの実行には,特殊な呼び出し手続きが必要である.NVIDIA社は自社GPU専用の開発環境 CUDAを提供することで,これらGPU特有の知識と手間を不要とした.CUDAは C言語を少し拡張したもので,GPUの処理を C言語の関数として呼び出すことができる.

GPUで実行される処理はスレッドとして実行される.図 1に示すように,スレッドはブロックという単位で管理され,ブロック内のスレッド同士で同期とシェアードメモリの使用が可能である.また,ブロックは固有の IDをもち,スレッドもブロック内で IDをもつ.ブロック内のスレッドの数は任意の整数であるが,ブロック内で同時に実行できるスレッドの数が 32であるため,32の倍数であるほうが効率的である.図 2は CPUのプログラムと GPUのプログラムが実行されるタイミングを示している.GPUで実行されるプログラムは CPUで実行されるプログラムと非同期である.GPUで実行されるプログラムは CPU側で呼び出されると,ドライバでキューイングされ,GPU上の前の処理が終了すると,キューから次の処理が取り出され実行される.

2. 3 CUDAの関数

CUDAでは関数の実行先を CPUか GPUか指定する記述が拡張されている.この拡張によりプログラマは実

����

���������� ���

���������� ���

���������� ���

�����������

����

������������������ ���

�����������

������������������ ���

������������������ ���

���������� ���

���������� ���

図 2 CPUと GPUの実行タイミング

1 host device int add(int a, int b) {2 return a + b;3 }4 global void addAll(int length, int∗ a, int∗ b,

int∗ result) {5 int px = blockIdx.x∗blockDim.x + threadIdx;6 if(px < length) {7 result[px] = add(a[px], b[px]);8 }9 }

10 void main() {11 …12 Dim3 blocks = {10, 0, 0};13 Dim3 threads = {32, 0, 0};14 int sm cap = 0;15 addEach<<<blocks, threads, sm cap>>>(length,

a, b, result);16 …17 }

図 3 CUDAの関数の使用例

行先を指定された関数を呼び出すだけで CPUと GPUの処理を呼び出すことができる.種類と特徴は表 1のとおりである.

表 1 CUDAの関数の種類種類 呼び出し 実行host CPU CPU

global CPU GPU

device GPU GPU

GPU は関数呼び出しの仕組みを備えていないため,device 関数はインライン展開される.そのため再帰関数は使用できない. global 関数の戻り値は voidである必要がある.また, host と device は同時に指定することができる.これらの拡張された記述と関数の呼び出し方は図 3のとおりである.図 3は GPUを用いて配列 aと bの値を加算するプロ

グラムである.関数 addAllは GPU上で実行されるプログラムで,関数 addは CPUと GPUの両方で呼び出すことができる関数である.GPU上で実行される関数addAllの呼び出しには<<<>>>が拡張されている.図3の例では blocksにはデバイスの使用するブロックの数

���������� ��������

��� ��

���������

������������

��� ��

���������

������������

���������� ��������

��� ��

���������

������������

��� ��

���������

������������

���������������

���������������

�������������

図 4 CUDAのメモリモデル

図 5 物理的なメモリの場所

表 2 GPUのメモリの特徴

種類 読 書 CPU間の キャッシュ 同期データ転送

グローバル ○ ○ ○ × グリッドテクスチャ ○ × ○ ○ ―コンスタント ○ × ○ ○ ―シェアード ○ ○ × ― ブロックローカル ○ ○ × ― ―レジスタ ○ ○ × ― ―

を,threadsには 1ブロック内で起動されるスレッドの数を,sm capはブロック内で利用するシェアードメモリのサイズを指定する.処理するデータの数に合わせてブロックの数とスレッドの数,シェアードメモリのサイズを動的に割り当てることが可能である.

2. 4 CUDAのメモリ

CUDAでは GPU上で図 4,図 5に示すような 6種類のメモリが利用できる.これらのメモリの特徴をまとめたものが表 2である.

CUDAでは GPU上でグローバル,テクスチャ,コンスタント,シェアード,ローカル,レジスタの 6種類のメモリが利用できる.このうちローカルメモリ,レジスタの 2種類はスレッド内でのみ利用可能なメモリである.ローカルメモリはプロセッサのレジスタより多くのデータを扱う場合,グローバルメモリの一部をプロセッサが占有し補うメモリである.これらの使用はコンパイラにより自動で行われる.シェアードメモリは各ブロックで共有される 16KBのメモリであり, syncthreads()

���

�����

�� �

� �

��������

���������

�����������������������

���

� ��������

���������

���

���� �������

�������

�����������������������

���������

図 6 Saliency Graph Cutsの処理の流れ

関数の呼び出し後はブロック内のスレッドの同期が保障される.グローバル・テクスチャ・コンスタントメモリは CPUとの転送が可能なメモリで,GPU全てのスレッドで共有される.グローバルメモリは GPU外のメモリチップであるため大容量で,リード・ライトの両方が行えるが,読み出しには非常に大きな時間を要する.テクスチャメモリはグローバルメモリと同じくメモリチップ上であるが,キャッシュすることにより読み出しを高速化している.コンスタントメモリは 64KBと容量は小さいが GPU上にあるため高速である.また,テクスチャメモリとコンスタントメモリはスレッドから書きこむことができず,CPUによってデータを変更する.これらのことを考慮し,処理に適したメモリを用いることで効率的に GPUを利用できるようになる.

GPU上でデータを扱う場合は CPU側のメモリからGPU側のメモリへデータを転送する必要がある.CPU・GPU間を結ぶバスは狭く,また,データ転送は CPUとGPUが同期後行われるため,頻繁なデータ転送は効率悪化を招くことになる.

3. 映像領域分割手法

本節では福地らによって提案された SGC法 [7]について説明する.SGC法は,グラフカットに基づく画像分割手法に,顕著度に基づいて画像中の各位置が“物体”である確率を表す事前確率を導入し,グラフコストの推定・更新を行うことで自動領域分割を実現している.処理の流れを図 6に示す.

SGC法では,まず,領域分割の自動化を実現するために,入力映像の各フレーム (図 6(a))に対して映像顕著度算出手法 [17]を用いて注目度 (図 6(b))を算出する.これらの手法では輝度値・反対色・エッジ方向性や運動情報 (Lucas-Kanade法 [18])を,複数の解像度にダウンスケールするなど多重解像度処理を行い,合成することで顕著度マップ [19]を作成する.この顕著度マップに基づいて,視線が向けられる確率を表す映像注目度を取得する.次に,映像注目度を基に画像中の各位置が物体/背景で

�������������� �������������

�������� �������� ��

�������������� �������������

�������� ���������

�����

�����

図 7 グラフの作成

ある確率を示す事前確率画像 (図 6(c1))Pr(O)と Pr(B)を算出する.画像中で映像顕著度が高い箇所とその周辺は物体であると考えられるため,顕著度が最大の位置を平均とするガウス分布により,画素 pの物体を表す事前確率 Pr(O; p)を与える.ただし,画像中の縁については,背景である可能性が高いと予想されるので,顕著度の値にかかわらずPr(O; p) ≈ 0とし,Pr(B; p) = 1−Pr(O; p)とする.画像の分割には Boykovらが開発したグラフカットに基づく手法 [20]が用いられている.グラフカットでは図7に示すような画像の各画素と対応するノードと,物体Sと背景 Tのターミナルでグラフを作成する必要がある.ノードとターミナルを結ぶエッジを t-linkといい,隣接するノードを結ぶエッジを n-linkという.各エッジにはコストが与えられており,t-linkに与えられるコストは下記の式 (1)(2)で表され,n-linkのコストは式 (5)で表される.ここで,Cp は画素 p の色,Pr(Cp|O) とPr(Cp|B)は物体領域・背景領域の特徴量尤度,Pr(O|Cp)と Pr(B|Cp)は事後確率,Ipと Iq は画素 p,qそれぞれにおける輝度値である.また,dist(p, q)は画素 p,qの位置についてのユークリッド距離である.

Rp(′′obj′′) = − lnPr(O|Cp) (1)

Rp(′′bkg′′) = − lnPr(B|Cp) (2)

Pr(O|Cp) =Pr(Cp|O)Pr(O; p)

Pr(Cp)(3)

Pr(B|Cp) =Pr(Cp|B)Pr(B; p)

Pr(Cp)(4)

B{p,q} ∝ exp{− (Ip − Iq)2

}· 1dist(p, q)

(5)

特徴量尤度 (図 6(c2))は以下の式 (6)(8)の混合ガウス分布 (GMM)により推定する.GMMパラメータである次元数 dは RGB値を用いることから 3となり,平均 ak,共分散行列 Sk,重み πk は EMアルゴリズムを用いて算出される.物体領域の特徴量尤度 Pr(Cp|O)の推定には,

��������

� �� ������

�������� ���� �� ��

� ��������

�� ����� � ���� �

��� ����

�� ����������

���� �� ������

図 8 GPU上に実装する処理

n段階に量子化された物体を表す事前確率 Pr(O)の値が大きいほどその位置の RGB値を数多く複製し,尤度推定のサンプルとして用いる.一方,背景領域の特徴量尤度 Pr(Cp|B)の推定においては,Pr(O)がある閾値よりも小さい箇所の RGB値を尤度推定のサンプルとして用いる.

p(x; ak, Sk, πk) =M∑

k=1

πkpk(x) (6)

πk >= 0,M∑

k=1

πk = 1 (7)

pk(x) =1

(2π)d/2|Sk|1/2

exp{−1

2(x − ak)T S−1

k (x − ak)}

(8)

各フレームで作成されたグラフに対して最小カットを求めることで映像領域分割を実現し,分割結果 (図 6(d))が得られる.映像では顕著度の高い位置が大きく異なる場合,分割

される領域も大きく移動するため,安定した結果を得るために 1フレーム前の分割結果を利用し,カルマンフィルタを用いることで上記の事前確率を更新している.これら事前確率はグラフコストの推定に用いられる.

4. GPUへの実装

本節では,第 3節で説明した映像領域抽出方法を並列化してGPUへ実装する処理について説明する .図 8にGPU上に実装する処理を示す.顕著度マップの作成,事前確率画像の算出,t-link・n-linkコストの算出,グラフカットを並列化した.GPUへの実装は,特にメモリアクセス時間を小さくすることに注意して行う.顕著度マップの作成に用いられる輝度値・反対色・エッ

ジ方向性や運動情報の算出,ダウンスケールなどの多重解像度処理は画素ごとに並列処理可能である.GPUへの実装ではスレッドと画素を対応付け,1スレッドで 1つの出力画素を処理する.エッジ方向性・運動情報の算

出は基本的には複数のフィルタを用いて行われる.フィルタ出力 F (x, y)は画像 P (x, y)の各位置に対する大きさ n×mのフィルタカーネル Fk(i, j)の積であり,以下の式 (9)になる.

F (x, y) =n∑

i=0

m∑j=0

Fk(i, j)

∗P (x + i − n

2, y + j − m

2) (9)

画像 P (x, y),フィルタカーネル Fk(i, j)をテクスチャメモリに,フィルタ出力 F (x, y)をグローバルメモリに置く.これは各スレッドから必ず参照される Fk(i, j)とスレッドに対して線形的にアクセスされる P (x, y)がキャッシュされることで,メモリアクセス時間を短縮するためである.この実装を図 9に示す.1-2行目でテクスチャメモリにフィルタカーネル (filter)と元画像 (src1)を宣言している.height,widthは元画像の大きさ fheight,fwidthはフィルタカーネルの大きさで,resultがグローバルメモリに確保されたフィルタ出力である.このフィルタでは画像の縁付近では外側に縁と同じ色があるとみなして計算している.多重解像度処理も上記フィルタ処理と同様,1スレッドが複数の画素を読み込むため,元になる画像をテクスチャメモリに置くことでメモリアクセス時間を小さくできる.また,顕著度マップの作成において,画像の最小値,最大値や極大値の探索が必要である.これについては,ブロックと出力画素を対応させて処理する.図 10に最小値と最大値を探索するプログラムを示す.図 10で最小値のバッファをminsrc,最大値のバッファをmaxsrcとしている.このプログラムではまず,ブロック内の複数のスレッドで画素値をシェアードメモリに読み込む.次に syncthreads関数を呼び出してブロック内の関数を同期し,スレッド 0がシェアードメモリの値を比較して書きこむ.このダウンスケールを繰り返し,残り 1画素になった値をテクスチャメモリに置き,使用する.次に事前確率画像 Pr(O)の算出処理について,並列展開の方法とその GPU実装について述べる.事前確率は顕著度が最大の位置を平均とするガウス分布で求められ,前フレームの分割結果を観測とするカルマンフィルタにより更新が行われるが,ともに基本は前述のフィルタ処理であり同様に実装した.

t-linkコストの算出に用いられる EMアルゴリズムについてはCUDA ZONE [12]に公開されていたHarpのライブラリ [21]を用いている.この EMアルゴリズムの初期値は k-meansアルゴリズムを用いて CPU実装にて算出した.また,GMMの式 (6)はフィルタ処理であるため,図 9をベースに Pk(x)の算出を加えた.式 (8)の正規化項 {(2π)d/2|Sk|1/2}−1 は 1フレームの間,全ての画素に共通の定数項であるため CPUで計算し,GPUで乗算し

1 texture<float, 1, cudaReadModeElementType>filter;

2 texture<float, 1, cudaReadModeElementType>src1;

3 device float Filter2DCore(texture<float, 1,cudaReadModeElementType> fsource, int x,int y, int height, int width, int filterSizeX, intfilterSizeY) {

4 float sum = 0;5 x −= filterSizeX/2;6 y −= filterSizeY/2;7 for(int fy = 0; fy < filterSizeY; fy++) {8 int by = y + fy;9 if(by > 0 && by < height) {

10 by ∗= width;11 for(int fx = 0; fx < filterSizeX; fx++) {12 int bx = x + fx;13 if(bx > 0 && bx < width) {14 sum += tex1Dfetch(filter, fy∗filterSizeX

+ fx)∗tex1Dfetch(fsource, by + bx);15 }16 }17 }18 }19 return sum;20 }21 global void Filter2DKernel(int height, int width

, int fheight, int fwidth, float∗ result) {22 int px = blockDim.x∗blockIdx.x + threadIdx.x;23 if(px < height∗width) {24 int x = px%width;25 int y = px/width;26 result[px] = Filter2DCore(src1, x, y, height,

width, fwidth, fheight);27 }28 }

図 9 CUDAを用いたフィルタの実装

た.式 (8)の確率密度項 exp{−1

2 (x − ak)T S−1k (x − ak)

}は平均 ak,共分散行列の逆行列 S−1

k ,および元画像をテクスチャメモリに置くことでメモリアクセス時間を小さくする.

n-linkコストの算出は画素の付近 2点との差をとるだけなので,出力画素ごとに 1スレッドを割り当て GPUへ移植した.画像の分割に用いるグラフカットの処理は CUDA

ZONEにライブラリが公開されていたVineetらのCUDACuts [22]を用いた(注1).

5. 実 験 結 果

本節では 10秒程度の動画 10本を用いて,CPUで処理した場合と,GPUで処理した場合の平均処理時間を比較する実験を行った.測定環境は表 3のとおりである.動画の解像度は 352×288,480×384,640×512の 3種類を用意した.

(注1):使用したライブラリには,メモリ解放が行われていない箇所があったため付け加えた.

1 texture<float, 1, cudaReadModeElementType>minsrc;

2 texture<float, 1, cudaReadModeElementType>maxsrc;

3 global void SMRangeNormalizeKernel1(intlength, float∗ localmin, float∗ localmax) {

4 int px = blockDim.x∗blockIdx.x + threadIdx.x;5

6 shared float mini[32], maxi[32];7 if(px < length) {8 mini[threadIdx.x] = tex1Dfetch(minsrc, px);9 maxi[threadIdx.x] = tex1Dfetch(maxsrc, px);

10 } else {11 mini[threadIdx.x] = FLT MAX;12 maxi[threadIdx.x] = FLT MIN;13 }14 syncthreads();15 if(threadIdx.x == 0) {16 for(int i = 1; i < blockDim.x; i++) {17 mini[0] = min(mini[0], mini[i]);18 maxi[0] = max(maxi[0], maxi[i]);19 }20 localmin[blockIdx.x] = mini[0];21 localmax[blockIdx.x] = maxi[0];22 }23 }

図 10 最小値,最大値の探索

図 11 1フレームあたりの処理時間の内訳(解像度 640x512)

GPUへ移植する前後の処理時間の内訳を図 11及び表4に示す.図 11・表 4にて「その他」と表記されている部分は,画像の取得や GPUへ移植の対象外の処理,メモリの確保・解放などに要する時間を示している.図 12に解像度と処理時間の関係を示す.表 5に画素あたりの平均処理時間を示す.

表 3 測 定 環 境CPU Intel Core2Quad Q9550

メモリ 4GB

GPU NVIDIA Geforce 9800GT

グラフィックメモリ 512MB

OS Windows XP Professional

開発環境 NVIDIA CUDA 2.1

OpenCV 1.1

表 4より解像度 640x512の場合で映像顕著度の算出で 2.4倍,事前確率の算出で 132倍,t-linkの算出で 4.2倍,n-linkの算出で 11倍,グラフカットで 2.9倍と処理

����

�����

�����

���

�������

��

��

���

��

���

�� ��� ����� ���������

��

��

���

�������

�����

�����

���

�������

��

��

���

��

���

������� ������ ������

�� ��� ����� ���������

��

��

��!"��������� !��

���

���

図 12 解像度と 1フレームあたりの平均処理時間

表 4 詳細な 1フレームあたりの処理時間の内訳 [ms]

解像度 映像 事前 t- n- グラフ その他顕著度 確率 link link カット

352 CPU 32.9 148.1 218.6 9.3 97.0 71.0

×288 GPU 22.2 1.9 109.6 0.9 69.0 65.6

480 CPU 58.8 372.8 350.8 16.7 246.5 86.4

×384 GPU 30.4 3.5 120.8 1.6 127.7 74.6

640 CPU 109.8 814.5 602.6 29.5 664.5 112.7

×512 GPU 45.2 6.2 142.6 2.7 232.3 87.1

表 5 画素あたりの平均処理時間 [us]

解像度 CPU GPU 倍率352×288 5.69 2.66 2.14

480×384 6.14 1.95 3.16

640×512 7.12 1.57 4.52

速度が改善し,全体では 4.5倍の高速化を達成したことがわかる.また,表 5より CPU処理の場合は画素あたりの処理時間が解像度の増加に伴い大きくなるのに対し,GPU処理の場合は逆に小さくなっている.処理時間を精査すると,グラフカットでは GPUで処理した場合がCPUで処理した場合に比べ,処理時間の増加が小さくなっている.また,映像顕著度の算出では GPU処理で処理時間が減少しており,データ量の増加によってメモリアクセス時間が隠ぺいされたのではないかと考えられる.これら 2点から,画素あたりの処理時間が GPU処理の場合で小さくなっていると考えられる.結果として,GPU上での並列計算を行うことで SGC法の処理速度を大幅に改善できた.また,図 11,表 4より GPU実装後では t-linkとグラ

フカットの処理が大きな時間を占めている.t-linkの処理時間を精査すると,大半の時間が EMアルゴリズムに費やされていた.この 2つの事実から,CUDAZONEにて配布されているライブラリをそのまま利用するだけでなく,各種改良を加えていく必要があることがわかる.

6. 結 論

本研究では顕著性に基づく映像領域抽出方法をリアルタイム以内の時間で処理することを目的として,処理時間が大きな処理を GPUへ移植し,処理速度を大幅に改

善した.その結果,解像度 352x288では 2.1倍,640x512では 4.5倍に高速化することができた.また,解像度の増加に伴う処理速度の低下を改善できた.今後の課題として CUDA ZONE掲載のライブラリに依存する EMアルゴリズム・グラフカットの処理速度の改善,プラットフォーム依存性の低いOpenCLを用いた実装などが挙げられる.

文 献

[1] D.Greig,B.Porteous,and A.Seheuit,“Exact maxi-mum a posteriori estimation for binary images,”Roy-alstat,Vol.B:51,No.2,pp.271–279,1989.

[2] Y.Boykov,and M-P.Jolly,“Interactive Graph Cutsfor Optical Boundary & Region Segmentation of Ob-jects in N-D Images,”Proc.ICCV,Vol.I,pp.105–112,2001.

[3] P.Kohli,and P.Torr,“Dynamic graph cuts for ef-ficient inference in Markov random fields,”IEEETrans.PAMI,Vol.29,No.12,pp.2079–2088,2007.

[4] 福田恵太,滝口哲也,有木康雄,“AdaBoostと SaliencyMapを用いた Graph Cutsによる花弁領域の自動抽出法,”画像の認識・理解シンポジウム (MIRU2008)予稿集,IS3-33,pp.796–801,2008年 7月.

[5] 藤崎達也,井上誠喜,“顕著性マップとグラフカットの組み合わせによる自動物体抽出,”信学技報,PRMU2008–232,pp.145–150,2009 年 2 月.

[6] Y.Fu,J.Cheng,Z.Li,and H.Lu,“Saliency cuts:Anautomatic approach to object segmentation,”Proc.ICPR,2008.

[7] 福地賢,宮里洸司,木村昭悟,高木茂,大和淳司,柏野邦夫,“グラフコストの逐次更新を用いた映像顕著領域の自動抽出,”画像の認識・理解シンポジウム (MIRU2009)予稿集,2009.

[8] TSUBAME,http://www.gsic.titech.ac.jp/ ccwww/tebiki/tesla/tesla.html

[9] TMPGEnc 4.0 XPress,http://tmpgenc.pegasys-inc.com/ja/press/08 081030.html

[10] MediaShow Espresso,http://jp.cyberlink.com/prog/company/press-news-content.do?pid=2115

[11] 出口大輔,“GPUによる高速画像処理 ∼実例で分かるGPGPU∼,”,第 15回画像センシングシンポジウム・チュートリアルセッション,2009年 6月.

[12] http://www.nvidia.com/object/cuda home new.html[13] http://www.khronos.org/opencl/[14] http://www.amd.com/us/products/technologies/

stream-technology/Pages/stream-technology.aspx[15] http://msdn.microsoft.com/en-us/library/

ee663301(VS.85).aspx[16] http://www.opengl.org/documentation/glsl/[17] 宮里洸司,木村昭悟,高木茂,大和淳司,柏野邦夫,

“MCMC-based particle filterを用いた人間の映像注視行動の実時間推定,” 画像の認識・理解シンポジウム(MIRU2009)予稿集,2009年 7月.

[18] B.D.Lucas,and T.Kanade,“An Iterative Image Reg-istration Technique with an Application to Stereo Vi-sion,”Proceedings of the 7th International Joint Con-ference on Artificial Intelligence(IJCAI’81),pp.674–679,August 1981.

[19] L.Itti,C.Koch,and E.Niebur,“A model of saliency-based visual attention for rapid scene analysis,”IEEETrans.PAMI,Vol.20,No.11,pp.1254–1259,Novem-ber 1998.

[20] Y.Boykov,and G.F.Lea,“Graph cuts and efficient N-D image segmentation,”Proc.ICCV,Vol.70,No.2,pp.109–131,2006.

[21] A.Harp,“Computational Statistics via GPU,”http://andrewharp.com/gmmcuda

[22] V.Vineet,and P.J.Narayanan,“Cuda Cuts: FastGraph Cuts on the GPU,”CVPR Workshop on Vi-sual Computer Vision on GPUs,2008.