Image Generation from Scene Graphs

 Image Generation from Scene Graphs

Scene Graphsから、画像を生成する手法が発表されていましたので、実装してみました。

■論文
https://arxiv.org/abs/1804.01622

手法としては、文内の単語関係をグラフ構造化(Scene Graph)し、各オブジェクト表現についてGraph Convolutionで畳み込みます。そして、その特徴量を利用してオブジェクト領域/セグメンテーションを予測します。そしてGANのようにGeneratorとDiscriminatorを使用し、学習しています。

実際に実装してみましたが、Scene Graphの構造は、json形式のファイルを見るとよりわかりやすいと思います。例えば、画像に「空」、「草原」、「羊(2匹)」、「木」、「海」、「ボート」を登場させたい場合、以下のような書き方になります。

“objects”: [“sky”, “grass”, “sheep”, “sheep”, “tree”, “ocean”, “boat”],

わかりやすいですね。
そして、このそれぞれのオブジェクトにの位置関係を指定します。

 ・草原の上に雲がある
 ・羊は草原にいる
 ・2匹の羊はそばにいる
 ・羊の後ろに木がある
 ・木のそばには海がある
 ・海にボートがある

こちらをjson形式に書き換えたのが以下です。

“relationships”: [
[0, “above”, 1],
[2, “standing on”, 1],
[3, “by”, 2],
[4, “behind”, 2],
[5, “by”, 4],
[6, “in”, 5]
]

これもイメージがつきやすいですね。
この条件で画像を生成すると以下のようになります。

羊がかわいいですね(笑)

その他の結果も見ていきます。
例えば、
“objects”: [“sky”, “water”, “person”, “wave”, “board”,],
“relationships”: [
[0, “above”, 1],
[2, “by”, 1],
[2, “riding”, 3],
[2, “riding”, 4]
]
と指定すると、
 ・水の上に空がある
 ・人のそばに水がある
 ・人が波に乗っている
 ・人がボードに乗っている
となりますので、以下のような出力になります。

また、
“objects”: [“bus”, “street”, “line”, “sky”],
“relationships”: [
[0, “on”, 1],
[2, “on”, 1],
[3, “above”, 1]
]
と指定すると、以下のような出力になります。

生成物の位置関係は指定できるので、あとはそれぞれの物体の生成の精度を上げてみたいと思いました。