Semantic Segmentation
> 입력 : 이미지, 출력 : 이미지의 모든 픽셀에 카테고리를 정한다. (기존의 Classification은 이미지 전체에
카테고리가 하나 정해졌다.)
> 개별 객체를 구분하지 않는다. ( ex - 암소 두 마리를 구별하지 않는 모습을 보이고 있다. )
> 입력 이미지를 쪼개서 쪼갠 이미지를 분류 작업 실시 (모든 영역을 쪼개서 사용하는 것은 비효율적, 비용이 많이 든다.)
> fully connected – Layer가 없고 Convolution Layer로 구성된 네트워크
> loss 계산은 모든 픽셀에 따라서 ground Truth가 존재하기 때문에 출력의 모든 픽셀과 Ground Truth 간의 Cross Entropy를 계산한다.
> 입력 이미지의 Spatial Size를 계속 유지시켜야 하기에 비용이 크다.(고해상도의 이미지가 입력으로 들어오면 계산량과 메모리가 엄청 커서 감당할 수 없다.)
> 계산의 효율을 위해서 Downsampling/Upsampling을 섞어서 사용해준다.
> Image classification과 방법이 유사하지만 끝단 부분에서 Upsampling을 통해 Spatial resolution을 키운다.
- Upsampling
> pooling이 값을 추출하는 방법이었다면 Unpooling은 반대로 값을 늘리는 작업이다. 여러 방법이 있다.
> Nearest Neighbor는 receptive field로 값을 복사한다.
> Bed of Nails는 unpooling region에만 값을 복사하고 다른 곳에는 모두 0을 채워넣는다.
> Max pooling때 값이 선택된 위치를 기억한 후에, Max Unpooling때 해당 값을 선택했던 위치에 넣어준다. 대부분의 네트워크는 대칭적인 경향이 있기 때문이다.
> 입력 값이 필터와 곱해지는 가중치 역할을 한다.
> 출력 값은 입력(가중치) * 필터라고 생각하면 된다.
> Receptive Field가 겹치는 경우, 두 값을 더해준다.
Classification + Localization
> 기존에 객체를 분류(Classification)하였던 것에 더하여 이미지 내에 해당 객체가 어디에 있는지
네모박스를 그린다.
> 출력은 Class Score와 Bounding box의 좌표
> BBOX를 카테고리마다 하나씩 예측
> Loss은 Softmax Loss(Class score의 loss)와 L2 Loss(Bounding box의 loss)를 따로 구한 뒤 두 Loss의 가중치를 Hyper parameter로 결정해준다. (Hyper parameter로 multitask Loss값이 변해 조절이 어렵기에 다른 성능지표를 도입해서 문제를 해결한다.)
> Pose Estimation을 할 때도 사용한다.
Object Detection
> 이미지에 나타나는 객체들의 Bounding box와 카테고리를 예측한다.
> 이미지에 따라(이미지마다 객체의 수가 다르기에) Bounding box의 수가 달라진다.
> 객체 수에 따라서 예측해야 되는 좌표 값의 수가 달라진다.
> 이미지마다 객체의 수가 달라지면 이를 미리 알 수 없기에 다른 방법이 필요하다.
> 입력 이미지를 다양한 영역으로 나누어서 CNN으로 classification을 한다.
> sliding window를 하기 위해선 수많은 경우의 수가 존재한다. 그로 인해 계산량이 어마어마하다.
> deep learning 방법이 아니다. Object가 있을법한 곳에 Bounding box를 제공
> Region Proposal Networks로 이미지 내에 뭉텅진(blobby)곳, 즉 Region Proposal을 찾아낸다. 뭉텅진 곳들은 객체가 있을 확률이 높다. (주로 사용하는 방법은 Selective Search)
> Selective search를 통해 Region Proposal(Regions of Interest)를 얻어낸다.
ROI의 사이즈는 각양각색이기 때문에 Fully-connected-layer를 통해 입력사이즈를 동일하게 맞춰준다.(Warped image regions)
> Resizing한 ROI를 Conv net에 통과시킨다. 최종 Classification에 SVM을 사용한다.
> Selective search을 통한 Region Proposal이 정확하지 못한 경우가 있기 때문에, Bounding box를 보정하기 위한 offset값 4개를 예측한다.
> R-CNN에서는 Region Proposal을 학습시키지 않고 고정된 알고리즘(Selective Search)을 사용한다.
> 객체가 없는 ROI의 경우 배경이라고 예측한다.
> 학습데이터에는 이미지 내의 모든 객체에 대한 Bounding box가 있어야 한다.( Fully Supervised Task이기 때문에)
>R-CNN은 여전히 계산이 비용이 높고, 학습과정이 느리다.
> 전체 이미지에서 ConvNet을 수행하여 Feature Map을 얻어낸다.(R-CNN의 경우 2000번의 연산을 진행, Fast R-CNN의 경우 1번 ConvNet연산으로 연산량을 줄임)
> Feature map에서 RoI를 뽑아낸 후, Fully connected layer의 입력에 맞게 알맞게 크기를 조정한다. (RoI pooling)
> Fully connected layer의 입력으로 넣어서 Classification Score와 Linear Regression Offset을 계산한다.
> 학습 시 두 Loss를 합쳐 Multi-task Loss로 Backprop를 진행한다.
> CNN을 거치는 과정은 매우 짧다. Region Proposal을 계산하는 시간이 대부분이다.(병목 발생)
> 병목 문제를 해결하기 위해서 Faster R-CNN 등장, Selective Search를 사용하지 않는다.
> RPN(Region Proposal Networks)를 사용한다. (Fast R-CNN, + RPN)
> RPN에는 객체가 있는지 없는지 예측하는 loss, Bounding box 좌표에 관한 loss가 있다.
> Faster R-CNN의 마지막 단에는 Region Proposals Classification Loss, Bounding box Regression이 있다.(Region Proposal을 보정해주는 역할)
> 총 4개의 Loss를 학습시킨다. (본 논문에서 RPN과 Classification Network를 분리해서 학습을 시행하였는데 큰 차이점은 없었다.)
> 이미지 내에 bounding box를 그리는 task와 class probability를 예측하는 task를 따로 진행하지 않고 하나의 regression 문제로 푸는 것이다.
Instance Segmentation
> 객체 별로 Segmentation Mask를 예측 ( Segmentation + Object Detection )
> Faster R-CNN과 유사하다. 단 마지막 단에 Classification/bbox Regression을 하는 것이 아니라. BBox마다 segmentation mask를 예측하도록 한다.
> RPN으로 뽑은 ROI 영역 내에 각각 semantic segmentation을 수행한다.
> CNN으로 Feature map을 추출한다음 ROI Align을 수행하면 두 갈래로 나뉜다.
> 첫 번째 갈래(위쪽 갈래)에서는 각 Region proposal이 어떤 카테고리에 속하는지 계산, Region Proposal의 좌표를 보정
> 두 번째 갈래(아래쪽 갈래)는 Semantic Segmentation을 위한 네트워크
스터디 질문 모음
Q1) 위 예제에서 Transpose Convolution의 Sliding을 할 때 일반적이 Convolution처럼 왼쪽 위에서 부터 시작하는 이유는 무엇일까?
> Transpose Convolution은 Convolution 연산을 반대로 하는 것과 같기 때문에 이와 통일되게 Sliding을 해준다.
- 추가적으로 ROI Pooling, ROI Align, Region Proposal Networks은 따로 공부가 필요하다 추후에 이와 관련된 내용 Posting 예정