Lecture 11. Detection and segmentation
● Image classification

● Semantic Segmentation <-> classification(이미지 전체에 카테고리 하나)
- 입력은 이미지이고, 출력으로 이미지의 모든 픽셀에 카테고리를 정함.
- 개별 객체 구분하지 않음 (단점)
① sliding Window
모든 픽셀에 대해서 작은 영역으로 쪼개고, 이 모든 영역을 forward/backward pass하는 일
너무 cost가 많이 들고, 상당히 비효율적.
② Fully convolutional Network
3X3 zero padding을 수행하는 Conv Layer들을 쌓아 올리면 이미지의 공간정보를 손실하지 않을 것.
출력 Tensor: C X H X W (C: 카테고리의 수, 입력 이미지의 모든 픽셀 값에 대해 Classification Scores를 매긴 값, Conv Layer만 쌓아 올린 네트워크를 이용해서 계산 가능)
학습시키려면, 우선 모든 픽셀의 classification loss를 계산하고 평균 값을 취함. 그리고, 기존처럼 backpropagation을 수행. -> train data 만들기가 쉽지 않음(모든 픽셀에 레이블링 해야함)
입력 이미지의 spatial size를 계속 유지시켜야 한다 -> 비용이 아주 큼. -> down/up sampling
★ Downsampling
- average/max polling
Average pooling:
pooling하는 각 지역에 해당하는 Receptive Field 내에 spatial average를 계산함.
★ Upsampling
- nearest neighbor unpooling/ Bed of Nails unpooling
nearest neighbor unpooling:
해당하는 receptive field로 값을 그냥 복사함.’
Bad of Mails unpooling
Unpooling region에만 값을 복사하고 다른 곳에는 모두 0을 채워놓음.

★ Max Unpooling
- 각 unpolling과 pooling을 연관 짓는 방법

Max pooling시의 자리를 기억해놨다가 Max unpooling때 같은 자리에 확장
? 왜 중요한가
-> semantic segmentation에서는 모든 픽셀의 클래스를 잘 분류해야함.
예측한 segmentation 결과에서 객체들 간의 디테일한 경계가 명확할수록 좋음.
하지만 Max pooling을 하게 되면 특징 맵의 비균집성(2x2 pooling에서 어디에서 왔는지 모름)이 발생. = Max pooling 후의 특정 맵만 봐서는 이 값들이 Receptive field 중 어디에서 왔는지 알 수 없음
따라서 Unpool시에 기존 max pool에서 뽑아온 자리로 값을 넣어주면 공간정보를 조금은 더 디테일하게 다룰 수 있음. (max pooling에서 잃어버린 공간 정보를 조금은 더 잘 유지할 수 있도록 help)
★ Transpose convolution
: Strided convolution은 어떤 식으로 Down sampling을 해야할지를 네트워크가 학습할 수 있음.
이는 한 픽셀씩 커널을 이동하면서 계산하지 않는다. 출력에서 한 픽셀씩 움직이려면 입력에서는 두 픽셀씩 움직여야한다.
따라서 stride =2 는 입력/출력에서 움직이는 거리 사이의 비율이며, stride=2인 strided convolution은 “학습 가능한 방법”으로 커널 안의 값을 내적하여 2배 downsampling하는 것을 의미.
이와 유사하게 Upsampling에서도 학습 가능한 방법.
특징맵을 upsampling할 때 어떤 방식으로 할 지를 학습할 수 있음.
Transpose convolution은 Strided convolution과 반대의 경우. (upsampling)
여기서는 내적을 수행하지 않으며, 입력 특징 맵에서 값(스칼라 값)을 하나 선택하여 그 값을 필터와 곱하고 출력의 필터 만큼의 영역에 그 값을 넣는다.
Transpose convolution은 필터와 입력의 내적을 계산하는 것이 아니라 입력 값이 필터에 곱해지는 가중치의 역할을 한다. 출력 값은 필터 * 입력(가중치)이다.
그리고 Upsampling 시에는 입력에서 한 칸씩 움직이는 동안 출력에서는 두 칸씩 움직인다.
출력에서는 Transpose convolution간에 Receptive field가 겹칠 수 있음. 겹치는 경우에는 간단하게 두 값을 더해줌. 이 과정을 반복해서 끝마치면 학습 가능한 upsampling을 수행한 것.


네트워크 내부에 downsampling/upsampling를 하는 거대한 convolution network가 있음.
Down sampling은 strided convolution이나 pooling을 사용하며 upsampling은 transpose convolution 또는 다양한 종류의 unpooling or upsampling을 사용함.
그리고 모든 픽셀에 대한 cross-entropy를 계산하면 네트워크 전체를 end-to-end로 학습시킬 수 있음.
● classification + localization
: 이미지가 어떤 카테고리에 속하는지 뿐만 아니라 실제 객체가 어디에 있는 지를 알고 싶음.
Localization 문제에서는 이미지 내에서 내가 관심있는 객체가 오직 하나뿐이라고 가정함.

