강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

배진영님의 프로필 이미지
배진영

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

tiny kitti 데이터로 MMDetection Train 실습 - Config와 CustomDataset 동작 메커니즘의 이해 01

학습 질문입니다.

작성

·

99

0

@DATASETS.register_module(force=True)
class KittyTinyDataset(CustomDataset):
  # 커스텀 데이터셋에서 사용할 클래스명 저장.
  CLASSES = ('Car', 'Truck', 'Pedestrian', 'Cyclist')

  ##### self.data_root: /content/kitti_tiny/ self.ann_file: /content/kitti_tiny/train.txt self.img_prefix: /content/kitti_tiny/training/image_2
  #### ann_file: /content/kitti_tiny/train.txt
  # annotation에 대한 모든 파일명을 가지고 있는 텍스트 파일을 __init__(self, ann_file)로 입력 받고, 이 self.ann_file이 load_annotations()의 인자로 입력
  def load_annotations(self, ann_file):
    print('##### self.data_root:', self.data_root, 'self.ann_file:', self.ann_file, 'self.img_prefix:', self.img_prefix)
    print('#### ann_file:', ann_file)
    cat2label = {k:i for i, k in enumerate(self.CLASSES)}
    image_list = mmcv.list_from_file(self.ann_file)
    # 포맷 중립 데이터를 담을 list 객체
    data_infos = []
datasets = [build_dataset(cfg.data.train)]

클래스 설정 후(위 박스) 아래박스 코드로 데이터셋을 생성하면 load_annotations의 ann_file에 cfg.data.train.ann_file의 값이 자동으로 들어가는 것으로 이해했습니다.
또한 self.ann_file 값으로는 KittyTinyDataset이 상속받은 CustomDataset의 ann_file 값이 들어가는데 이 또한 데이터셋 생성시 CustomDataset에 cfg.data.train.ann_file의 값이 자동으로 들어가는 것으로 이해했습니다.

 

이 과정이 맞다면 데이터셋 생성시 self.ann_file과 ann_file에 들어가는 값이 동일한데 두가지 방식 모두 사용하는 이유가 궁금합니다.

과정이 틀렸다면 self.ann_file과 ann_file의 값이 언제 어떤 방식으로 할당되는지 궁금합니다.

답변 2

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

말씀하신대로 self.ann_file이나 load_annotations()의 인자로 들어가는 ann_file은 최종적으로 같은 file path입니다. 그럼에도 불구하고 load_annotations() 메소드를 ann_file을 입력 받도록 설계한 이유는 명시적으로 해당 메소드가 file path를 받는다라는 것을 확실하게 하기 위해서라고 생각됩니다.

그리고 각 변수가 할당되는 시점은 CustomDataset 클래스를 정의한 아래 소스코드를 참조해 보시면

https://mmdetection.readthedocs.io/en/v2.12.0/_modules/mmdet/datasets/custom.html

__init__() 생성 메소드에서

self.data_infos = self.load_annotations(self.ann_file)

이 되고 Custom Dataset 생성 시 self.ann_file이 생성자로 만들어 지고, 나중에 load_annotations() 메소드의 인자로 들어감을 알 수 있습니다.

 

감사합니다.

0

안녕하세요, 배진영님. 인프런 AI 인턴입니다.

데이터셋 생성 시 self.ann_fileann_file의 관계에 대한 혼란이 있는 것 같습니다. 이 두 변수는 데이터셋을 정의하고 초기화하는 과정에서 중요한 역할을 합니다.

먼저, self.ann_fileKittyTinyDataset 클래스 인스턴스의 내부 변수로, 클래스가 초기화될 때 입력된 ann_file의 값을 저장합니다. 이 값은 load_annotations 메서드에서 사용되며, 데이터셋 정의 시 다양한 파일이나 경로 정보를 가지고 있다면 해당 경로 및 파일 정보를 저장하는 데 사용됩니다.

반면, ann_fileload_annotations 메서드 자체의 인자입니다. 이 메서드를 호출할 때 외부에서 제공한 ann_file 값이 인자로 전달되며, self.ann_file과 동일한 값을 받을 것으로 기대됩니다. load_annotations 메서드가 클래스 내에서 호출될 때 보통 초기화된 인스턴스를 통해 불리므로 self.ann_file이 인자로 전달되기도 합니다.

이 두 변수는 결국 동일한 값으로 초기화되지만, 각각의 역할로 인해 설계상 양쪽 모두 필요합니다. 구체적으로 사용자가 load_annotations를 외부에서 직접 호출하지 않는 이상, self.ann_file로 관리되게 됩니다. 따라서 데이터셋 세팅 중에 self.ann_file는 클래스 자체의 상태 관리를, ann_file은 메서드 호출 시의 인자로 활용되는 차이가 있습니다.

관련된 정보를 더 원하시면, 다음과 관련된 답변을 확인해 보세요:
- “데이터셋 관련 질문입니다.” in [개정판] 딥러닝 컴퓨터 비전 완벽 가이드
- “KittyTinyDataset(CustomDataset) 상속받을 때 super 질문”

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

배진영님의 프로필 이미지
배진영

작성한 질문수

질문하기