OpenPCDet - custom dataset 사용하기 (1)

·2024년 6월 4일

openpcdet

목록 보기
2/2

참고 및 일부 캡처 출처: OpenPCDet custom dataset tutorial

OpenPCDet의 튜토리얼에 custom dataset 사용 방법이 친절하게 정리되어 있지만, 일정 부분은 유저의 몫으로 본인의 dataset에 맞춰 직접 찾아가며 수정해야 한다. 이 글에서는 custom dataset 훈련을 위하여 수정한 모든 부분을 기록한다.

1. 데이터셋 구조

이와 같이 custom 데이터셋에 대하여 ImageSets, points, labels 디렉토리를 구축해야 한다.

  • ImageSets 디렉토리는 데이터셋을 split하는 역할을 한다. 해당 텍스트 파일의 내용은 아래와 같이 파일명을 작성한다.

  • points 디렉토리에 .npy 포맷의 포인트 클라우드 데이터를 위치시킨다.
  • labels 디렉토리에 3D bbox 정보를 작성한다.

    • x, y, z는 bbox의 중심점이고 dx, dy, dz 는 각 축으로의 길이이며, heading_angle은 z축 방향으로의 회전 반경을 뜻한다.

2. configurations수정

  • tools/cfgs/custom_models/<사용하고자 하는 모델>.yaml 의 다음 목록을 수정한다. 원 코드에는 second와 pv_rcnn만 있는데, 이외에 사용하고자 하는 모델이 있다면 config를 복사해서 second, pv_rcnn을 보며 틀을 맞춰 주면 사용이 가능하다.

    • CLASS_NAMES

    • ANCHOR_GENERATOR_CONFIG


  • tools/cfgs/dataset_configs/custom_dataset.yaml의 다음 목록을 수정한다.

    • POINT_CLOUD_RANGE

      • 사용하는 포인트 클라우드 데이터의 범위를 작성한다.
      • [minX, minY, minZ, maxX, maxY, maxZ]
    • MAP_CLASS_TO_KITTI

      • 만약 사용하는 클래스의 수가 3개보다 많은 경우, pcdet/datasets/kitti/kitti_object_eval_python/eval.py에서 더 많은 클래스를 임의로 추가하고 MAP_CLASS_TO_KITTI를 수정해 주면 된다. (아래에서 설명)
    • POINT_FEATURE_ENCODING

      • 사용하는 데이터셋은 intensity 정보를 포함하지 않아 x, y, z만 사용하도록 수정하였다.
    • NUM_POINT_FEATURES

      • 사용하는 데이터셋은 intensity 정보를 포함하지 않아 3으로 수정하였다.
    • filter_by_min_points

      • 사용 목적에 따라 수정한다.
    • SAMPLE_GROUPS

      • 사용 목적에 따라 수정한다.
    • VOXEL_SIZE

      • voxel 기반의 모델을 사용할 경우:

        • (maxZminZ)/voxel size(maxZ-minZ)/voxel \ size가 40이어야 한다. \rarr {10(3)}/0.325=40\{10 - (-3)\}/0.325 = 40
        • (maxXminX)/voxel size(maxX-minX)/voxel \ size가 16의 배수여야 한다. \rarr {75(75)}/0.375=400\{75 - (-75)\}/0.375 =400
    • pillar 기반의 모델을 사용할 경우:

      • (maxXminX)/voxel size(maxX-minX)/voxel \ size가 16의 배수여야 한다. \rarr {75(75)}/0.375=400\{75 - (-75)\}/0.375 = 400
      • (maxZminZ)(maxZ-minZ)voxel sizevoxel \ size와 같아야 한다. \rarr 10(3)=13{10 - (-3)} = 13

3. custom_dataset.py 수정

  • create_custom_infos의 class_names를 사용하는 class의 맞추어 수정한다.

4. eval.py 수정

  • 사용하고자 하는 데이터셋의 클래스 개수가 3개면 eval.py를 수정할 필요 없이 dataset_configs/custom_dataset.yaml에서 MAP_CLASS_TO_KITTI만 수정해 주면 된다. 클래스 개수가 3개를 초과할 경우에는 아래 언급되는 부분에 자체적으로 클래스를 추가해 준다.

  • clean_data의 CLASS_NAMES 변경

  • eval_class의 classes_dict 변경

  • get_official_eval_result의 class_to_name 변경

5. voxel_set_abstraction.py 수정 - point 좌표가 (x, y, z)일 경우에만 해당

  • 기존의 features를 features=xyz_features.contiguous() if xyz_features is not None else None과 같이 수정한다.

6. data info 생성

마지막으로 python -m pcdet.datasets.custom.custom_dataset create_custom_infos tools/cfgs/dataset_configs/custom_dataset.yaml 를 통해 custom 데이터셋에 대한 data info를 생성하면 훈련 및 평가가 가능하다!

profile
이것저것 공부 중입니다

0개의 댓글