입력 이미지가 있고, 네트워크는 이 이미지를 입력으로 함. 이 예제에서는 AlexNet임.
출력 레이어 직전의 FC-Layer는 “class score”로 연결돼서 카테고리를 결정함.
여기에는 FC-Layer가 하나 더 있음. 4개의 원소를 가진 vector와 연결되어 있음.
이 4개의 출력 값은 가령 width/height/x/y로 bounding box의 위치를 나타냄.
이런 식으로 네트워크는 Class score와 입력 영상 내의 객체 위치의 bounding box의 좌표를 출력값으로 반환.
이 네트워크를 학습시킬 때는 loss가 두 개, fully supervised setting(학습 이미지에는 카테고리 레이블과 해당 객체의 bounding box GT를 동시에 가지고 있어야함.)을 가정함.
Class score를 예측하기 위한 Softmax loss와 Ground truth Box와 예측한 Box 사이의 차이를 측정하는 Loss, L2 loss로 box loss를 가장 쉽게 디자인 가능, 총 두 가지 loss로 학습시킴.
? 두 개의 Loss의 단위가 달라서 gradient 계산에 문제가 있지 않은가?
-> 두 개의 loss를 합친 loss를 Multi-task Loss라고 한다. 우선 그레디언트를 구하려면 네트워크 가중치들의 각각의 미분값(scalar)을 계산해야한다. 두 losss의 가중치 합이 최종 loss.
★ Regression Loss
: cross entropy나 softmax가 아닌 L2,L1,smooth L1 loss 등.
● Object detection
: 입력 이미지가 주어지면 이미지에 나타나는 객체들의 box와 해당하는 카테고리를 예측
고정된 카테고리가 있음, 예측해야 하는 box의 수가 입력 이미지에 따라 달라짐.
아무 카테고리에도 속하지 않는 것들은 background 카테고리로 go.
1. sliding window
: 입력 이미지에서 영역을 나누어 작은 영역을 CNN에 주어 카테고리 분석을 하는 방법
문제) 어떻게 영역을 추출할지? -> 이미지에 Objects가 몇 개 존재할지, 어디에 존재할 지를 알 수가 없음
작은 영역 하나 하나마다 거대한 CNN을 통과시키려면 이 때의 계산량은 너무 많음.
모든 위치와 스케일을 전부 고려하는 brute force 방법.
2. Region Proposals
: 딥러닝을 사용하지는 않지만, 이미지 내에서 객체가 있을 법한 box들을 찾아줌.
이미지 내에서 객체가 있을 법한 후보 Region Proposas을 찾아내는 다양한 방법(edges) 등이 있겠지만, 이미지 내에 뭉텅진 곳들(객체가 있을지도 모르는 후보 영역들)을 찾아냄.
* Selective Search : 노이즈가 아주 심하지만, 실제 객체가 아닐지라도 Recall은 아주 높음
3. R-CNN

문제점) 비용이 높음 ∵ 2000개의 Region proposals이 있고 각각이 독립적으로 CNN 입력으로 들어감.
4. Fast R-CNN
각 ROI마다 각각 CNN을 수행하지 않고, 전체 이미지에 CNN을 수행 -> 전체 이미지에 대한 고해상도 Feature Map을 얻을 수 있음.
CNN Feature map에 ROI를 Projection시키고 전체 이미지가 아닌 Feature map에서 뜯어옴.
-> CNN의 Feature를 여러 ROIs가 서로 공유할 수 있음.
RPN으로 먼저 Regression 문제를 풀고 ROI 단위로 Classification을 하는 방식.

Detection without Proposals : YOLO/SSD
-> 각 Task를 따로 계산하지 말고 하나의 regression 문제로 풀어보자는 아이디어,
후보 base Box들과 GT object들을 매칭시키는 방법.
● Dense Captioning ( Object detection + Captioning)
: 각 Region에 대해서 카테고리를 예측하는 것이 아니라 각 Region의 Caption을 예측해야함.
각 Region에 Caption이 있는 데이터셋이 있어야함.
● Instance Segmentation
입력 이미지가 주어지면, 객체 별로 객체의 위치를 알아 내야하고, 객체 별로 Box를 예측하는 것이 아니라 객체 별 segmentation mask를 예측 해야함.
=> 이미지에서 각 객체에 해당하는 픽셀을 예측해야하는 문제.
1. Mask R-CNN

처음 입력 이미지가 CNN과 RPN을 거친다.
특징 맵에서 RPN의 ROI만큼을 뜯어낸다. (Projection)
각 box마다 segmentation mask를 예측하도록 함.