ぽきたに 〜ありきたりな非凡〜

日々の独り言とちょっとした発信

3次元畳み込みニューラルネットワークを用いて3次元モデルを分類してみる(ボクセル)

どうもたっきーです.

久しぶりの投稿です.最近は全然技術的発信できてなかったのでダメ.やっていくぞという気持ち.

 

はじめに

f:id:tacky0612:20190306150254p:plain
Architecture
近年,データが多く収集できるようになり,その活用方法が〜〜(DeepLearning系論文冒頭のテンプレート)
まぁ,深層学習が流行ってて,画像分類なんかの近年の成長具合は目を瞠るものがありますね....
僕もなにかのタスクで適応できないかなーって思って3DCADモデルの分類をやってみます.

扱うデータセット

f:id:tacky0612:20190307041545p:plain
ModelNet10/40
3DCADのデータセットとして有名なModelNet10/40を使います.深層学習を行なうには十分な量のデータがあります.
(適当に十分な量のデータって書いたけど,実際に現実問題として汎化性能を得るためのデータ量ってどのくらいなんだろうね?)

modelnet.cs.princeton.edu

コードと使い方

↓ 以下Githubを参照 ↓ github.com

下手くそな英語でReadme.mdが書かれてます. 改善点なんかあれば気軽にプルリクとか下さい...

手法

基本的にVoxnetという手法にならって実装しています.
使用フレームワークKeras.分岐構造をもつネットワークが書きたかったのでFunctionalAPIで書いてます.

以下に処理の流れを書きます.
なお,すでにデータはダウンロードしてあり,環境構築は済んでるものとします.

  1. 3Dモデルをボクセルに変換

    f:id:tacky0612:20190307043315p:plain
    ボクセル化
    ボクセルデータの生成の流れを以下に示す.

    1. 3Dモデルの頂点の座標値(x,y,z)と面を構成する点の配列を取得
    2. 取得した面上に無作為に点(x,y,z)を定義
    3. 点の最大値と最小値を求め,3Dモデルの中心が原点(0,0,0)にくるように正規化
    4. 323232のグリッドで空間を区切り,そのグリッド内の店の有無を判定
    5. 点が存在するなら1を,無いなら0を返す(これをバイナリボクセルという)

    ↓これで作られるボクセル↓

    f:id:tacky0612:20190307045116p:plain
    ボクセル

  2. アスペクト比の情報を追加してみる ボクセルの情報だけでもいいんですけど,追加情報としてアスペクト比の情報を用いてみます. 入力とする情報量が多い(無効な情報は無い場合)と計算量が増加してしまう.ので,今回はあまり情報量の多くないアスペクト比の情報を追加してみました.

  3. モデルの構築 Kerasを使って二ューラルネットワークを構築します. VoxNetと違う点としてはアスペクト比の情報を取り入れてる点と3DCONVの後にDropout層を追加して汎化性能を高めてるところです.
    ↓ ネットワーク図 ↓

    f:id:tacky0612:20190307045840p:plain
    ネットワーク図

  4. 学習と評価

とまあ,ざっとこんな流れです.

ここで,2つほど疑問に思うことがあるかもしれません.
なんで面上に点を定義してからボクセル化するの?頂点の情報をそのまま扱わないの?という点と,アスペクト比の情報を追加してるけど分類タスクにおいて有効な情報なのか?という点です. 前者は,頂点だけだと単純な形状だと点と点の距離が広く,形状を上手く表現できないからです. って言葉で書いても分かりづらいと思うので,以下の図で説明.

f:id:tacky0612:20190307054417p:plain
頂点情報のみ
f:id:tacky0612:20190307054422p:plain
面上に点を定義した場合

とまあ,このように3Dモデルの頂点情報だけじゃ形状表現には向かないのです.
あと,面上に定義する点の数を多くすれば形状の表現力があがります.まあ,これは計算時間とトレードオフなので適切な点数を選定する必要がありますかね...

そして後者は,アスペクト比の分布の可視化を行ってクラスごとの分離感をみて判断したいと思います.

f:id:tacky0612:20190307105736p:plain
ModelNet10のアスペクト比の分布

↑の図はModelNet10の3Dモデル毎に横軸にy/x,縦軸にz/xの比としてプロットしたものになります.見易さのために各軸は対数表示にしてあります.
オレンジのchairクラスと黄色のsofaクラスのようにある程度アスペクト比で分類できるのかな?という印象です.

↓さすがに40クラスにもなると分離感が見づらくなりますね...

f:id:tacky0612:20190307110203p:plain
ModelNet40のアスペクト比の分布

実験

上記の手法で3Dモデルを分類する実験をしてみた.
学習用のデータと評価用のデータを用意する.
ニューラルネットワークの入力としてボクセルデータとアスペクト比のデータを与えて学習し,出力として分類精度を得る.

以下に条件を示す.

実験条件

変数 内容
ボクセルサイズ 32×32×32
点群数 10000
最適化アルゴリズム AdamOptimizer
学習率 0.001
バッチサイズ 128
Dropout率 0.5
エポック数 40
活性化関数 ReLU

データ数

ModelNet10 ModelNet40
ファイルフォーマット .OFF .OFF
学習用データ 3991 9843
評価用データ 908 2468
合計 4899 12311
クラス数 10 40

結果

実験の結果を以下に示す. なお学習エポック内で一番精度の高かったものを採用している.

入力情報 ModelNet10 ModelNet40
アスペクト比のみ 0.4736 0.2751
3DCONVのみ 0.8976 0.8590
3DCONV+アスペクト比 0.9086 0.8663
VoxNet論文 0.920 0.830

学習曲線(3DCONVのみのやつとアスペクト比の情報を加えた場合の比較)

f:id:tacky0612:20190307105422p:plain
ModelNet10の学習曲線

f:id:tacky0612:20190307110247p:plain
ModelNet40の学習曲線

混合行列

f:id:tacky0612:20190307111222p:plain
ModelNet10の混合行列
f:id:tacky0612:20190307112907p:plain
ModelNet40の混合行列

まとめ・考察

3次元モデルの分類をいい感じにできたと思う.

混合行列から読み取れるように,tableクラスとdeskクラスのペア,dresserクラスとnight standクラスのペアで誤認識する傾向がある.これより,3次元形状が似通っているクラスについては誤認識してしまうことがあることがわかる.これはボクセルの分割数を上げ,3次元モデルの表現をより鮮明にできれば改善する余地があるが,計算量の増加などの問題が〜〜〜って感じ.

あと,結果と学習曲線をみてみて,アスペクト比の情報は無いよりかは在ったほうが微量ではあるが分類精度に貢献しているのかな〜〜って感じ.

今回の実験では,ボクセル化したデータを見ているので,大きさの変動にについてはロバストな気がします.しかし.データ向きが整形されていないデータに対しては上手く学習できないかもしれません.
というのも,今回扱ってるデータセットは向きについて整形されていて(例えばMonitorクラスはxy平面に画面が来るのように),故に上手く3次元畳み込みニューラルネットワークで学習できてるのですが,LiDERみたいなやつで取得した3次元データに対してはこの手法は使えないのかな〜〜という感じです.(あくまで推測ですが)

あと汎化性能についてですが,ModelNetで学習済みの重みを用いて,インターネットから拾ってきた適当なCADモデルを分類したら案外あたったのでまぁ大丈夫なのかな〜〜〜という感じ.(適当)(ちゃんと検証していない)

P.S.

就活したくない…誰か雇って下さい…企業に吸い込まれたい...
ワタシ,AIチョットデキル…

スポンサードリンク