FCN 이란?
FCN은 2015년에 처음 소개된 신경망 모델로, 이미지의 픽셀 단위 예측을 수행하여 분할(Segmentation) 작업에서 중요한 역할을 하게 되었다. 이후 많은 연구에서 기본 모델로 사용되며 다양한 발전이 이루어졌다. FCN은 기존의 이미지 분류를 위해 설계된 네트워크와 달리, 이미지 내의 각 픽셀을 개별적으로 분류할 수 있도록 설계되었다는 점에서 차별성을 가진다.
FCN의 주요 구성 요소와 특징
1. VGG 네트워크 백본 사용
- FCN은 VGG 네트워크를 백본(Backbone)으로 사용한다. VGG 네트워크는 이미지 특징을 추출하는 데 강력한 성능을 보여주며, 이는 FCN이 이미지 내 세밀한 특징을 분석하고 분류하는 데 적합한 구조이다. 여기서 백본은 Feature Extracting Network로서, 원본 이미지를 다수의 레이어를 통해 중요한 특징들만 남도록 압축하는 역할을 한다.
위의 이미지에서 1번 부분이 VGG 부분이다.
2. Fully Connected Layer의 대체
- 기존 VGG 네트워크의 Fully Connected Layer(nn.Linear)는 이미지의 전체 정보를 하나의 벡터로 압축하는 역할을 한다. 그러나, FCN은 픽셀 단위의 예측을 필요로 하므로 FC Layer를 Convolution Layer로 대체하여 공간 정보를 유지하도록 한다. 이를 통해 원본 이미지의 구조를 유지하면서도 픽셀별로 독립적인 예측이 가능해진다.
3. Transposed Convolution을 이용한 Pixel-Wise Prediction
- FCN은 Upsampling을 통해 원래 이미지 크기로 복원할 수 있도록 Transposed Convolution을 사용한다. Transposed Convolution은 일반적인 Convolution과는 반대로 작동하여, 축소된 특징 맵을 점차 원래 크기로 확장한다. 이 과정에서 각 픽셀에 대한 분류가 가능해지며, 최종적으로 이미지 내 모든 픽셀에 대해 Class별 예측이 이루어진다.
위의 3가지 특징을 아래에 더 자세히 설명하겠다.
1. VGG 네트워크 Back Bone
VGG 백본의 의미와 활용
VGG 네트워크는 이미지 분류 및 특징 추출에 뛰어난 성능을 보이는 CNN 구조로, 여러 컴퓨터 비전 과제에서 백본(Backbone) 네트워크로 자주 사용된다. 특히, VGG는 3x3 컨볼루션 블록을 연속으로 쌓아올린 형태로, 이미지 내 복잡한 패턴과 특징을 효과적으로 추출할 수 있다.
VGG 백본으로 사용하는 것이 어떤 이점이 있고 어떤 의미일까??
1) 사전 학습된 네트워크 활용
VGG 백본을 사용할 때 가장 큰 장점 중 하나는 사전 학습된(pre-trained) 네트워크를 그대로 사용할 수 있다는 점이다. 사전 학습된 모델은 대규모 데이터셋(예: ImageNet)에서 미리 학습된 가중치를 포함하고 있어, 새로운 데이터셋에 맞추어 네트워크를 처음부터 학습시키지 않고도 어느 정도의 성능을 보장할 수 있다. 이는 모델 학습 시간을 크게 줄여주며, 적은 데이터로도 좋은 성능을 기대할 수 있는 장점이 있다.
2) 기존 학습된 가중치와 파라미터 활용
VGG 백본을 사용하는 또 다른 이점은 네트워크가 이미 학습한 가중치와 파라미터들을 그대로 활용할 수 있다는 것이다. 이를 통해 필요한 경우 가중치를 미세 조정(fine-tuning)하면서, 특정 작업에 맞는 최적의 성능을 끌어낼 수 있다. 또한, VGG의 다양한 채널 크기와 층 구성 방식이 그대로 적용되기 때문에, 해당 네트워크의 특성에 맞는 튜닝과 파라미터 조정이 용이하다. 예를 들어, VGG16 또는 VGG19 모델은 각각의 레이어와 채널 구성을 그대로 가져와 사용할 수 있다.
3) 다양한 백본 네트워크의 비교와 선택
VGG 외에도 AlexNet, GoogleNet과 같은 백본 네트워크들을 비교하여 사용할 수 있으며, 각 백본이 가진 특징에 따라 성능이 달라질 수 있다. 예를 들어, VGG16이 특정 작업에서 더 높은 성능을 보인다면, 이를 선택하여 백본으로 사용할 수 있다. 또한, 백본 네트워크인 ResNet, EfficientNet 등이 등장하면서, 새로운 백본으로 쉽게 전환할 수 있다는 점도 큰 장점이다. 이러한 유연성 덕분에 모델 성능 향상을 위해 새로운 백본 네트워크를 테스트하고 최적화하는 것이 가능하다.
2. Fully Connected Layer의 대체
이미지 분석에 있어서 Fully Connected Layer(FCL)와 Convolution Layer(CL)는 중요한 역할을 하지만, 그 목적과 활용 방식에 있어 큰 차이점이 있다. 특히 이미지 분할(Segmentation) 작업에서는 Convolution Layer를 사용하는 것이 더 효과적인 이유가 있다.
그것이 무엇일까???
- Fully Connected Layer
이미지의 전체 정보를 하나의 벡터로 압축하여 학습에 사용하는 방식이다. 그러나 이러한 방식은 각 픽셀의 위치 정보를 잃어버리게 만든다. 즉, 이미지의 공간적 구조가 파괴되면서, 원본 이미지에서 위치 기반의 세밀한 특징을 고려하기 어렵게 된다. FCL은 이미지가 어떤 레이블(class)에 해당하는지 알 수 있지만, 픽셀 단위의 위치 정보가 중요한 작업에서는 적합하지 않다.
- Convolution Layer
이미지의 각 위치에서 필터를 통해 특징을 추출하며, 픽셀 간의 위치 정보를 그대로 유지하는 특징을 갖는다. Convolution Layer를 사용하면, 이미지 내 각 부분의 특징을 추출하면서도 공간적 구조를 보존할 수 있어 이미지 분할과 같은 작업에 유리하다. 이미지 분할 작업에서는 각 픽셀마다 고유한 클래스(예: 배경, 객체의 특정 부분 등)를 예측해야 하므로, 위치 정보가 매우 중요한 요소가 된다.
- 1x1 Convolution과 Fully Connected Layer의 차이점
1x1 Convolution은 입력 값과 이미지 크기(Height, Width)에 상관없이 Kernel의 파라미터에만 영향을 받는다.
즉, Convolution 연산은 이미지나 레이어의 크기와 무관하게 학습이 가능하며, 높이나 너비에 의존하지 않고 입력 채널에서 출력 채널로 변환하는 특징을 가진다. 이러한 특성 덕분에 1x1 Convolution은 입력 크기와 무관하게 다양한 입력 데이터를 학습할 수 있다.
반면에,
Fully Connected Layer는 이미지의 모든 픽셀을 하나의 벡터로 펼친 후 학습을 진행하는 방식이다. 이 과정에서 입력 크기(Height, Width)를 고정해야 하며, 이미지 크기가 다를 경우에는 맞추어야 하는 한계가 있다. 따라서 다양한 크기의 이미지를 처리하려면 추가적인 전처리 작업이 필요하다.
1x1 Convolution은 입력 크기에 구애받지 않고 파라미터에 의존하여 연산을 수행할 수 있어, 다양한 입력 크기를 처리하는 데 유리하다.
3. Transposed Convolution을 이용한 Pixel-Wise Prediction
Transposed Convolution은 일반적인 Convolution과 반대로 동작하여, 작은 크기의 특징 맵을 원래 이미지 크기로 복원하는 데 사용된다. 이는 이미지 분할(Segmentation)과 같은 작업에서 매우 유용하다. Transposed Convolution은 특히 픽셀 단위(Pixel-Wise)로 세밀한 예측을 할 수 있도록 돕는다.
Transposed Convolution의 원리
위 이미지에서는 3x3 크기의 Transposed Convolution이 stride 1로 적용된 예시를 보여주고 있다. 입력은 2x2 크기의 특징 맵이며, 이 특징 맵을 3x3 커널을 사용하여 원래보다 큰 크기의 맵으로 확장한다.
Upsampling = Deconvolution = Transposed Convolution
명칭으로 다양하게 사용되고 있다.
하지만 엄밀한 명칭은 Transposed Convolution 이 맞다고 생각한다.
왜 그런가??
Sparse Matrix는 Convolution 연산을 수행하기 위한 준비된 행렬 형태이며, 입력 데이터와 곱셈을 통해 결과를 생성한다. Sparse Matrix와 입력 벡터를 곱하면 출력이 4x1 형태로 생성되며, 이 값이 "77"로 나타납니다. 즉, Convolution의 기본 원리에 따라 작은 입력이 커널을 통해 확장된 출력으로 나타난 것이다.
Transposed Convolution은 작은 특징 맵을 더 큰 크기의 출력으로 확장하여 원본 이미지에 가깝게 복원하는 작업을 수행합니다. 이 과정에서 종종 "Upsampling"이나 "Deconvolution"이라는 용어도 사용되지만, 실제로는 "Transposed Convolution"이라는 표현이 더 정확합니다. transposed 를 해서 계산을 하기 때문에 그게 맞다고 생각한다.
FCN 아키텍쳐
FCN은 기존의 Convolutional Neural Network(CNN) 구조에서 Fully Connected Layer를 Convolution Layer로 대체하여 이미지의 공간 정보를 보존하면서 학습할 수 있도록 설계되었다. 아래 아키텍처를 보면서 단계별로 이해해보자
논문에서는 FC6 부분을 7x7 Conv으로 사용했지만 이해하기 쉽게 1x1 로 바꿔서 이해해보자.
FCN 아키텍처 단계별 구성
1. Conv1
첫 번째 블록에서는 Conv - ReLU - Conv - ReLU - MaxPooling의 순서로 연산이 이루어진다. 이 단계는 이미지의 저수준 특징을 추출하며, 추출된 특징을 점진적으로 고차원 정보로 확장하는 역할을 한다.
def CBR(in_channels, out_channels, kernel_size=3, stride=1, padding=1):
return nn.Sequential(
nn.Conv2d(
in_channels=in_channels,
out_channels=out_channels,
kernel_size=kernel_size,
stride=stride,
padding=padding
),
nn.ReLU(inplace=True)
)
# conv1
self.conv1_1 = CBR(3, 64, 3, 1, 1)
self.conv1_2 = CBR(64, 64, 3, 1, 1)
self.pool1 = nn.MapPool2d(2, stride=2, cell_mode=True) # 1/2
conv 1,2 은 padding 과 stride 가 1이기 때문에 크기는 변하지 않고,
pool 에서는 커널 2, stride 2 라서 이미지 사이즈는 1/2 로 줄어든다
2. Conv2
conv1 과 동일한 코드로 원본 이미지에서 이미지 사이즈가 1/4 로 줄어든다.
# conv2
self.conv2_1 = CBR(64, 128, 3, 1, 1)
self.conv2_2 = CBR(128, 128, 3, 1, 1)
self.pool2 = nn.MapPool2d(2, stride=2, cell_mode=True) # 1/4
3. Conv3
Conv3 블록은 FCN 아키텍처의 중간 단계로, 이전 블록보다 더 깊은 수준의 특징을 추출하는 역할을 한다. Conv3 블록은 기존의 Conv1과 Conv2 블록과는 달리, 3 개의 CBR 레이어를 포함하고 있다.
self.conv3_1 = CBR(128, 256, kernel_size=3, stride=1, padding=1)
self.conv3_2 = CBR(256, 256, kernel_size=3, stride=1, padding=1)
self.conv3_3 = CBR(256, 256, kernel_size=3, stride=1, padding=1)
self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # 1/8
기존에 2개만 사용했다면 여기서는 3개를 사용
pooling 3번 진행했기 때문에 1/8 줄었다.
4. Conv4
Conv4 블록은 기존 Conv3 동일하게 3 개의 CBR 레이어를 포함하고 있다.
이미지 사이즈는 1/16 로 줄어든다.
self.conv4_1 = CBR(256, 512, kernel_size=3, stride=1, padding=1)
self.conv4_2 = CBR(512, 512, kernel_size=3, stride=1, padding=1)
self.conv4_3 = CBR(512, 512, kernel_size=3, stride=1, padding=1)
self.pool4 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True) # 1/16
5. Conv5
Conv5 블록은 FCN 아키텍처에서 가장 깊은 Convolution 블록으로, 이미지의 고차원 특징을 최종적으로 추출하는 역할을 한다. Conv5 블록은 총 세 개의 CBR 레이어와 하나의 MaxPooling 레이어로 구성되어 있다. 이 블록은 이전 블록들보다 더 많은 채널(512개)을 사용하여 복잡한 패턴을 학습하도록 설계되어 있으며, 마지막 MaxPooling을 통해 특징 맵의 크기를 1/32로 축소한다.
self.conv5_1 = CBR(512, 512, kernel_size=3, stride=1, padding=1)
self.conv5_2 = CBR(512, 512, kernel_size=3, stride=1, padding=1)
self.conv5_3 = CBR(512, 512, kernel_size=3, stride=1, padding=1)
self.pool5 = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True)
6. FC6
FC6 블록은 FCN에서 VGG 네트워크의 Fully Connected Layer을 대체하기 위해 사용되는 레이어이다. FCN 아키텍처에서는 공간 정보를 유지하기 위해 완전 연결층 대신 1x1 Convolution을 사용하여 입력 특징 맵의 각 위치에서 독립적으로 연산을 수행한다. FC6 블록은 1x1 Convolution을 통해 고차원의 채널 정보(4096채널)를 생성하며, Dropout 레이어를 추가하여 과적합을 방지한다.
self.fc6 = CBR(512, 4096, kernel_size=1, stride=1, padding=0)
self.drop6 = nn.Dropout2d()
7. FC7
self.fC7 = CBR(4096, 4096, kernel_size=1, stride=1, padding=0)
self.drop7 = nn.Dropout2d()
FC6 블록에 이어지는 레이어로, 이미지의 각 위치에 대해 더욱 고차원적인 특징을 추출한다. FC7 블록은 1x1 Convolution을 사용하여 공간 정보는 유지하면서도 깊이 있는 채널 정보를 학습할 수 있게 한다. FC6와 마찬가지로 FC7에서도 Dropout을 적용하여 모델의 과적합을 방지한다.
8. Score 레이어와 Up-sampling
FCN에서 Score 레이어와 Up-sampling 단계는 입력 이미지의 픽셀 단위 예측을 최종적으로 원본 크기로 복원하는 중요한 역할을 한다. FCN-32s는 입력 이미지를 여러 Convolution 블록을 통해 32배 축소된 특징 맵으로 변환한 후, 최종 결과를 32배 확대하여 원본 크기로 복원한다. 이 과정에서 사용되는 것이 ConvTranspose2d (Transposed Convolution) 레이어이다.
Score 레이어
- Score 레이어는 FC7 블록에서 출력된 고차원 특징 맵을 사용하여 각 위치의 클래스를 예측하는 작업을 수행한다.
- 이 레이어의 출력은 이미지의 각 픽셀에 대한 클래스 점수로 표현되며, 최종 Up-sampling 단계에서 원본 이미지 크기로 복원될 준비가 된 상태이다.
self.score_fr = nn.Conv2d(4096, num_classes, 1, 1, 0)
Up-sampling (ConvTranspose2d)
- Up-sampling은 32배 축소된 특징 맵을 다시 원본 크기로 복원하는 작업을 수행한다. FCN-32s에서는 nn.ConvTranspose2d를 사용하여 이 작업을 진행한다.
- 코드에서 ConvTranspose2d는 kernel_size=64, stride=32, padding=16으로 설정되어 있다. 이 설정을 통해 특징 맵이 32배 확대되어 원본 이미지와 동일한 크기로 복원된다.
- kernel_size=64는 커널이 64x64 크기의 필터를 사용하여 넓은 영역을 한 번에 복원하게 한다.
- stride=32는 32배 확대를 의미하며, 축소된 특징 맵을 원본 크기로 확장하는 데 필요한 설정이다.
- padding=16은 복원 시 주변 픽셀의 영향을 반영하도록 하여 출력의 가장자리 부분이 깔끔하게 처리되도록 돕는다.
self.upscore32 = nn.ConvTranspose2d(num_classes, num_classes, kernel_size=64, stride=32, padding=16)
지금까지 FCN-32s에 대해 설명했다.
FCN-32s는 32배 축소된 특징 맵을 한 번에 32배로 확대하여 원본 크기로 복원하는 방식을 사용한다.
그러나 이러한 방식이 항상 최선일까?
아래 이미지에서 볼 수 있듯이, FCN-32s는 세밀한 디테일을 충분히 표현하지 못하는 한계가 있다. 특히 경계 부분이나 작은 객체의 디테일이 흐릿하게 표현되는 경향이 있다.
이러한 한계를 극복하기 위해 FCN-16s와 FCN-8s가 제안되었다. FCN-16s와 FCN-8s는 한 번에 32배로 확대하지 않고, 더 작은 배율로 점진적으로 복원하여 원본 크기에 가까운 세밀한 결과를 얻을 수 있다.
이제, FCN-16s와 FCN-8s에 대해 자세히 알아보자.
Skip Connection을 활용한 세밀한 복원: FCN-16s와 FCN-8s
FCN-32s의 한계를 보완하기 위해, FCN-16s와 FCN-8s에서는 Skip Connection을 사용하여 더 세밀한 복원을 수행한다. Skip Connection은 특정 레이어의 출력을 후속 레이어로 전달함으로써, MaxPooling으로 인해 소실된 정보를 부분적으로 복원하는 데 중요한 역할을 한다.
Predict1(1/32)을 2배 확대한 결과를
16배 축소된 Pool4의 출력과 결합하여, Predict2에서 16배 축소된 정보를 추가로 활용한다.
이를 통해 16배 축소된 정보를 복원에 포함하여 더욱 세밀한 디테일을 확보할 수 있다.
동일한 방식으로 Predict2에서 2배 확대한 특징 맵과 8배 축소된 Pool3의 출력을 결합한다.
이를 통해 8배 축소된 정보를 활용한 세밀한 복원이 가능하게 되어, FCN-8s에서는 더욱 원본에 가까운 예측 결과를 얻을 수 있다.
이렇게 한게 어떤 의미인가??
MaxPooling으로 손실된 정보 복원
- MaxPooling 레이어는 특징 맵의 크기를 줄여주는 효과가 있지만, 동시에 세부적인 정보를 소실시킨다.
- Skip Connection은 이 과정에서 손실된 정보를 다시 포함시켜, 복원 과정에서 중요한 디테일을 유지하게 한다.
효율적인 복원
- Skip Connection을 통해 Up-sampling을 점진적으로 수행하여, 한 번에 큰 배율로 확대할 때 발생하는 왜곡을 줄이고 효율적인 복원이 가능해진다.
- 이로 인해 FCN-16s와 FCN-8s는 FCN-32s보다 세밀하고 정교한 분할 결과를 제공할 수 있다.
Skip Connection을 활용한 FCN-16s와 FCN-8s는 FCN-32s의 한계를 극복하여 더 높은 해상도의 세밀한 예측을 가능하게 한다. Predict1에서 시작해 Predict2, Predict3으로 이어지는 복원 단계는 각각 16배, 8배 축소된 정보를 포함하여 단계적으로 복원하는 방식으로, 최종적으로 원본에 가까운 결과를 얻을 수 있다. Skip Connection은 이미지 분할의 정확도를 높이고, 디테일한 복원에 큰 기여를 한다.
실험결과
FCN 아키텍처는 Up-sampling 방식에 따라 FCN-32s, FCN-16s, FCN-8s로 나뉘며, 각각의 방식은 점진적으로 성능을 향상시킨다. FCN-8s는 Skip Connection을 사용하여 더 작은 배율의 특징 맵을 추가로 결합함으로써 원본에 가까운 디테일을 복원하고, 성능 또한 가장 우수하다.
Skip Connection을 통한 단계적 복원 방식은 세부적인 정보를 잃지 않도록 돕기 때문에, 이미지 분할의 정확도를 높이고 작은 객체나 경계선의 표현력을 크게 개선한다. 따라서, 정확도와 정밀한 복원이 중요한 작업에서는 FCN-8s와 같은 다단계 복원 구조가 적합하다.
FCN-8s는 FCN 아키텍처 중 가장 성능이 뛰어나며, 세밀한 이미지 분할 작업에 적합하다. FCN-32s는 상대적으로 빠른 연산 속도가 필요할 때 유용하지만, 세밀한 복원 성능이 필요하다면 FCN-8s가 더 적합하다.
FCN 소개는 여기까지 하겠습니다.
감사합니다. 끝
'의료 AI > [02] - 모델' 카테고리의 다른 글
[05] - Receptive Field 를 확장시킨 모델 (DeepLab v1, DeepLab v2) (2) | 2024.11.19 |
---|---|
[04] - FC DenseNet 이란? (0) | 2024.11.15 |
[03] - 빠르면서도 정확한 SegNet (0) | 2024.11.14 |
[02] - FCN 한계점을 극복한 DeconvNet 이란?? (2) | 2024.11.13 |
댓글