Semantic Segmentation
segmantic segmentation은 모든 픽셀(pixel)을 구별하는 방법을 말한다.
Fully Convolutional Network
- 보통의 CNN
보통의 CNN은 다음과 같이 Convolution을 진행하고 Flatten을 한 후 FC layer를 통해 Label하는 방식이다.
- Fully convolutional network
fully convolutional network는 위에서와는 달리 모든 layer를 convolution으로 사용하여 Label을 출력해주는 방식인데 이렇게 함으로서 FC layer를 사용한 것과 달리 위치 정보(2차원 데이터)를 유지할 수 있다. 또한 FC Layer를 사용했을 때와 똑같은 parameter 수를 가진다.
그리고 이렇게 fully convolutional network로 만드는 것을 "convolutionalization"이라고 부른다.
위에서 언급했듯이 fully convolutional network는 위치 정보를 잃어버리지 않기 때문에 다음과 같이 heatmap과 같은 출력을 얻을 수 있게된다.
convolutionalization을 했을 때 얻게 되는 heatmap은 훈련된 class의 개수와 동일하다. 예를 들어 강아지 class와 고양이 class가 있다면 각 class에 해당하는 픽셀 값만 높아지는 것이다. 그리고 이렇게 얻어진 픽셀값을 가진 heatmap은 devonvolution(conv transpose)를 사용하여 segmentation을 할 수 있다.
Deconvolution(transpose convolution)
devonvolution은 fully convolutional network을 통해서 작아진 출력을 원래의 사이즈로 복원시켜주는 방법을 말한다. 엄밀히 말하면 원래의 이미지로 복원해주는 것은 아니지만 다음과 같이 추출된 feature의 정보로 segmentation을 해준다고 생각하면 될 것 같다.
- transpose convolution
transpose convolution는 행렬을 이용하여 복원하는 방법이다. 예를 들어 padding=0, stride=1로 3x3 kernel을 4x4 input에 적용시킨다면 다음과 같이 나타낼 수 있다.
그리고 반대로 복원하기 위해 각 행렬을 transpose를 해서 다음과 같이 계산할 수 있다.
Detection
detection은 bounding box를 사용하여 특정 물체를 추적하는 방법을 말한다.
R-CNN
R-CNN은 다음과 같은 순서로 진행된다.
- Input image
- bottom-up 방식으로 2000개의 region을 추출한다(Selective search를 사용) -> object가 있을만한 영역을 뽑아낸다고 말하며 RoI(Region of Interest)라고 한다.
- Selective search
- 위 그림에서 왼쪽 하단처럼 non-object-based segmentation을 수행하여 조그만 segmented area들을 얻는다.
- Bottom-up 방식으로 저 조그만 area들을 합쳐서 점점 더 큰 segmented area들을 만든다.
- 위 작업을 반복하여 최종적으로 2000개의 region proposal을 생성하는 것이다
- Selective Search를 사용하여 2000개의 Region Proposal을 추출하고 227x227 크기로 warp
- Fine Tune된 AlexNet에 넣어 2000x4096 크기의 feature vector를 추출
- 추출된 feature vector를 linear SVM 모델과 Bounding Box Regression 모델에 입력하여 각각 Confidence Score와 조종된 Bounding Box 좌표를 얻음
- Non Maximum Suppression을 적용하여 최적의 Bounding Box를 출력
R-CNN의 경우 2000개의 region를 모두 추출하고 CNN을 돌릴 수 있기 때문에 x2000만큼 시간이 더 걸리는 단점이 있다.
SPPNet
R-CNN에서는 고정된 크기의 이미지를 만들기위해 Warp이나 Crop을 통해 변형시켰다. 이 과정에서 수천 번의 CNN이 수행되고 시간이 오래 걸리는 단점이 발생하였다. 그래서 SPPNet에서는 Spatial Pyramid Pooling 방법을 사용하여 한 번만 CNN을 수행하게 만들었다. 좀 더 구체적으로 말하면 입력 이미지의 크기에 관계없이 Conv Layer들을 통과시키고 FC Layer 전에 크기를 조절한다는 것이다.
- Spatial Pyramid Pooling
우선 입력받은 image가 conv layer를 통과하여 추출된 feature map이 Spatial Pyramid Pooling Layer에 받아질 것이다. 그리고 위 그림처럼 피라미드라고 불리는 세 가지 공간 (4x4, 2x2, 1x1)에 나눠진다. 이때 각 피라미드의 한 칸을 bin이라고 한다.
예를 들어 추출된 feature map의 크기가 64x64x256 크기이고 4x4 피라미드의 각 bin에 나눠진다고 한다면 bin의 크기는 16x16이 된다.
각 피라미드와 bin에 모두 나누어졌으면 그 다음에 각 bin에서 MaxPooling이 수행되고 그 결과를 모두 이어 붙인다. 위 그림에서는 모두 이어 붙이면 길이가 21이고 채널은 그대로 256을 가진 벡터가 만들어지는 것이다.
결론적으로 이런 과정을 통해서 입력 이미지의 크기에 상관없이 항상 동일한 크기의 결과를 얻을 수 있다.
Fast R-CNN
SPPNet에서도 언급했듯이 R-CNN에서는 추출된 Region마다 CNN을 수행하여 속도가 많이 느렸고 classification(SVM)과 bounding box regression이 각각 따로 independent하게 수행되어 한번에 학습되지 못하는 한계점이 있었다. 그리고 이러한 한계를 극복하기위해서 Fast R-CNN부터는 RoI Pooling으로 RoI를 CNN에 한 번만 수행하게 하였고 classification과 bounding box regression을 하나의 모델에서 학습하도록 하였다.
수행 과정은 다음과 같다.
- Selective Search를 통해 RoI를 찾는다.
- 전체 이미지를 CNN에 수행시켜 feature map을 추출
- Selective Search으로 찾은 RoI를 feature map 크기에 맞춰 projection
- projection된 RoI에대해 RoI Pooling을 적용시켜 고정된 크기의 feature vector를 얻는다.
- 얻은 feature vector는 FC Layer를 통과 후 두 개의 branch로 나뉜다.
- 한 쪽은 softmax를 통해 classification을 수행하고 다른 한 쪽은 bounding box regression을 통해 Selective Search로 찾은 box의 위치를 조정한다.
- RoI Pooling
이전에 SPPNet에서 설명한 SPP는 사실 Fast R-CNN에서도 적용되었다. 위 그림에서 보면 1개의 피라미드로 구성된 SPP를 사용한 것을 확인 할 수 있다.
일단 RoI Pooling을 수행하기 전 입력 이미지를 CNN에 돌리고 feature map을 얻어야할 것이다. 예를 들어서 feature map 사이즈를 8x8이라고 하고 output 사이즈를 2x2라고 하자. 그리고 이전에 미리 Selective Search로 만들어놨던 RoI를 feature map에 정의된 크기 (h x w)만큼 projection시킨다. (위 그림에서 가장 왼쪽 그림이 feature map이고 그 안의 h x w 크기의 검은색 테두리 box가 투영된 RoI이다.)
projection된 h x w 크기의 box는 출력값 사이즈 2 x 2에 맞추기위해 (h/H) * (w/W) 크기로 split한다. split을 수행하면 그리드는 2 x 2로 나누어지고 나누어진 각 그리드에 Maxpooling을 수행하여 H x W (2 x 2) 크기의 feature vector로 변환한다.
- end-to-end 방식의 train
R-CNN에서는 각각 서로 다른 모델 SVM, bounding box regression 안으로 들어갔기 때문에 independent하게 연산이 되었다. 하지만 Fast R-NN에서는 RoI Pooling을 추가함으로서 RoI를 CNN에 통과시킨 후 feature map에 projection 시킬 수 있었기 때문에 동일한 data로 softmax, bounding box regression에 연산이 수행된다. 따라서 하나의 모델에 한 번에 학습할 수 있게 된 것이다.
Faster R-CNN
Faster R-CNN은 이전의 Fast R-CNN까지 Selective Search를 사용하여 region을 추출하는 것을 지양하고 이또한 CNN을 사용하여 속도를 향상시키는 방법을 사용하였다. 이때 이 CNN을 "Region Proposal Network"이라고 부른다. 즉, Region Proposal Network + Fast R-CNN이라고 할 수 있다.
- Region Proposal Network
Selective search는 cpu 상에서 수행되기 때문에 속도에 한계가 있다. 따라서 region을 추출하는 것도 gpu로 돌려 속도를 높이는 방법으로 CNN을 통해 생성하는 것으로 사용하겠다는 것이다. 아래 그림에서 보듯이 Region Proposal Network는 feature map과 RoI pooling 사이에 추가된 구조이다.
Faster R-CNN에서 CNN 모델로 ZFNet과 VGG-16을 이용하는데 아래의 그림은 ZFNet 기준이어서 256-d로 표현되었다.(VGG-16일 경우 512-d의 feature map을 출력)
feature map위에 N x N 크기의 Window를 받아 해당 영역에 어떤 물체(object)가 있는지 없는지를 classification layer(cls layer)와 bounding box의 4개 좌표 (x,y,w,h)를 결정하는 bounding box regression(reg layer)으로 구성된다. 하지만 이렇게 고정된 Window를 사용하는 것보다 미리 정의된 scale/ratio를 바탕으로 k개의 Window를 위치마다 출력하도록 하였다. 이것을 anchor box라고 한다.
미리 정의된 region 사이즈는 (128, 256, 512), scale/ratio는 (1:1, 1:2, 2:1)이라고 한다면 anchor box는 총 9개가 정의된다. 그리고 CNN을 수행하여 feature map을 추출하고 추출한 feature map에 3 x 3 x 256 conv filter를 연산하여 depth를 256으로 만든다. 이후 classification은 두 개의 클래스, bounding box regression은 네 개의 클래스를 가지므로 각각 1x1 conv를 사용하여 2 x 9, 4 x 9 크기로 만든뒤 계산한다.
YOLO
YOLO는 Faster R-CNN과 달리 localization과 classification을 동시에 진행하여 더 빠르다.
우선 CNN을 통해 S x S 크기의 그리드로 나누어진 feature map을 추출한다. 이 때 그리드 안에 있는 각각의 셀은 localization을 위해 B개의 BBox를 생성하고 각각 위치정보(x,y,w,h)와 confidence score 정보를 포함하고 있다. 동시에 각각의 셀은 classification을 위해 어떤 class에 속할지에 대한 P(class_i|object)를 가지고 있다.
좀 더 자세히 살펴보면 가운데 위쪽은 BBox에 대한 정보를 나타내는 것이고 서로 다른 크기의 많은 BBox가 그려져있다. 위에서 처럼 그리드를 7x7로 나누고 각 그리드 셀에서 크기가 일정하지 않은 BBox를 2개씩 생성한다고하자. 그러면 그리드 셀이 총 49개이므로 BBox는 98개가 만들어진다. 이 중 BBox 안에 어떤 object가 있을 것 같다고 확신(confidence scrore)할수록 BBox 테두리를 굵게 그려진다. 따라서 BBox의 위치정보와 confidence score의 정보를 포함하고 있다고 말할 수 있다.
가운데 아래쪽에는 각 그리드 셀 안의 object가 어떤 class인지를 color로 표현하고있다. 즉, classification에 대한 정보를 포함하고 있다고 말할 수 있다. 예를 들어서 class가 20개라면 앞에서 말한 5개의 정보(x, y, w, h, confidence score)와 그리드의 크기와 같이 ouput size를 다음과 같이 계산할 수 있다.
7x7(2x5 + 20) = 7x7x30=1470
'Boostcamp AI Tech' 카테고리의 다른 글
[Boostcamp Day-9] DL Basic - Transformer (0) | 2021.08.13 |
---|---|
[Boostcamp Day-9] DL Basic - Recurrent Neural Network (0) | 2021.08.12 |
[Boostcamp Day-8] DL Basic - Modern CNN (0) | 2021.08.11 |
[Boostcamp Day-8] DL Basic - Convolutional Neural Networks (0) | 2021.08.11 |
[Boostcamp Day-7] DL Basic - Optimization (0) | 2021.08.10 |