DeepLab v1 아키텍쳐 분석
DeepLab v1 아키텍쳐
DeepLab v1은 딥러닝 기반의 이미지 분할 네트워크로, Dilated Convolution과 업샘플링(Bilinear Interpolation)을 활용하여 높은 해상도를 유지하면서도 넓은 수용 영역(Receptive Field)을 확보한다.
주요 구성 요소
1. conv1 ~ conv4
- 기본적인 합성곱과 ReLU 활성화 함수로 이루어져 있다.
- 팽창율(Dilation Rate): 1
- MaxPooling을 통해 공간 크기를 줄인다.
2. conv5
- 팽창율(Dilation Rate): 2
- 넓은 수용 영역을 확보하기 위해 팽창 합성곱 사용
- MaxPooling과 AvgPooling 적용
3. FC6와 FC7 (Fully Convolutional Layers)
- FC6: 팽창율(Dilation Rate): 12로, 더 넓은 특징 정보를 학습
- FC7: 채널 확장을 수행하며 다음 단계로 연결
4. Score 단계
- 1×1 합성곱을 사용하여 클래스별 확률 맵 생성
5. Upsampling
- Bilinear Interpolation을 활용하여 원래 크기로 복원
- align_corners 파라미터에 따라 보간 방식 조정 가능
위의 주요구성에 대한 간략한 설명이며, 이제 아키텍처를 보면서 코드를 분석해보자.
1. Conv 블록 정의 (conv_relu)
def conv_relu(in_ch, out_ch, size=3, rate=1):
conv_relu = nn.Sequential(
nn.Conv2d(in_channels=in_ch,
out_channels=out_ch,
kernel_size=size,
stride=1,
padding=rate,
dilation=rate),
nn.ReLU()
)
return conv_relu
conv_relu 함수는 Conv2d와 ReLU를 조합하여 생성한 블록이다.
입력 채널(in_ch), 출력 채널(out_ch), 커널 크기(size), 그리고 팽창율(rate)을 파라미터로 받는다.
이 블록은 필터와 활성화 함수를 결합한 표준적인 CNN 구조이다.
2. Backbone 네트워크: VGG16 구조
self.features1 = nn.Sequential(
conv_relu(3, 64, 3, 1),
conv_relu(64, 64, 3, 1),
nn.MaxPool2d(3, stride=2, padding=1)
)
self.features2 = nn.Sequential(
conv_relu(64, 128, 3, 1),
conv_relu(128, 128, 3, 1),
nn.MaxPool2d(3, stride=2, padding=1)
)
self.features3 = nn.Sequential(
conv_relu(128, 256, 3, 1),
conv_relu(256, 256, 3, 1),
conv_relu(256, 256, 3, 1),
nn.MaxPool2d(3, stride=2, padding=1)
)
self.features4 = nn.Sequential(
conv_relu(256, 512, 3, 1),
conv_relu(512, 512, 3, 1),
conv_relu(512, 512, 3, 1),
nn.MaxPool2d(3, stride=1, padding=1)
)
self.features5 = nn.Sequential(
conv_relu(512, 512, 3, rate=2),
conv_relu(512, 512, 3, rate=2),
conv_relu(512, 512, 3, rate=2),
nn.MaxPool2d(3, stride=1, padding=1),
nn.AvgPool2d(3, stride=1, padding=1)
)
VGG16 클래스는 여러 단계의 특징 추출 계층으로 구성된다.
각 단계는 conv_relu를 반복적으로 쌓아 올린 뒤, MaxPooling 연산을 통해 크기를 줄인다.
features1, features2, features3, features4, features5로 구성되며, 각각 다른 입력/출력 채널과 팽창율을 가진다.
3. 분류기(Classifier)
class classifier(nn.Module):
def __init__(self, num_classes):
super(classifier, self).__init__()
self.classifier = nn.Sequential(
conv_relu(512, 1024, 3, rate=12),
nn.Dropout2d(0.5),
conv_relu(1024, 1024, 1, 1),
nn.Dropout2d(0.5),
nn.Conv2d(1024, num_classes, 1)
)
def forward(self, x):
out = self.classifier(x)
return out
classifier 클래스는 고차원 특징 맵을 입력받아 최종 출력 클래스를 예측한다.
dropout 레이어를 포함하여 과적합을 방지하고, 마지막 Conv2d 레이어에서 클래스 수로 매핑된다.
4. Upsampling (업샘플링)
class DeepLabV1(nn.Module):
def __init__(self, backbone, classifier, upsampling):
super(DeepLabV1, self).__init__()
self.backbone = backbone
self.classifier = classifier
self.upsampling = upsampling
def forward(self, x):
x = self.backbone(x)
_, _, feature_map_h, feature_map_w = x.size()
x = self.classifier(x)
x = F.interpolate(
x,
size=(feature_map_h * self.upsampling, feature_map_w * self.upsampling),
mode="bilinear",
align_corners=False
)
return x
DeepLabV1 클래스는 특징 추출과 분류기를 조합한 후, F.interpolate를 사용하여 원본 크기로 업샘플링한다.
bilinear 모드로 업샘플링하며, align_corners 파라미터에 따라 보간 방식이 달라진다.
DeepLabV1 모델은 이미지를 입력받아 공간적 크기를 점진적으로 줄이면서 고차원 특징을 학습한 후, 최종적으로 원래 크기로 복원한다. 이 과정에서 팽창 합성곱(dilated convolution)과 업샘플링 기법을 활용하여 효율적이면서도 정밀한 분할 결과를 얻을 수 있다. 특히, 업샘플링 단계에서 사용되는 align_corners 파라미터는 복원된 이미지의 품질에 미세한 영향을 줄 수 있어, 적절한 설정이 중요하다.
이상입니다.
끝.