boostcampaitech4lv23cv3 / final-project-level3-cv-17

final-project-level2-cv-17 created by GitHub Classroom
2 stars 0 forks source link

AssertionError: The length of palette should not be less than `num_classes`. #23

Closed Sungyu-Park closed 1 year ago

Sungyu-Park commented 1 year ago

video_demo.py를 활용한 inference 과정 중 발생한 에러입니다.

 File "demo/video_demo.py", line 100, in <module>
    main()
  File "demo/video_demo.py", line 79, in main
    visualizer.add_datasample(
  File "/opt/conda/envs/mmyolo/lib/python3.8/site-packages/mmengine/dist/utils.py", line 346, in wrapper
    return func(*args, **kwargs)
  File "/opt/conda/envs/mmyolo/lib/python3.8/site-packages/mmdet/visualization/local_visualizer.py", line 369, in add_datasample
    pred_img_data = self._draw_instances(image, pred_instances,
  File "/opt/conda/envs/mmyolo/lib/python3.8/site-packages/mmdet/visualization/local_visualizer.py", line 131, in _draw_instances
    bbox_palette = get_palette(bbox_color, max_label + 1)
  File "/opt/conda/envs/mmyolo/lib/python3.8/site-packages/mmdet/visualization/palette.py", line 65, in get_palette
    assert len(dataset_palette) >= num_classes, \
AssertionError: The length of palette should not be less than `num_classes`.

config 파일의 metainfo에서 classes엔 값이 3개인데 palette에는 1개의 값만 들어가서 발생하는 것 같습니다. config 파일만 수정해서 실행했는데 동일 에러가 발생해서 학습 시에 적용해야하는 것 같아 확인중입니다.

class_name = ('ambulance', 'fire truck', 'ladder truck')
metainfo = dict(
    classes=class_name,
    palette=[(231, 72, 86), (22, 198, 12), (59, 120, 255)]
)
JKbin commented 1 year ago

palette의 리스트 안의 색상 조합으로 bbox를 그려주는 것 같아요. 그래서 classes보다 palette의 값이 작으면 에러가 발생하는 것 같습니다.

inference 할 때의 config를 수정해도 동일한 에러가 발생한다는 뜻인가요???

Sungyu-Park commented 1 year ago

넵 수정한 config를 활용해서 inference할 때도 동일한 에러가 발생했습니다.

video_demp.py를 보니 checkpoint로부터 metainfo를 불러오는 것 같습니다. 지금 새로 돌리고 있는 것으로 한 번 확인해볼게요!

JKbin commented 1 year ago

checkpoint로 부터 metainfo를 불러오는게 맞는 것 같네요...

음 그럼 임시로 inference.py에 있는 palette에 선규님이 정의한 3개의 값을 가진 palette를 넣어서 테스트 해보면 되지 않을까요?? 새로 돌리는게 시간 아까울 것 같아서...

image

Sungyu-Park commented 1 year ago

metainfo 내의 palette에 별도로 값을 부여하지 않으면 coco dataset의 dataset_meta 값을 불러오게 됩니다. 에러 메시지를 보면 dataset_palette의 원소 개수가 num_classes보다 작지만 않으면 에러가 발생하지 않는다는 것을 알 수 있습니다.(실제 실행 결과 에러 발생하지 않는 것을 확인) 현재 프로젝트에서는 num_classes가 3이고 특정 class에 대해 특정 색의 bbox를 생성할 필요는 없기 때문에 config 파일의 metainfo에 별도로 palette 값을 지정하지 않도록 하겠습니다.

국빈님께서 알려주신 방법도 시도해봤는데 가능합니다.

if 'dataset_meta' in checkpoint_meta:
            # mmdet 3.x, all keys should be lowercase
            model.dataset_meta = {
                k.lower(): v
                for k, v in checkpoint_meta['dataset_meta'].items()
            }
            model.dataset_meta['palette'] = [(231, 72, 86), (22, 198, 12), (59, 120, 255)]  # 추가

기존 코드에서 dataset_meta['palette']만 바꿔주면 에러 없이 inference 가능합니다