2023.01.11
GANによる画像から3Dデータの生成
こんにちは、次世代システム研究室のT.Iです。
最近Stable DiffusionやMidjourneyなどの画像生成系AIが流行ってますよね。流行に乗ってGANを作ってみたいと思ったのですが、同じように画像生成をしても面白くないです。そこで今回は次元を一つ増やして3Dデータの生成を行うことにしました。
1.3Dデータについて
今回作成するGANは画像を入力としてPointCloudを生成するモデルです。PointCloudとは単純にx,y,zの座標を並べただけのデータで描画時は点を3次元空間にプロットして3Dデータとして表示することになります。
mesh形式はこれに面情報が入ったものです。
2.モデルについて
モデルのレイヤーの詳細は図のようになっています。入力の画像解析の部分は基本的には単純な2DConvを使用して、PointCloud生成にはTreeGANを使用しています。出力はConv1Dを使用してPointCloudを畳み込んで最後に全結合で特徴抽出しています。また、入力データと出力データを対応させるため、Discriminator側は入力の画像も同時に解析するような仕組みとなっています。
3.TreeGCNについて
PointCloud自体はConv3Dや全結合層、GCN(Graph Convolutional Network)でも生成可能ですが、今回はTreeGCNを使用しました。その理由としては他のレイヤーで生成すると、PointCloudの点の位置関係に依存する、複雑なデータを生成できないといったデメリットがあるため、それらを解決したTreeGCNを使用しました。詳しくは論文、ソースコードをご確認ください。
4.結果
今回のモデルを使用してドット画風の動物のPointCloudを学習させ、以下のようにPoindCloudを生成することができました。これはペンギンの画像とペンギンのPointCloudを対応させて学習させ、教師データとは別のペンギンの画像を入力して生成されたPointCloundです。左が生成されたデータ、右が教師データとなります。しかし、一部うまく学習できていないものもありました。
また、教師データには入っていない動物とは全く関係ない画像を入力すると、以下のように学習させた動物のキメラのようなもののPointCloudの生成もできました。以下のはリスと鶏が組み合わさったように見えます。
5.学習時のコツ
今回学習させる際、以下のような点に気をつけました。
・lossはbinary cross entropyではなくwasserstainを使用しないとうまく学習できない
・lossはgradient penaltyを組み合わせた方が結果が良くなる
・dropout層を使用するとうまく学習できない
6.まとめ
・画像からPoindCloudを生成することができました
・画像の動物とPointCloudの動物を対応させて学習させることができた
・うまく対応していないものもあった
・複数の動物を組み合わせたようなキメラが生成できた
最後に
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。 皆さんのご応募をお待ちしています
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD