3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

ロボットの頭部をAIでデザインできないかと試してみたい ー3Dの畳込み層を使ってみるー

前回の試作では3Dモデル生成のためのGAN(敵対的生成ネットワーク)の構成は2次元の画像を生成するのと全く同じでした。3次元座標情報をさながら地球儀を紙の世界地図に展開するようなかたちで2次元に展開し、ネットワークに入力していたわけです。その後、GANの実装に使われているTensorFlowライブラリの仕様を調べていたらConv3DとかUpSampling3Dといった3次元情報を直接処理する層が用意されていることを知りました。それなら、Conv2Dの代わりにConv3D、UpSampling2Dの代わりにUpSampling3Dを使えば3次元データを直接学習、生成できるだろうということで試してみたのが今回の報告です。
前回は3次元空間上の点を極座標形式(r, θ,Φ)で表して n等分したθ,Φに対してrの値を計算して3Dモデルとしていました。今回はすなおに3次元空間上の座標を(x, y, z)で表現しn×n×n個の座標に対してそこに点があるかどうか(1~-1、値が大きいほどそこに点がある可能性が高いとする)を計算して3Dモデルとします。

問題は2次元から3次元になったことで学習に必要な計算量が飛躍的に増大したことです。普段使っているPCでは1回のバッチ分の計算にも1時間近くかかる始末、何千回の繰り返しなんてとてもおぼつかない。そのため今回の学習にはGoogle Colaboratory(略称: Colab)というクラウドサービスを使わせていただきました。連続して使用できる時間などに制限はありますが、アクセラレータ付きのサーバー上でPythonプログラムを無料で実行することができます。

それでもn=64(64×64×64)の分割ではすぐにリソース制限にひっかかってしまうので、今回はn=32(32×32×32)の分割で処理を行うことにしました。学習が終わればネットワークの重み係数のファイルをダウンロードして、3Dモデルの生成を自分のPCで行うことができます。100次元の値ランダム(1~-1)のベクトルを生成して生成用のネットワークで処理するのですが1個数十秒程度で3Dモデル(32×32×32のnumpy配列)が生成されます。

ノイズの消去や閾値処理等を行ってからOBJ形式に変換(点だけの情報に面情報を付加するプログラムを作成)したのが以下のような感じ。

f:id:ichidaya:20210220171418j:plain

OBJ形式に変換直後の3Dモデル

ここから先は自分でプログラムを作るのはめんどくさいのでZBrushに読み込んで行うことにします。まず、離れ小島のような塊を削除してから左右対称に整形します。

f:id:ichidaya:20210220171724j:plain

左右対称に整形

自作のOBJ生成のロジックがいまいちでメッシュが汚いのでダイナメッシュをかけてスムーズにします。

f:id:ichidaya:20210220172026j:plain

ダイナメッシュ適用後

前回よりはだいぶロボットの顔らしくなってる! そう思いたい..

以下にいくつか生成例を載せています。

f:id:ichidaya:20210220172644j:plain

ロボット頭部の生成例1

f:id:ichidaya:20210220172722j:plain

ロボット頭部の生成例2

f:id:ichidaya:20210220172807j:plain

ロボット頭部の生成例3

頭部全体の輪郭が人の形っぽいものや、平べったいかたち、アンテナ(角?)っぽいものがついたもの、前回の極座標形式での生成よりもバリエーションが増えた気がします。