mmdetection3dに自分で取得した点群データをdetectorに入れてみた

これはLiDARのカレンダー | Advent Calendar 2023 - Qiita23日目の記事です

mmdetection3d

これはオープンソースの自動運転などに使用されるLiDARが取得した点群に対して学習、推論できるリポジトリです

githubはこちらです

github.com

今回はこちらに自分が作成したデータを指定された形に整形して動かす方法を記載します

使い方

まず、環境構築のためにチュートリアルを以下の部分をすべて終わるまで進めましょう

  1. dockerで環境構築
  2. demo_pcd.pyの実行&動くことを確認

ここまでいくと環境構築は完了です

ここからが本題です

次に、自分のデータを作成していきます

demo_pcd.pyを動かしてみるとわかるかもしれませんが、pcdファイルではなくbinファイルを用意しなければいけません

そのコードはチュートリアルの以下にあります

Customize Datasets — MMDetection3D 1.3.0 documentation

import numpy as np
from pypcd import pypcd

pcd_data = pypcd.PointCloud.from_path('point_cloud_data.pcd')
points = np.zeros([pcd_data.width, 4], dtype=np.float32)
points[:, 0] = pcd_data.pc_data['x'].copy()
points[:, 1] = pcd_data.pc_data['y'].copy()
points[:, 2] = pcd_data.pc_data['z'].copy()
points[:, 3] = pcd_data.pc_data['intensity'].copy().astype(np.float32)
with open('point_cloud_data.bin', 'wb') as f:
    f.write(points.tobytes())

このコードを実行して動かしてみましょう

 

...あれ、うごかない

 

エラー内容は以下です

 File "/workspace/mmdetection3d/mmdet3d/datasets/transforms/loading.py", line 649, in transform
    points = points.reshape(-1, self.load_dim)
ValueError: cannot reshape array of size 108128 into shape (5)

つまり、108128の点群データを(n, 5)にしたいけど108128だと5で割り切れないからエラーが出てるということです

つまり、binに直した点群データのデータ数が108128であるということです

ここで先ほどのコードを見ると[x, y, z, intensity]の情報の4つを入力しているのでこの108128は4の倍数と推察できます

試しに108128 / 4をすると割り切れます

そのため5の倍数にしてエラーを解消するためにmmdetection3d公式ドキュメントのコードを書き直しましょう

import numpy as np
from pypcd import pypcd

pcd_data = pypcd.PointCloud.from_path('point_cloud_data.pcd')
points = np.zeros([pcd_data.width, 4], dtype=np.float32)
points[:, 0] = pcd_data.pc_data['x'].copy()
points[:, 1] = pcd_data.pc_data['y'].copy()
points[:, 2] = pcd_data.pc_data['z'].copy()
points[:, 3] = pcd_data.pc_data['intensity'].copy().astype(np.float32)
points[:, 4] = np.array(pcd_data.pc_data['intensity'].copy().astype(np.float32), dtype=np.float32)
with open('point_cloud_data.bin', 'wb') as f:
    f.write(points.tobytes())

これで5の倍数になったはずです

変換したbinファイルを挿入して実行しましょう!

 

 

いい感じですね!