これはLiDARのカレンダー | Advent Calendar 2023 - Qiita23日目の記事です
mmdetection3d
これはオープンソースの自動運転などに使用されるLiDARが取得した点群に対して学習、推論できるリポジトリです
githubはこちらです
今回はこちらに自分が作成したデータを指定された形に整形して動かす方法を記載します
使い方
まず、環境構築のためにチュートリアルを以下の部分をすべて終わるまで進めましょう
- dockerで環境構築
- demo_pcd.pyの実行&動くことを確認
ここまでいくと環境構築は完了です
ここからが本題です
次に、自分のデータを作成していきます
demo_pcd.pyを動かしてみるとわかるかもしれませんが、pcdファイルではなくbinファイルを用意しなければいけません
そのコードはチュートリアルの以下にあります
Customize Datasets — MMDetection3D 1.3.0 documentation
import numpy as np
from pypcd import pypcdpcd_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 pypcdpcd_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ファイルを挿入して実行しましょう!
いい感じですね!