見出し画像

Kaolin / ポイントクラウド分類器の訓練

1. Kaolin

Kaolin」は、Nvidiaが提供する3Dディープラーニングの研究を加速することを目的としたPyTorchライブラリです。深層学習システムで使用するための微分可能な3Dモジュールの効率的な実装を提供します。

2. Kaolinの機能

「Kaolin」は、次のようないくつかの3Dタスクをサポートしています。

・微分可能レンダリング
Neural Mesh Renderer、そのPyTorch版Soft RasterizerDifferentiable Interpolation-based Renderer、モジュール式で拡張可能で抽象的なDifferentiableRenderer仕様)

・単一画像ベースのメッシュ再構築
Pixel2MeshGEOMetricsOccupancyNetsなど)
・点群の分類とセグメンテーション
PointNetPoinNet++DGCNNなど)
・メッシュの分類とセグメンテーション
MeshCNNGCN
・ボクセルグリッド上の3D超解像度
ODM、VoxelUNetなど)
・基本的なグラフィックユーティリティ
(ライティング、シェーディングなど)

3. Model Zoo

「Kaolin」は、一般的な3D DLアーキテクチャのリファレンス実装を含む大規模な「Model Zoo」を提供します。

4. Kaolinのインストール

◎ サポートしているプラットフォーム
「Kaolin」はLinuxプラットフォームで公式にサポートしており、Ubuntu 18でビルドおよびテストしています。WindowsおよびMacのサポートは実験的であると考えてください。

◎ Kaolinのインストール
「Kaolin」はPython 3.6以降を想定しており、ビルドにはCUDA対応のマシン(つまり、nvccがインストールされているマシン)が必要です。

(1) 仮想環境の作成

$ conda create --name kaolin python=3.6
$ conda activate kaolin

(2) numpyのインストール
セットアップファイルはこれらの依存関係を自動的にインストールしないことに注意してください。

$ conda install numpy
$ conda install cython  # 自分の環境ではこれも必要でした

(3) PyTorchのインストール
PyTorchの公式サイトの指示に従って、PyTorchをインストールします

(4) Kaolinのインストール

$ git clone https://github.com/NVIDIAGameWorks/kaolin.git
$ cd kaolin
$ python setup.py install

◎ インストールの確認
「Kaolin」がインストールされたことを確認するには、Pythonインタープリタで、次のコマンドを実行します。Kaolinのルートディレクトリでは動作しなかったので抜けてから実行します。

$ cd ..
$ python
>>> import kaolin as kal
>>> print(kal.__version__)
1.0.0

◎ ドキュメントの作成
ライブラリを詳しく調べるには、以下のコマンドで、ドキュメントを作成します。 「_build」の「index.html」にドキュメントが生成されています。

$ cd docs
$ sphinx-build . _build

5. Kaolinのサンプル

Kaolinのサンプルは「kaolin-examples」にあります。サンプルには、微分可能なレンダラー、ボクセル超解像などが含まれています。

・Classification
・GANs
・ImageRecon
・SuperResolution

今回は一番簡単そうな「Classification」を試します。

6. ポイントクラウド分類器の訓練

「Kaolin」は、3D DLアプリケーションのコーディングのハード/トリッキーな部分をすべて内包することにより、3Dディープラーニングを容易にします。3Dデータの分類子の訓練がいかに簡単になったかを理解するために、簡単なデモを紹介します。

◎ ModelNetのダウンロード
「ModelNet」のデータセットは、学術研究の便宜のためにのみ提供されていることに注意してください。便宜上、データセット作成者から元の著作権を複製します。

**Copyright**
All CAD models are downloaded from the Internet and the original authors hold the copyright of the CAD models. The label of the data was obtained by us via Amazon Mechanical Turk service and it is provided freely. This dataset is provided for the convenience of academic research only.

Princeton ModelNet」ページで入手できます。このページで、ModelNet10ダウンロードリンクに移動して、データセットを取得します。

◎ パッケージのインポート
はじめに、パッケージをインポートします。

import torch
from torch.utils.data import DataLoader
import kaolin as kal
from kaolin import ClassificationEngine
from kaolin.datasets import ModelNet
from kaolin.models.PointNet import PointNetClassifier as PointNet
import kaolin.transforms as tfs

◎ パラメータの定義
次に、パラメータを定義します。

modelnet_path : ModelNetデータセットのパス。
categories : 分類を学習するカテゴリ。
num_points : メッシュ→ポイントクラウド変換時のポイント数。
device = 'cuda' : GPUで実行するように指示。

modelnet_path = 'path/to/ModelNet/'
categories = ['chair', 'sofa']
num_points = 1024
device = 'cuda'

◎ 変換の定義
「メッシュをポイントクラウドに変換」後、「正規化」を行う変換を定義します。

transform = tfs.Compose([
    tfs.TriangleMeshToPointCloud(num_samples=num_points),
    tfs.NormalizePointCloud()
])

◎ 訓練用と検証用のDataLoaderの作成
訓練用の「DataLoader」を作成します。

train_loader = DataLoader(ModelNet(modelnet_path, categories=categories,
    split='train', transform=transform, device=device),
    batch_size=12, shuffle=True)

同様に、検証用の「DataLoader」を作成します。

val_loader = DataLoader(ModelNet(modelnet_path, categories=categories,
    split='test',transform=transform, device=device),
    batch_size=12)

◎ ポイントクラウド分類器の訓練
「ClassificationEngine」クラスを使用して、分類器の訓練を実行します。
最も簡単なポイントクラウドニューラルアーキテクチャである「PointNet」で訓練および検証を行います。

engine = ClassificationEngine(PointNet(num_classes=len(categories)),
    train_loader, val_loader, device=device)
engine.fit()

次のような訓練と検証の統計情報が出力されます。

Epoch: 0, Train loss: 0.6302577257156372, Train accuracy: 0.6666666865348816
Epoch: 0, Train loss: 0.608104020357132, Train accuracy: 0.7083333432674408
Epoch: 0, Train loss: 0.5694317619005839, Train accuracy: 0.7222222288449606Epoch: 9, Val loss: 0.0007336708978982643, Val accuracy: 1.0
Epoch: 9, Val loss: 0.0006904241699885461, Val accuracy: 1.0
Epoch: 9, Val loss: 0.0006549106868025025, Val accuracy: 1.0

「Kaolin」を使用してポイントクラウドデータで最初の3D分類器を訓練できました。

7. 結果の視覚化

◎ テスト用のDataLoaderの作成
「val_loader」と同じデータをシャッフルする、テスト用の「DataLoader」を作成します。

test_loader = DataLoader(ModelNet(modelnet_path, categories=categories,
    split='test',transform=transform, device=device),
    shuffle=True, batch_size=15)

◎ 結果の視覚化
次に、ユーティリティ関数(utils.py)を使用して予測結果を視覚化を行います。ここでは、正しい場合は緑、間違っている場合は赤になります。

from utils import visualize_batch
test_batch, labels = next(iter(test_loader))
preds = engine.model(test_batch)
pred_labels = torch.max(preds, axis=1)[1]
visualize_batch(test_batch, pred_labels, labels, categories)

画像1


この記事が気に入ったらサポートをしてみませんか?