코드를 이해하기 위해 필요한 지식
__로 시작하고 끝나는 메서드들:
이러한 메서드들은 파이썬에서 '매직 메서드' 또는 '특수 메서드'라고 불립니다.
이 메서드들은 파이썬의 내장 동작과 밀접하게 연관되어 있으며, 특정 연산이나 함수 호출에 자동으로 응답합니다.
예를 들어, __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 |