코드 분석/Edge-Connect

Edge-Connect: config.py

상솜공방 2024. 1. 24. 22:29

코드를 이해하기 위해 필요한 지식

더보기

__로 시작하고 끝나는 메서드들:
이러한 메서드들은 파이썬에서 '매직 메서드' 또는 '특수 메서드'라고 불립니다.
이 메서드들은 파이썬의 내장 동작과 밀접하게 연관되어 있으며, 특정 연산이나 함수 호출에 자동으로 응답합니다.
예를 들어, __init__() 메서드는 클래스의 인스턴스가 생성될 때 자동으로 호출되며, 객체 초기화에 사용됩니다. __getattr__() 메서드는 속성 조회가 실패했을 때 호출됩니다.
이러한 메서드들은 파이썬의 객체 지향 프로그래밍에서 중요한 역할을 하며, 연산자 오버로딩이나 사용자 정의 동작을 구현하는 데 사용됩니다.

 

Config 클래스에서 파생된 객체가 DEFAULT_CONFIG를 참조하는 방법:

DEFAULT_CONFIG는 전역 변수로 정의되어 있으며, Config 클래스 내에서 __getattr__() 메서드를 통해 참조될 수 있습니다. 이러한 구조는 다음과 같은 방식으로 작동합니다:
Config 클래스의 인스턴스에서 특정 속성을 참조하려고 할 때, 파이썬은 먼저 해당 인스턴스의 __dict__ (또는 다른 메커니즘을 통해)에서 해당 속성을 찾습니다.
만약 해당 속성이 인스턴스의 __dict__에 없으면, __getattr__() 메서드가 호출됩니다. 이 메서드는 속성 이름을 인자로 받습니다.
Config 클래스의 __getattr__() 메서드 내에서, 먼저 self._dict (인스턴스가 파싱한 설정 파일에서 생성된 딕셔너리)를 확인하여 요청된 속성이 있는지 검사합니다.
만약 self._dict에 해당 속성이 없다면, __getattr__() 메서드는 전역 변수 DEFAULT_CONFIG을 참조하여 해당 속성을 찾습니다.
이렇게 하여 DEFAULT_CONFIG는 Config 클래스의 인스턴스에 대한 기본 설정 값으로 작동하며, 인스턴스가 개별적으로 오버라이드하지 않은 한 사용됩니다.
이러한 방식은 클래스의 인스턴스에 대해 명시적으로 정의되지 않은 속성에 대해 기본값을 제공하는 효과적인 방법입니다.


비최대 억제 (Non-Max Suppression, NMS):
비최대 억제는 컴퓨터 비전에서 객체 검출 과정에서 사용되는 기술입니다.
여러 후보 박스(예: 객체 경계 상자) 중 가장 높은 점수를 가진 박스를 선택하고, 이와 중첩되는 낮은 점수의 박스를 제거하는 방식으로 작동합니다.
이는 여러 겹친 박스를 하나의 박스로 단순화하여, 객체 검출의 정확도를 높이는 데 도움을 줍니다.


D2G_LR (Discriminator to Generator Learning Rate Ratio):
D2G_LR는 판별자(Discriminator)와 생성자(Generator)의 학습률 비율을 나타냅니다.
GAN에서는 판별자와 생성자가 서로 경쟁하며 학습하는데, 이 비율을 조정하여 두 네트워크 간의 학습 속도 균형을 맞출 수 있습니다.
예를 들어, D2G_LR가 0.1이라면, 판별자의 학습률은 생성자의 학습률의 10%가 됩니다.


GAN_POOL_SIZE (Generative Adversarial Network Pool Size):
GAN_POOL_SIZE는 GAN에서 생성된 가짜 이미지를 저장하는 풀(pool)의 크기를 나타냅니다.
이 풀은 생성된 이미지를 일시적으로 저장하고, 판별자 학습에 사용됩니다.
이미지 풀을 사용하면 판별자가 단순히 최근에 본 이미지만을 기억하는 것을 방지하고, 다양한 이미지에 대해 학습할 수 있도록 도와줍니다.
GAN_POOL_SIZE가 0이면 이미지 풀을 사용하지 않는 것을 의미합니다.

import os # 운영체제와 상호작용하여 파일 디렉토리를 만드는 등의 업무
import yaml # 정보를 담는 데이터 포맷 중 하나

