Pytorch PVCNN:Point-Voxel CNN for Efficient 3D Deep Learning #2 です。
mit-han-lab/pvcnn
Pytorch PVCNN:Point-Voxel CNN for Efficient 3D Deep Learning で学習ができたので、結果確認をしてみます。
開発環境
OS: Windows10
言語: Python 3.7.9
Pytorch 1.7.1 gpu
開発ツール: Eclipse
その他ツール:
VisualStudio 2017 community
MYSY2: ./data/shapenet/download.sh でのみ使用。
1. 評価
オリジナルでは、下記、スクリプトを実行します。
> python train.py configs/shapenet/pvcnn/c1.py --devices 0 --evaluate
但し、これでは、面白くありません。
第一、通常のアプリケーションで使えるような代物ではありません。
たとえは、1件の画像 (Point Cloudデータ) を入力して、その結果を利用する。
には、使えません。
なので、今回少し改造をしてみました。
2. Predict に改造。
使うデータは、同じ様に、ダウンロードした物をつかいますが、
1件毎に、Predict して、その シェイプ(クラス) を判定して、Open3d で表示します。
evaluate\shapenet\eval.py をコピーして、predict.py として改造します。
evaluate\shapenet\predict.py
実行は、下記になります。
> python evaluate\shapenet\predict.py configs/shapenet/pvcnn/c1.py --devices 0
PREDICT_SHAPE=3 で、検索したい、シェイプの番号を指定します。
或いは、
PREDICT_SHAPE=None
これをベースに改造すれば、もしかしたら、 Depth カメラの撮影データを、PointCloud に、変換して入力すれば、判定できるかもしれません
4. 動作
vote_confidences = F.softmax(model(inputs), dim=1) <-- model の実行です。
入力は、 inputs=(batch,C,Point)
batch: 1
C: Channel = (x,y,z,r,g,b,shape_one_hot[16]) -> 22
Pytorch は、 Channel First で、データ入力するとの事です。
shape_one_hot[16] は、トレーニング時の正解 Shape ID を渡すみたいです。
今回は、prediction なので、中身は不要か?
プログラム動作としては、こちらも、 Input Points(2048) 毎に、クラスを判定して、
(batch,50,point) で、ポイント毎に、50 classの Accuracy を出力します。
Accuracy は、F.softmax() で、確率関数で取り出しています。
今回は、 16 shape を 50 class に分散して使っているようです。
なので、最後に 50 class の acc を 16 shape に纏めて完了です。
2048 ポイント毎の 最大acc が、どの class(shape) になるかカウントすれば、
最終的 class(shape) 判定になります。
或いは、class(shape) 毎に、point を纏めて Open3d で表示すれば、セグメント表示になります。
プログラムとしては、Point Cloud を入力とする、Classification です。
5.感想
こちらのプログラムの入力の PointCloud も、物体の全方向からのデータなので、
Depth カメラの撮影データのように、一方向からのデータの入力には適さないのか?
どうやら、学習させるデータセットによって、Model の扱える、データ形式が変わってくるみたいぞね。
おんちゃんが期待しているのは、どうやら、 KITTI ( Tensorflow での試み例: Frustum-PointNet ) のようです。
Frustum-PointNet の記述では、RGB-D データ入力で、屋外、屋内の両方に対応するみたいです。
肝は、 RGB画像上で、2D による物体検出を行った後、
該当2D 領域から、 3D点群 に変換して、点群判定をするみたいです。
そうする事で、入力の全ての3D点群に対して、3D検出器を通す必要が無くなるとの事です。
なるほど、理に叶っとるどね。(Edge の日本語翻訳機能を使いました。)
しかし、おんちゃんの素人考えでは、折角RGB-D で奥行の情報が付いてくるので、
それを利用して、先に、3Dで、各オブジェクトの領域抽出をして、該当3D領域を 2D 領域に変換して、
2D のクラス判定をした方が良い気がしますが。
但し、データ量が膨大か? オブジェクトまでの距離情報も求めたいのか?
どちらかと言えば、S3DIS の方が、おんちゃんの目的するデータに近いが、
屋内限定であれば、使えないかも?
ともあれ、KITTI で、RGB-D を試した後で、Intel RealSense Depth Camera D435 等を手に入れて試してみたいぞね。
おんちゃんの、最終目標は、Depth カメラ入力で、畑の畝などの境界を判定することです。
まだまだ、遠いところじゃ。
ROS の Depth Camera Point Clouds2 を使った Active SLAM/Mapping で、畝の高さを、
障害物として判定させるアプローチの方が手っ取り早いのかも。