点群×ディープラーニング【入門】

# はじめに

現在主流となっている点群処理モデル**「PointNet」**について解説する。

（なお、PointNetは2017年に提案されたモデルであり、その後さらに精度の高いモデルが多数提案されている。気になる方は[こちら](http://kaldir.vc.in.tum.de/scannet_benchmark/semantic_label_3d)を参照。）

また、特に断りのない限り，本記事で使用する画像は、こちらの論文[^2]からの引用。

# 従来手法: ３次元畳み込みニューラルネットワーク

**Volumetric CNN**：点群をボクセル化し、一層一層を画像として扱うことで、畳み込みニューラルネットワークの入力とする。

各ボクセルは 2 値で表現し，メッシュからボクセルに変換する際にボクセル内にデータがあるかどうかで 0 か 1 の値を決めて表現する。

Volumetric CNNの欠点として、ボクセル化する際に、点群データの空間特性が必然的に変化し、<font color="red">**物体の凹凸表現が欠損**</font>してしまうことが挙げられる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346997/8b61762f-730b-36af-1f65-ab085baf4180.png">

<font color="#777777">参照：VoxNet: A 3D Convolutional Neural Network for Real-Time Object Recognition[^0]</font>

# PointNet

![Screenshot from 2019-06-05 00-20-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346997/7a6e3579-3e3b-69d9-c803-1c8c209d6360.png)

PointNetは、クラス分類、セグメンテーション、検出など応用範囲が広く、与えられた点群全体に対してクラス分類を行うこともできるし、点群をセグメントに分割し、それぞれのセグメントに対してラベル付けすることもできる。

先述したVolumetric CNNで起きる問題に対し、PointNetは点群の空間特性を最大限残すための独自の点群処理方式を導入した。これにより、従来手法を超えるパフォーマンスを叩き出した。

PointNetで提案された点群処理方法の特徴は次の２点である：

- 特徴その１： 頂点インデックスの順番による影響をなくす
- 特徴その２： 回転による影響をなくす

本記事では、上記の課題について、PointNetがどのようなアプローチを取ったかを解説する。

## PointNetの構造

まずは、ネットワーク全体の構成について。
詳しい説明は省略するが、上段でクラス分類を行い、下段ではsemantic segmentationやpart segmentationを行う。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346997/1f3cabc2-f2b5-0046-c298-ba8bae4c8662.png" width="100%">


## 特徴その1. 頂点インデックスの順番による影響をなくす

![Screenshot from 2019-06-05 01-34-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346997/5bf664da-c653-430b-f885-e1dd0195b96c.png)

<font color="#777777">参照：Point Cloud Data Using Deep Learning[^1]</font>

上図のように、点群データは頂点インデックスを変えても本質的には何も変わらないため、データの順番に左右されないようなモデルを構築する必要がある。


そのための方法として、以下の３つが挙げられる。

- **一定の規則に従って、頂点をソートし直す**<br> ⇛ :negative_squared_cross_mark: 高次元空間での並べ替えは必ずしも上手くいかないのでダメ 
- **Data augmentation(データ拡張)によって、頂点の順番に影響を受けにくいモデルを作る**<br> ⇛ :negative_squared_cross_mark: データが爆発的に増えて現実的ではない（頂点がN個あったら、組み合わせはN!通り）
- **対称関数を使ったモデルを組む**<br> ⇛ :white_check_mark: 対称関数(symmetric function)とは...？

### 対称関数とは

対称関数とは、変数の順番を入れ替えても値が変わらない関数のこと。

例として、以下のような関数がある。

```math
\begin{aligned}
f(x_1, x_2, ..., x_n) &= x_1 + x_2 + \cdots + x_n \\
f(x_1, x_2, ..., x_n) &= \max\{x_1, x_2, ..., x_n\}
\end{aligned}
```

例えば、$x_1$と$x_2$を入れ替えても、値は変わらないので、対称関数と言える。

PointNetではこの対称関数の考え方を応用しており、全ての頂点に対して**同じ重みの多層パーセプトロン**をかけたり、プーリング層では**Max pooling**を行ったりすることで全ての頂点を平等に扱うことに成功している。

## 特徴その2. 回転による影響をなくす

"T-Net"と呼ばれるネットワークを組み込むことで、アフィン変換行列を推定し、その変換行列をかけることで回転による影響をなくすようにしている。

![Screenshot from 2019-06-04 23-03-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346997/f2e248f3-1cbb-3f5a-b6ae-0cafe6c9eae0.png)

# まとめ

最近の点群処理でよく使われる深層学習モデル **PointNet** について、解説した。
**対称関数**や**アフィン変換行列**を用いた点群処理モデル特有の工夫を説明した。

PointNetは、空間の細かい情報が抜けやすかったり、点密度を均一にすると精度が落ちたりといった欠点があったが、それを解決する手法 PointNet++ も提案されているので、興味があればぜひ[論文](https://arxiv.org/abs/1706.02413)を読んでいただきたい。

# おわりに

**ヒトやモノをデータ化＆解析してみたい**、という方。
**３D技術と深層学習を組み合わせて、何か面白いサービスを作ってみたい！**、という方。

弊社では一緒に働いてくれる仲間を大募集しています。

ご興味がある方は下記リンクから是非ご応募ください！
https://about.sapeet.com/recruit/


[^0]: [VoxNet: A 3D Convolutional Neural Network for Real-Time Object Recognition](https://www.ri.cmu.edu/pub_files/2015/9/voxnet_maturana_scherer_iros15.pdf)
[^1]: [Point Cloud Data Using Deep Learning](https://medium.com/@graju1401/point-cloud-data-using-deep-learning-a3c0a4042688)
[^2]: [PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation](https://arxiv.org/abs/1612.00593)