機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Image Generation from Scene Graphsを読んだのでメモ

はじめに

Image Generation from Scene Graphsを読んだのでメモ.言語から画像を生成する研究.複雑な文章からでも安定して画像生成ができるとのこと.

概要

ここではシーングラフGとノイズzを入力として画像を生成するモデルfの構築と学習を目標とする.モデルの特徴としてはシーングラフGをgraph convolutionで処理するところで,graph convolutionで埋め込まれた各物体の特徴ベクトルを使って物体とその関係性を考慮したsegmentation maskとBB(bounding box)を生成する.後は得られたsegmentation maskとBBとノイズを合わせて,cascaded refinement network (CRN)で画像\hat{I}を生成するというのが処理の大まかな流れ.

Scene Graphs

モデルの入力となるのは画像のシーングラフで,シーングラフは画像中に何の物体がいて,画像中の物体間にどのような関係性があるかを記述したグラフ.具体的には物体のカテゴリ\mathcal{C}と関係性のカテゴリ\mathcal{R}が与えられた時,グラフはG=(O,E)で記述され,O=\{o_1,\dots,o_n),\:o_i\in\mathcal{C}は物体の集合で,E有向エッジを表し,(o_i,r,o_j),\:o_j\in O,\:r\in Rで形成される.

この論文の問題設定では物体とその関係性を示すカテゴリは言語として与えられるため,自然言語で使われる埋め込み処理によりdenseな特徴ベクトルを作る.

Graph Convolution Network

単語の埋め込みベクトルを持ったシーングラフをend-to-endで処理するために,ここではオリジナルのgraph convolution networkを使う.

入力のグラフ(o_i,r,o_j)が持つ特徴ベクトルを(v_i,v_r,v_j),\:v_i,v_r,v_j\in\mathbb{R}^{N_{in}}とした時,3つの関数g_s,g_p,g_oを使って出力(v_i',v_r')を作る.v_r'を出力する関数g_pは関係性のベクトルが二つの物体からのみ決められるため単純で,v_r'=g_p(v_i,v_r,v_j)として3つのベクトルを入力とする関数.逆に物体に関するベクトルo_iを更新する場合は,ひとつの物体が複数の物体と関係性を持つためv_rの更新よりも複雑になる.もっと言えば,今回は有向グラフを考えているため,入ってくるエッジと出て行くエッジで意味合いが変わってくる.当然ある物体o_iに関するベクトルv_io_iと関係性を持つ全ての物体のベクトルを使って更新されるべきである.そこで,o_iから伸びる全てのエッジに対してg_sを使ってcandidate vectorを計算する.それと同様にo_iに入るエッジに対してg_oを使ってcandidate vectorを計算する.

\displaystyle
V_i^s=\{g_s(v_i,v_r,v_j):(o_i,r,o_j)\in E\}\\ \displaystyle
V_i^o=\{g_o(v_j,v_r,v_i):(o_j,r,o_i)\in E\}

このように各方向のエッジに関するcandidate vectorの集合が得られたらo_iに関する出力v_i'v_i'=h(V_i^s\cup V_i^oとして計算する.ただし,hは入力の集合をひとつのベクトルにするpooling関数.この論文では各関数g_s,g_p,g_oは3つのベクトルを入力とするニューラルネットで構成したとのこと.また,pooling関数hは入力のベクトルを平均する関数として定義したらしい.

Scene Layout

Graph convolution networkによってシーングラフからいい感じの情報を抽出した後はグラフで表現された情報を画像に起こす必要がある.ここでは画像生成の第1段階としてシーングラフをシーンレイアウトへと変換することを考える.シーンレイアウトはsegmentation maskとBBから作られ,maskとBBの推定にobject layout networkを使う.

Object layout networkは物体に関する埋め込みベクトルv_iを入力とし,M\times Mのsoft binary mask \hat{m}_iとBBの座標\hat{b}_i=(x_0,y_0,x_1,y_1)を出力する.要はGANのgeneratorの入力ノイズがgraph convolution networkで計算された物体の特徴ベクトルになったということ.細かいことを言えば,maskを出力するネットワークはtranspose convolutionで構成されたネットワークで最終層の活性化関数はsigmoid,BBを出力するネットワークは一般的な多層ニューラルネット.Object layout networkによって出力されたmaskはBBの領域にwarpされ,最終的に全ての物体に関するマスクを統合することでシーンレイアウトを作る.学習中はBBはground-truthを使ってシーンレイアウトをつくることに注意.

Cascaded Refinement Network

シーンレイアウトができたら後はそれをリアルな画像に起こすだけ.ここでは従来手法のCascaded Refinement Network (CRN)を使うとのこと.Cascadedと言うように,解像度を2倍にして行くmoduleを多段に積み上げていて,各moduleはシーンレイアウトと前のmoduleの出力を入力とする(ただし最初のmoduleは前段の出力の代わりにガウスノイズを入力とする).

Discriminator

ここまでで,シーングラフからの特徴抽出,シーンレイアウトの生成,画像の生成という3段構成で画像を生成したが,このプロセスをまとめて画像生成ネットワークfとしてend-to-endで学習する.学習はGANの枠組みに沿って行われ,discriminatorとしてD_{img},D_{obj}の二つを用意する.D_{img}は画像全体を入力とし,D_{obj}は物体領域を切り取って固定サイズにリサイズしたものを入力とする.要は画像全体のそれっぽさと物体のそれっぽさをそれぞれ学習するということ.ただし,D_{obj}は物体の分類問題も同時に解く.

Training

モデルが3段階構成でそれぞれGTを必要とするのでロスは結構複雑.まとめると次の6つのロスの重み付き和を最小化するように学習する.

・Box Loss Object layout networkのBBに関するロスでL_1 loss

・Mask Loss Object layout networkのmaskに関するロスでcross-entropy loss

・Pixel loss 画像の再構成に関するロスで,生成画像と真の画像とL_1 loss

・Image adversarial loss D_{img}に関するmin-max game

・Object adversarial loss D_{obj}に関するmin-max game

・Auxiliarly classifier loss D_{obj}の物体の分類問題に関するロス.

まとめ

これ学習できるのすごいなという気持ち.複雑なモデルを思いついても実際に学習させきる力がないからそういう力も養っていきたい.