class Config(dict): # 파이썬 내장 클래스인 딕셔너리를 상속받아 Config 클래스를 생성한다.
    def __init__(self, config_path): # config_path는 설정 파일의 경로를 나타낸다.
        with open(config_path, 'r') as f: # 해당 파일을 읽기 모드('r')로 열고, 이 파일을 'f'라는 변수로 참조.
            self._yaml = f.read() # 파일의 내용을 읽어서 self._yaml에 저장한다.
            self._dict = yaml.load(self._yaml) # 그 파일을 다시 딕셔너리로 변환한다.
            self._dict['PATH'] = os.path.dirname(config_path) # 'PATH'라는 key 값에 설정 파일의 경로를 value로 할당.

    def __getattr__(self, name): # 객체의 속성에 접근할 때 호출되는 메서드 정의.
        if self._dict.get(name) is not None: # self._dict 딕셔너리에 'name' 키의 밸류가 존재한다면,
            return self._dict[name] # 그 밸류를 반환.

        if DEFAULT_CONFIG.get(name) is not None: # DEFAULT_CONFIG 딕셔너리에 name 키에 대한 밸류가 존재한다면,
            return DEFAULT_CONFIG[name] # 그 밸류를 반환.

        return None # name이라는 키가 두 딕셔너리에 다 없다면, None을 반환.

    def print(self): # 모델 설정을 출력하는 메서드.
        print('Model configurations:')
        print('---------------------------------')
        print(self._yaml)
        print('')
        print('---------------------------------')
        print('')


DEFAULT_CONFIG = {
    'MODE': 1,                      # 1: train, 2: test, 3: eval
    'MODEL': 1,                     # 1: edge model, 2: inpaint model, 3: edge-inpaint model, 4: joint model
    'MASK': 3,                      # 1: random block, 2: half, 3: external(외부 파일), 4: (external, random block), 5: (external, random block, half)
    'EDGE': 1,                      # 1: canny, 2: external
    'NMS': 1,                       # 0: no non-max-suppression, 1: applies non-max-suppression on the external edges by multiplying by Canny
    'SEED': 10,                     # random seed
    'GPU': [0],                     # list of gpu ids
    'DEBUG': 0,                     # turns on debugging mode
    'VERBOSE': 0,                   # turns on verbose mode in the output console (출력 콘솔의 자세한 모드 설정)

    'LR': 0.0001,                   # learning rate
    'D2G_LR': 0.1,                  # discriminator/generator learning rate ratio
    'BETA1': 0.0,                   # adam optimizer beta1
    'BETA2': 0.9,                   # adam optimizer beta2
    'BATCH_SIZE': 8,                # input batch size for training
    'INPUT_SIZE': 256,              # input image size for training 0 for original size (0은 원본 이미지)
    'SIGMA': 2,                     # standard deviation of the Gaussian filter used in Canny edge detector (0: random, -1: no edge)
    'MAX_ITERS': 2e6,               # maximum number of iterations to train the model

    'EDGE_THRESHOLD': 0.5,          # edge detection threshold
    'L1_LOSS_WEIGHT': 1,            # l1 loss weight
    'FM_LOSS_WEIGHT': 10,           # feature-matching loss weight
    'STYLE_LOSS_WEIGHT': 1,         # style loss weight
    'CONTENT_LOSS_WEIGHT': 1,       # perceptual loss weight
    'INPAINT_ADV_LOSS_WEIGHT': 0.01,# adversarial loss weight

    'GAN_LOSS': 'nsgan',            # nsgan | lsgan | hinge
    'GAN_POOL_SIZE': 0,             # fake images pool size

    'SAVE_INTERVAL': 1000,          # how many iterations to wait before saving model (0: never)
    'SAMPLE_INTERVAL': 1000,        # how many iterations to wait before sampling (0: never)
    'SAMPLE_SIZE': 12,              # number of images to sample
    'EVAL_INTERVAL': 0,             # how many iterations to wait before model evaluation (0: never)
    'LOG_INTERVAL': 10,             # how many iterations to wait before logging training status (0: never)
}

'코드 분석 > Edge-Connect' 카테고리의 다른 글

Edge-Connect: utils.py  (1) 2024.01.25
Edge-Connect: main.py  (0) 2024.01.25
Edge-Connect: metrics.py  (0) 2024.01.25
Edge-Connect: loss.py  (0) 2024.01.24
Edge-Connect: networks.py  (1) 2024.01.24