論文まとめ：Deep Closest Point: Learning Representations for Point Cloud Registration

# はじめに
ICCV2019より以下の論文
[1] Y. Wang, et. al. Deep Closest Point: Learning Representations for Point Cloud Registration. ICCV2019.

- arXiv:
https://arxiv.org/pdf/1905.03304.pdf

- 以下は著者らのコードか？:
https://github.com/WangYueFt/dcp

# 概要
- ２種類の点群が与えられた場合に、点群１から点群２へのR, t を求める手法
- 機械学習的な手法を取り入れて従来の ICP による手法の精度を上回った
- モデルとしてはまず２種類の点群をencoderで特徴量化し、それぞれをtransformer moduleで対応づける？

# 背景
## 従来手法の ICP
点群１と点群２のマッチング手法として、従来より Iterative Cosest Point(ICP)というものがある。以下はICPをわかりやすく解説してくれたサイト。
https://www.albert2005.co.jp/knowledge/robotics/spatial_recognition/icp_algorithm
これによると、１）点の対応関係からR, tを推定、２）R, tを用いて点を移動させ、対応関係を更新、の２つを繰り返すようだ。

しかし、この手法だと局所解に陥ってしまう。ノイズやスパース的な状況にも弱い。


## 本手法 DCP
著者らは Deep Closest Point(DCP)なるものを提案する。これは ICP をベースとして、ニューラルネットワークを取り入れ、最適化でマッチング・transformの推定を行うものだ。

これにより従来手法以上の精度を達成した。

# 関連研究

# 手法
## 諸々定義
一方の点群：
```math
\mathcal{X} = \{ {\bf x}_1, \ldots , {\bf x}_i, \ldots, {\bf x}_N \} \subset \mathbb{R}^3
```

もう一方の点群：
```math
\mathcal{Y} = \{ {\bf y}_1, \ldots , {\bf y}_j, \ldots, {\bf y}_M \} \subset \mathbb{R}^3
```

${\bf R}\_{\mathcal{X}, \mathcal{Y}} \in SO(3)$ ：点群 X から点群 Y へのrotation 
${\bf t}\_{\mathcal{X}, \mathcal{Y}} \in \mathbb{R}^3$ ：点群 X から点群 Y への translation 


# ネットワークのアーキテクチャ
## 全体像

ネットワークのアーキテクチャは以下の図。

![スクリーンショット 2022-10-02 3.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3173c131-5a1e-b4c9-702e-9c1cc8444e95.png)

1. ２つの位置から取得した point-cloud X, Y に対してDGCNN（あるいはPointNet）で point ごとに encode する
1. それら２点の特徴量に対してtransformerで一致する点同士のベクトルを近くする
1. SVDなどでRとtを算出する



## step 1：encode

点群 X および Y に対するDGCNN（もしくはPointNet）L 層からの特徴量は

```math
\mathcal{F_X} = \{ {\bf x}_1^L, {\bf x}_2^L, \ldots , {\bf x}_i^L,  \ldots , {\bf x}_N^L \} \\
\mathcal{F_Y} = \{ {\bf y}_1^L, {\bf y}_2^L, \ldots , {\bf y}_i^L, \ldots , {\bf y}_N^L \}
```

この特徴量は $\mathcal{F_X} \in \mathbb{R}^{N \times P}$ と各点が P 次元。


## step 2：transformerによる点群どうしのマッチング

相手の点群の情報を使って、対応する点は同じ特徴量になるようにする処理を $\Phi$ と考えると、 



```math
\Phi_{\mathcal{X}} = \mathcal{F_X} + \phi(\mathcal{F_X}, \mathcal{F_Y}) \\
\Phi_{\mathcal{Y}} = \mathcal{F_Y} + \phi(\mathcal{F_Y}, \mathcal{F_X})
```

$\phi$ はencoderからの出力に対して差分だけ学習するようになされている。残差を求めるので、φにより次元は変わらず。

```math
\phi: \mathbb{R}^{N \times P} \times \mathbb{R}^{N \times P} \to \mathbb{R}^{N \times P}
```

こうして求めた $\Phi\_{\mathcal{X}}$ の中のある i 番目の点とYのそれとの内積を計算すると

```math
\Phi_{\mathcal{Y}}\Phi_{\mathcal{{\bf x}_i}}^T
```

対応する点 $\Phi\_{\mathcal{{\bf y}_j}}$ との内積で値が最も大きくなるはず。よって Y の全点にわたってsoftmaxを求めると


```math
m({\bf x}_i, \mathcal{Y}) = softmax(\Phi_{\mathcal{Y}}\Phi_{\mathcal{{\bf x}_i}}^T) \tag{9}
```

この値は ${\bf x}_i$ と対応する点で最も１に近い値となるだろう。


## step 3：SVDにより R と tを求める

(9)式で求めた点群 X のある点 ${\bf x}_i$ に対する点群 Y の一致度的なもの m を用いて、Yの中から一致する点を抽出する。

```math
\hat{{\bf y}_i} = Y^T m({\bf x}_i, \mathcal{Y}) \in \mathbb{R}^3 \tag{10}
```
この対応する点群のペアより論文中の(3)式、(4)式のSVDを用いた手法で R, t　を求めるが、ここはよくわかってないので省略。

# Loss
Lossは推定したR, t とそのターゲットとの差にノルムを加える。

```math
Loss = \| {\bf R}^T_{\mathcal{XY}} {\bf R}^g_{\mathcal{XY}} - I \|^2 + \| {\bf t}^T_{\mathcal{XY}} - {\bf t}^g_{\mathcal{XY}} \|^2 + \lambda \| \theta \|^2 \tag{11}
```

# 実験と結果

以下は ModelNet40 datasetを用いて各種test dataに対する精度を他のモデルと比較したもの。DCP-v1 はattention無し、DCP-v2はattentionあり。

![スクリーンショット 2022-10-02 6.50.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/116b25d1-6937-ef05-bc81-11153a906e30.png)