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 파라미터는 복원된 이미지의 품질에 미세한 영향을 줄 수 있어, 적절한 설정이 중요하다.
이상입니다.
끝.
'의료 AI > [04] - 논문 리뷰' 카테고리의 다른 글
[01 X-ray Hand] - Maskformer (0) | 2024.11.27 |
---|---|
[01 X-ray Hand] - U-Net3++ (0) | 2024.11.22 |
[01 X-ray Hand] - SegNet의 아키텍처 (2) | 2024.11.18 |
U-Net 의 이해 (8) | 2024.11.10 |
댓글