darknet은 하나의 딥러닝 framework로 볼 수 있는데, 대표적으로 darknet18,53등의 classification 모델을 포함한 yolov3 for detection등의 모델 등이 있다.
나는 pytorch를 주로 쓰는데, 위에 언급한 모델들은 darknet이라는 c++계열의 framework를 쓴다. 그래서 나는 이걸 파이토치로 옮겨오는 방법을 많이 고민했고 그 동안 고민했던 그 흔적들을 정리해보려고한다.
어.. cfg 파일이 뭐니 weight파일이 뭐니 이러한 기초적인 설명은 다 건너 뛸거다. 왜냐면 이글은 공유보다 내 개인적인 기록이 목적인 용도니까.
맨 처음은 당연히 cfg파일을 파싱하는 부분이다.
다크넷의; cfg파일을 보면 각 레이어는 '[' ']' 두 기호로 대표적인 역할을 구분하고 있고, 그 이후로 기타 세부적인 옵션들을 정의하고있다. 그래서 아래 코드는 cfg파일에서 [] 두 기호를 토대로 레이어를 구분하고, 그 옵션들은 저장하는 코드이다.

cfg conv layer 예시
def parse_cfg(self, cfgfile): ''' cfgfile : cfgfile path, e.g. ./cfg/yolov3.cfg return : list of blocks. each block describes a block in the neural network to be built. ''' print(f"parse from '{cfgfile}'") fp = open(cfgfile, 'r') lines = fp.readlines() fp.close() lines = [line.strip() for line in lines if line.strip()] # 공백 제거 lines = [line for line in lines if line[0] != '#'] # 주석 제거 blocks = [] block = {} for line in lines: if line[0] == '[': if block: blocks.append(block) block = {} block["type"] = line[1:-1] if block['type'] == 'convolutional': block['batch_normalize'] = 0 else: key, value = line.split('=') block[key.rstrip()] = value.lstrip() blocks.append(block) print("done", end="\n\n") return blocks[0], blocks[1:]

맨 마지막에 block0 과 그 이후를 구분하는 이유는 모든 다크넷 cfg는 맨처음에 [net]으로 미니배치가 얼마인지, 입력 height widht가 얼마인지등을 정의해놓는데 이것을 구분하기 위함이다.
self 키워드가 있는것을 보아 이미 클래스 내부 함수인 것을 알겠지만 사실 외부 함수로 짜도 그만이라, 아무튼

클래스 내에서 위처럼 짜면 1단계는 완성이다.
이 다음에는 저 block(list())를 통해서 어떻게 pytorch 에서 forwarding을 구성하는지를 구성하겠다.
늘 말하지만, 언제 업로드 될진 모른다.

'Deep Learning > pytorch' 카테고리의 다른 글

[pytorch] save pytorch model  (0) 2021.09.15
torch.backends.cudnn.benchmark = True 의미  (0) 2021.08.23

+ Recent posts