学習用3Dデータの準備に関する備忘録
IM-NETのプログラムが掲載されているgitのリポジトリには学習用の3Dデータをどこから取得するかという点についても記述がありました。ShapeNetとうい3Dデータを集めるプロジェクトがあるんですね。
Robotの顔なんていう特殊なカテゴリはありませんが、airplaneとかcarとかの3Dデータが3万個ぐらいはあるので、thingiverseから集めたロボットの顔データと組み合わせればよい学習ができそうです。
ShapeNetのデータはmat形式というmatlabで使われている形式で格納されています。scipyパッケージを使ってロードできますが、簡単なデータ圧縮が行われている状態で読み込まれるようです。圧縮を伸長して256x256x256のボクセルデータを得るコードはこんな感じ。
上記の例だと縦、横、高さで256x256x256のデータが16x16x16個の小区画(1区画は16x16x16のボクセルデータ)に分割され”b”に1次元配列として格納されています。"bi"の3次元配列は”b”の1次元配列へのインデックスを保持しています。形状の外側は16x16x16のボクセルデータが全部0、内側は全部1になることが多いので1次元配列の長さは16x16x16=4096をワーストケースとして通常はそれよりもだいぶ短くできるわけです。
あとOBJ形式のサーフェスモデルからボクセルデータを生成する処理を自作のプログラムからshapeNet推奨のbinvoxに乗り換えることにしました。binvoxのほうが速いしサーフェスの内部を埋める処理を私のいいかげんプログラムより正確にやってくれるからです。
-rotz -rotxはShapeNetと私のデータとで前後の向きが逆だったのでその補正をしています。出力はbinvoxという形式ですがbinvox_rwというパッケージで簡単に生の3次元データを抜き取ることができます。