mmdetection3dにあるモデルの命名規則
mmdetection3Dの命名規則
以下のような形で決められています。
{model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[batch_per_gpu x gpu]_{schedule}_{dataset}
それぞれ説明します。
各パラメータの説明
- model
モデルの名前
- model_setting
より具体的なモデルのセッティング
- backbone
バックボーンに使用しているモデルについて
- neck
ヘッドとバックボーンの間に挿入する機構のこと
-
- SECFPN
- norm setting
バッチノーマライゼーションの手法
-
gnグループノーマライゼーションsbn(Synchronized Batch Normalization).gn-head/gn-neckindicates GN is applied in head/neck only, whilegn-allmeans GN is applied in the entire model, e.g. backbone, neck, head.
- misc
モデルのその他の設定やプラグイン、たとえば、"strong-aug" はトレーニング用のより強力なデータ拡張戦略を使用することを意味する。
GPUごとのサンプル数とGPUの数。デフォルトでは "4x8" が使用される。
- schedule
トレーニングスケジュールで、オプションは "1x"、"2x"、"20e" などがある。"1x" および "2x" はそれぞれ12エポックと24エポックを意味し、"20e" はカスケードモデルで採用されており、20エポックを示す。"1x/2x" の場合、初期学習率は8/16番目および11/22番目のエポックで10の係数で減衰し。20e" の場合、初期学習率は16番目と19番目のエポックで10の係数で減衰する。
- dataset
データセットは "nus-3d"、"kitti-3d"、"lyft-3d"、"scannet-3d"、"sunrgbd-3d" など。複数の設定がある場合は、使用するクラスの数も示す。たとえば、"kitti-3d-3class" と "kitti-3d-car" は、それぞれ3つのクラスと1つのクラスでKITTIデータセットをトレーニングすることを意味する。
参考
mmdetection3dに自分で取得した点群データをdetectorに入れてみた
これはLiDARのカレンダー | Advent Calendar 2023 - Qiita23日目の記事です
この記事はmmdetection3dで推論を試す | KazIのブログを行っていることを前提に書いているので読んでみてください!!
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ファイルを挿入して実行しましょう!

いい感じですね!