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-neck indicates GN is applied in head/neck only, while gn-all means 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.readthedocs.io

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ファイルを挿入して実行しましょう!

 

 

いい感じですね!