Kaggleに挑戦-2
Kaggle挑戦-1では、バウンディングボックス関係の文献を調べたもので、ベースとなるANNは基本的にはYOLOであった。
YOLOの損失関数を理解し、その後で、6D検出の損失関数を理解する予定だったが、物体の姿勢を表現する、yau, pitch, roll, Quaternionなどの用語、特にQuaternionがわからないとそこで終わってしまう。
そこで、文献調査して、自動運転に関する文献で、Quaternionsの単語が入っているものが見つかったので、読んでみる。
6D-VNeT: End-to-end 6DoF Vehicle Pose Estimation from Monocular RGB Images, D. Wu, Z. Zhuang, C. Xiang, W. Zou and X. Li
この図の右端に、Rotation(quaternions)という単語が見えている。
本文中では、Rotation lossという項目を設けて、説明されており、なぜオイラー角やSO(3)回転マトリクスではなくQuaternionsを使うのかが説明され、回転に関する損失関数が示されている。
ネットワークのモデルについては、Faster R-CNN、Mask R-CNNなどが参照されており、end-to-end trainingができるように注意深くデザインしたとのこと。
Fig.3に示されている通り、前半部分にMask R-CNN(2D物体認識)を用い、後半部分で物体の姿勢情報(6DoF)を評価するためのネットワークを追加している。
この後半部分の機能が、車体の姿勢を正しく評価するために重要なのだが、説明に使われている「RoIAlign」の意味が分からず、付いていけないので、ちょっと、Mask R-CNNに戻る。
Mask R-CNN, K. He, G. Gkioxari, P. Dollar and R. Girshick
Fig.1に、「RoIAlign」層とおぼしきものが大きく描かれているではないか!
このMask R-CNNは、Faster R-CNNに既に存在している分類とバウンディングボックスのブランチと並行して、各RoI(Region of Interest)にセグメンテーションマスクのブランチを追加したものである。そのマスクブランチは、各RoIに対する小さなFCNで、ピクセル単位でセグメンテーションマスクを形成することができる。
最も重要なこととして挙げられているのが、「RoIAlign」と呼ばれるシンプルな層の導入である。もともと、Faster R-CNNは、ピクセル単位で入力と出力が一致するようにアラインメントするようには設計されていない。RoIAlign層の導入によってマスクの精度は、相対的に10%から50%も向上したとのことである。
さて、6D-VNetに戻ろう。
ここからが、ほんとうに、骨の折れる作業になる。
3.1. Network Architecture
3.2. Joint Losses
Sub-category classification loss
Rotation loss
Translation loss
3.3. Weighted Non-local neighbour embedding
*問題点
1.コードはGitHubni公開されていることを確認したがPyTorchである。
2. Quaternionsの理解が進まない。
*対策案
1.1 PyTorchiを使えるようにする。
Pytorchをインストールする。基本的な文法を押さえておく。
1.2 Kerasに置き換える。
PyTorchの理解が不可欠なだけでなく、プログラムの理解も不可欠。
2.理屈はわからなくとも、3種類の角度の定義やQuaternionsへの変換式などがわかればよいのではないか。
*実行計画
1.GitHubにあるPyTorchのコードをKerasに書き換える。
2.プログラム書き換えの際にQuaternionsと回転角との関係などがわかることを期待する。
早速、明日から、PyTorchで書かれたプログラム「6DVNet」の理解とKerasへの変換にとりかかる。
難しいだろうけど、やるしかないな。
まずは、5日間!