• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

build_dataset 수행시간을 줄이는 방법이 있나요?

22.04.25 15:30 작성 조회수 211

1

선생님 안녕하세요. 

코로나는 다 나으셨는지요. 항상 건강하셔서 계속 좋은 강의 해주시길 기원합니다!

 

아래에서 드리는 질문의 내용은 다음과 같습니다.

1. build_dataset 수행시간을 줄이는 방법이 있는지 궁금합니다.

2. train 데이터셋 처럼 validataion 데이터셋을 미리 처리하여 바이너리 파일로 덤프 하여 재사용 가능한지 궁금합니다.

 

첫번째로 load_annotation 함수 처리 속도 또는 다른 부분에서 속도를 개선할 방법이 있을까요? 

한장의 데이터셋을 처리하는데 1초 조금 넘는 시간이 소요됩니다 (1.xx it/s). 4만장의 학습데이터셋을 처리하는데 7시간 정도 걸렸습니다. 보통 이정도의 처리 속도가 걸리는지, 개선 방법이 있다면 알려주시길 부탁드립니다.

 

두번째로 validataion 데이터셋을 미리 빌드하여 바이너리로 저장 가능한지 궁금합니다.

학습 데이터셋을 예제에서 학습 전에 미리 빌드하여 변수 dataset에 저장 하였습니다. 저는 이 변수의 값을 pickle 라이브러리를 이용하여 바이너리(.bin) 파일로 저장하였다가 학습할때 로드하여 사용하였습니다. 다만 validation 데이터셋은 학습 과정중에 빌드가 되어 학습때마다 데이터셋 빌드에 많은 시간이 소요가 됩니다. 혹시 미리 데이터셋을 빌드하는 방법이 있을까요?

 

아래 코드는 dataset 변수의 값을 바이너리 파일로 저장할 때 사용한 코드입니다.

import pickle 

# write pickle
target_dataset_path = os.path.join(ROOT, 'dataset.bin')
with open(target_dataset_path, 'wb') as f:
    pickle.dump(datasets, f)
    print(f"New dataset: {target_dataset_path}")

# read pickle
with open(target_dataset_path, 'rb') as f:
    my_datasets = pickle.load(f)

 

 

 

 

답변 1

답변을 작성해보세요.

1

안녕하십니까, 

1. 첫번째로 load_annotation 함수 처리 속도 또는 다른 부분에서 속도를 개선할 방법이 있을까요? 

=> 제 생각에 전체 로직중에 아래 부분이 시간이 제일 많이 걸리지 않을가 싶습니다만, 

image = cv2.imread(filename)
height, width = image.shape[:2]

이미지를 로드하여 이미지의 높이와 너비를 구하는 부분을 사전에 미리 이미지의 높이와 너비를 모두 구해서 이를 파일로 저장한 뒤에 load_annotation에서 이를 로드하여 이미지의 높이와 너비 계산 시간을 줄이면 어떨까 싶습니다. 

2. 두번째로 validataion 데이터셋을 미리 빌드하여 바이너리로 저장 가능한지 궁금합니다.

=> 음, 좋은 방법이군요. 시간도 절약되고... 근데 이게 mmdetection API레벨에서 제공되지를 않는것 같습니다. 찾아봐도 없습니다.  이걸 Customize 하는 방법을 찾아보려면 소스코드를 더 많이 까봐야 할것 같습니다만, 현재 제가 그정도까지 시간여력이 되질 않습니다. 아뭏튼 좋은 아이디어 인것 같습니다. 나중에 저도 시간나면 함 custom code를 고민해보겠습니다. 

감사합니다.