지금까지 우리가 다룬 주제들은 대부분 Image Classification에 대해서 다뤘는데 또 다른 Computer Vision 분야를 알아보자!
1. Semantic Segmentation(Object X)
입력 image에 대해 모든 pixel들이 어떤 category에 들어가게 되는지를 예측하는 것으로 각각의 pixel이 어떤 물체를 의미하는지 알아본다. 오직 pixel만을 신경쓰기 때문에 이어져있는 개별적인 물체들을 구별하지 못한다. 예를 들어 소 2마리가 연속적으로 붙어있는 경우 이를 각각의 소로 생각하지 않고 하나로 합쳐 소라고 생각하게 된다. 이것은 후에 instance segmentation에서 해결을 하게 된다. 그렇다면 이semantic_segmentation 을 어떤 방법으로 학습을 하는 것일까?
Sliding Window
입력 image를 매우 작은 local crop으로 구분하여 분류 문제로 해결한다는 아이디어로 각각의 crop이 어떤 category에 들어갈지를 예측한다. 즉, crop한 부분의 pixel을 추출하여 이전에 항상 하던 CNN을 거쳐 분류를 진행한다
🤬 문제점: 매우 매우 높은 비용의 연산을 필요로 한다 ➡️ 모든 pixel 각각에 대해 label을 붙여야 하며 모든 부분 crop을 CNN에 학습시켜야한다. 또한 바로 이웃한 crop들에 대해 공통된 feature들을 다시 재활용하지 않기 때문에 매우 비효율적으로 학습을 할 수 밖에 없어 사용되지 않는 방법이다

Fully Convolutional
각각을 crop으로 나눠 독립적으로 전체 image를 입력으로 넣어 공간적 정보를 잃지 않게 convolutional network를 만들어 학습을 진행한다는 생각이다. 이때 zero padding을 이용하여 Conv layer을 통과할때 공간적 정보를 유지하며 맨 마지막에는 각 pixel마다 class score을 저장한다. 이때 아래 그림에서 C는 class의 개수를 뜻하며 C개마다 각각의 점수들이 들어있어 그 중에 가장 높은 값이 해당 픽셀의 class가 된다. 업데이트 과정은 기존 CNN과 똑같이 이루어진다.
🤬 문제점:
- 각 pixel마다 class 부여해야하기 때문에 training data를 만드는데 오래 걸린다.
- 이미지의 공간적 정보(높은 해상도)를 유지해야하기 때문에 연산 비용이 매우 커진다. 기존 CNN 모델들을 보면 pooling이나 1X1 Conv등으로 down sampling을 하여 연산 비용을 줄이는데 여기서는 그렇게 하지 않는다

Fully Convolutional with downsampling & upsampling
적은 수의 Conv layer만 본래의 공간적 정보를 유지한 채로 계산 한 뒤 downsampling하여 학습을 효과적으로 진행한 다음, 다시 upsampling을 통해 본래의 공간적 정보를 되찾아 학습을 마무리한다. 이렇게 할 경우 더 작아진 layer의 크기로 인해 더 깊은 network를 만들 수 있기 때문에 연산적으로 이점을 가진다. 이후에 기존과 같이cross-entropy_loss 를 이용해서 backpropagation을 진행하여 update를 진행한다
- Downsampling: Pooling(학습불가, parameterX), strided convolution(학습가능)
- Upsampling: Unpooling, strided transpose convolution(학습 가능)
Unpooling
Nearest Neighborhood Unpooling: 같은 값이 확장된 영역에 그대로 들어가게 됨Bed of Nails Unpooling: 가장 왼쪽 상단에 입력 값이 확장된 영역에 그대로 들어가고 나머지는 0이 됨⭐️ Max Unpooling: max pooling을 진행할 때 max인 곳의 위치를 기억했다가 unpooling때 그 자리에 unpooling이 되는 값을 넣는 방법- 위치를 기억함으로써 max pooling을 통해 잃어버린 공간적 정보를 다시 가져오며 각 픽셀이 어떤 class인지 구하는 문제인 만큼, 최대한 완벽하게 픽셀이 어떤 class인지 학습하기 위한 디테일을 추가해주는 이점을 제공한다.
- 이를 위해서는 네트워크 구조가 대칭적이어야 할 필요가 있다.

Learnable Upsampling (Transpose Convolution)
downsampling하는 방법과 반대로 기존의 값을 weight와 연산을 하여 upsampling이 되므로 학습이 가능한(weight가 존재!) upsampling이라고 불린다!
input scalar X filter weight- weight와의 내적을 통해 scalar값을 linear transformation 시켜 다른 공간상의 값으로 바꾼다고 생각하면 된다 Linear Algebra 9. Dot products(Inner Product) and duality
- 기존의 convolution에서는 weight와의 연산을 통해 단일한 scalar값을 결과로 내보냈다면, 여기서는 반대로 scalar 값을 weight와의 연산을 통해 일정 크기의 값들을 내보내게 된다(transpose convolution!)
- 1에서 구한 값을 output의 공간상으로 배치시키되 겹치는 부분의 값은 단순히 더한다

Convolution as Matrix Multiplication
왜 위에서의 일련의 과정을 transpose convolution이라고 불리는지 알아보려면 convolution을 행렬 곱으로 나타낼 수 있다는 것을 먼저 알 필요가 있다. 1차원 convolution에서 size=3, stride=1,padding=1인 경우를 예시로 들어보면 vector들은 다음과 같은 의미를 갖는다
- vector : filter에 있는 weight로 3가지 element를 갖는다
- vector : input vector로 4개의 element로 구성된다. (convolution에 들어갈 값)
- matrix : convolutional Kernel의 복사본으로 선형 변환을 통해 표현이 되는 공간이다. Linear Algebra 3. Linear transformation and matrices
- [?] 내일 linear transformation 3blue1eye 영상 다시 시청하고 필요한 부분 다시 정리하고 나서 이 강의 다시 쭉 듣자!
즉, input vector 를 matrix filter들의 weight로 이루어진 matrix 간의 행렬곱을 linear transformation을 통해 matrix 가 표현하는 공간에서의 vector로 표현이 된다. ❓이때 여기서는 새로운 공간 상에서 표현된 matrix X로 표현된 vector가 곧 기존의 차원보다 낮아진 downsampling 된 vector라고 생각할 수 있다.
Transpose Convolution에서는 convolution에서와 반대되는 현상이 일어나며, 반대로 생각을 하면 된다. 이때 stride가 1일 때를 예시를 들면 vector들은 다음과 같은 의미를 갖는다
- matrix : 똑같은 matrix를 transpose!
- vector : input vector로 4개의 element가 구성
즉, input vector a가 X transpose로 구성된 차원으로 linear transformation이 되었을 떄 어떤 vector로 표현하게 됨
- 이 경우에는 vector의 차원이 높아진 upsampling으로 볼 수 있다(공간 확장)
위에서 output들이 겹치는 부분을 단순히 더한(sum) 다고 했는데 그 이유가 바로 Linear Algebra 4. Matrix multiplication 의 결과가 average가 아니라 sum이기 떄문임
= 최근에는 sum의 문제를 해결하기 위해 다른 size의 Conv layer을 사용함

2. Localization with classification (1 object)
이 작업은 단순히 사진의 물체가 어떤 class에 속하는지 알아보는 것에 더하여, 특정 물체가 사진에 어디에 위치해있는지 를 알아본다. 특히 물체의 개수가 몇개인지 알고 있을때 유용하게 사용 가능하며 기존에 사용했던 network를 활용 가능하다. 물체가 어떤 class에 속하는지 알아내는 classification 문제와 물체가 어떤 박스안에 존재하는지, box의 좌표를 계산하는 regression 문제를 합치며 수행된다.
- 최종적으로 요약된 vector을 통해 한 개의 FC를 이용하는 것이 아니라 2개의 FC를 이용해 classification과 regression 작업을 각각 수행한다.
Bounding box regression과 Classification 작업을 같이 진행하기 때문에 2개의 loss가 존재하고 이를 multitask loss라고 말한다. multitask loss는 2가지 loss를 특정 값만큼 곱한 뒤에 더하기(weighted sum) 때문에 ⭐️각 loss에 얼마만큼의 가중치를 줄지가 hyperparameter의 값에 따라 달라지게 된다. 하지만 이 hyperparameter은 다른 hyperparmeter들과는 다르게 직접적으로 loss의 값을 바꾸게 된다. (다른 것들은 간접적으로 영향을 줌) 이로 인해 어떤 hyperparameter 값을 가질지를 loss를 통한 정량적인 평가가 불가능하기 때문에 또 다른 평가기준을 세워 이것을 기준으로 성능을 평가해 얼마만큼의 가중치를 줄지를 정해야한다.

ex) Human Pose Estimation
관절의 수가 같은 수로 정해져있다고 가정하여 각 관절이 어디에 위치해있는지에 따라 사람의 형상을 추측할 수 있는 방법이다. 먄약 14개의 관절들을 이용해 형상을 예측하고자 한다면, 14개의 box coordinate를 regression의 방법으로 학습시켜 각 관절이 어디에 있는지를 학습한다. 다만 이런 classification + Localization 방법은 고정된 output의 개수를 알고 있을 때만 유용하게 사용할 수 있다.

Classification VS Regression
- Classification: 어떤 category인지 예측하는 문제 (softmax, cross-entrophy,SVM을 loss function으로 이용)
- Regression: 연속된 값 중에 어떤 값인지 예측하는 문제(L2, L1 loss를 주로 이용)
3. Object Detection
computer vision 분야에서 매우 중요하게 다루는 분야로 몇개의 물체가 output에 있을지 모르는 상황에서 어떤 물체가 있는지 확인하는 방법이다. 이때 이것을 구현하고 학습하기 위해서는 매우 많은 변수들이 존재(base network, detection architecture,hyperparameter..)한다.
🤬 위에서 나온 방식들 이용하여 object detection을 진행하고자 한다면 다음과 같은 문제점이 생긴다
- Regression: output의 개수가 정해져있지 않고 물체의 각 좌표를 regression 해야하기 때문에 예측하는 것이 까다로운데 각 image마다 물체의 ouput 개수가 달라 얼마나 많은 object를 찾아야할지 모르기 떄문에 localization하는 것이 사실상 불가능해 범용적인 모델을 구성하는 것이 어렵다 (
classification + localization문제!) - Sliding window: image에 서로 다른 crop을 잡아 CNN 통과 후 classification 진행 (
semantic segmentation과 일부 유사)하는 방식이다. 즉, 각 crop마다 어떤 class의 물체가 있는지 확인하는 방법인데, 이런 방식은 crop의 위치, size, 개수가 모두 변수가 되어 이에 맞게 모두 계산할 경우 경우의 수가 매우 많아져 연산이 매우 비싸지고 비효율적으로 바뀐다.
Region Proposals
이는 deep learning 기법보다는 고전 computer vision 기법에 가까운 방법으로 crop의 후보가 무수히 많은 sliding window의 문제를 crop의 후보를 제시함으로써 일부 해결한 방식이다.
기본적인 방법은 object가 있을법한(blobby한 뭉탱이가 있는) 구역들의 후보들을 추려서 학습을 진행하는 방식이다. 이때 selective search와 같은 방법으로 1000개~2000개의 후보들을 CPU를 통해 몇초만에 내보낸다. 이때 대부분의 후보들에 실제 물체가 없지만, 이 사진에 물체가 존재한다면 이 crop의 후보들 중에 하나는 이 물체를 알아낼 수 있다는 것이 장점이다.
R-CNN
위에서 언급한 region proposal 방식을 딥러닝 방식으로 이용한 모델로 모든 후보가 되는 crop들 CNN의 입력으로 들어가 object detection을 진행하는 방식이다!
작동방식
- Region Proposal 진행:
selective search와 같은 방법으로 후보 구역(ROI: Region of Interest)을 정한다 - 각 region의 크기 일반화: 모든 ROI의 크기가 다르기 때문에 이 크기를 통일시켜 CNN의 입력으로 들어갈 수 있게 만든다. (CNN은 단일한 범용적 모델이기 때문에 입력의 크기가 같앙함) ➡️ 그림에는 여러가지 CNN을 각각 사용하는 것 처럼 보이지만, 하나의 공통된 CNN을 사용하여 학습한다!
- 각 region을 CNN에 통과시킴: 입력으로 들어간 region이 CNN을 통과하면서 학습한다
- SVM을 이용해 region의 물체를 분류를 진행: 각 region에 대해 classification을 진행하여 이 reigion안에 어떤 물체가 있는지를 확인하고 학습한다
- box의 좌표를 regression을 통해 학습: region안에서 물체의 위치를 정확히 알게 만들 필요가 있다.
참고로 R-CNN에서는 region proposal은 학습할 수 없고, 단순히 주어진 region에서 어디에 물체가 있는지를 학습한다고 보면 된다.
🤬 문제점
- 여전히 각각의 region proposal을 독립적으로 계산해야하기 때문에 연산의 비용이 많이 나간다
- 위에서 언급했다싶이 region proposal은 정해져있기 떄문에 학습이 불가능하다.
- 학습시키는데 걸리는 시간이 약 84시간으로 매우 느리고 수많은 후보의 feature을 저장해야하기 때문에 많은 용량을 필요로 한다
- test에서 detection하는 것 역시 수천개의 후보가 입력으로 들어가기 때문에 이미지당 47초가 걸려 느리다
Fast R-CNN
앞서 언급된 R-CNN의 문제점을 여러 해결한 발전된 모델로써 각각의 proposal마다 CNN을 이용하지 않고 전체 이미지를 CNN에 넣은 뒤의 결과를 proposal하여 시간과 효율성을 높인 방법이다
작동방식
- 전체 image가 CNN에 입력으로 들어간다 : 이후 CNN을 통과하며 feature map을 구하며 (여기서는 conv5의 feature map 사용) 이는 image의 각 부분을 나누어 CNN의 입력으로 넣는 R-CNN과 구별되는 특징이다
- feature map에서 proposal 방법을 이용하여 ROI를 구한다: pixel에서 crop을 하는 것이 아니라 feature map으로 project한 결과에서 crop을 진행한다
- 각 region의 크기 일반화(Rol Pooling layer-일종의 max pooling과 유사): FC를 통해 class score을 구하기 위해서는 통일된 입력의 크기로 바꿔야함
- 예측 결과 도출 :Classification을 위한 softmax와 bounding-box regression을 위한 score function을 이용하여 예측 결과를 도출
- loss를 통한 최적화 진행: 이 두 function의 loss를 합친
multitask loss를 구해 전체 모델에서backpropagation 진행
즉, feature map에서 proposal을 만들어내고, 이 지역들이 crop되어 학습이 진행되기 때문에 연산에 비용이 많이드는 convolution 연산을 재사용할 수 있게 된다. feature map 사이에서 연산을 공유한다는 뜻이다. 그 결과 학습 시간이 8.75시간으로 줄어 시간상으로 큰 이점을 얻는 결과를 낳는다.
🤬 문제점
- test time에서 대부분의 시간들이 region proposal(
selective search)을 하는데에 소비가 되어 비효율적이다. region proposal을 뺸 연산시간은 0.32초인데에 반해, 이 과정을 합치면 2.3초가 걸려 약 2초동안의 시간이 어떤 부분을 뽑을지를 계산하게 되어 일종의bottleneck이 생기게 된다. - 여전히 어떤 지역을 뽑을지 학습을 하지 못한다.
Faster R-CNN
faster_R-CNN 즉, 기존의 문제점은 region proposal을 계산하는 과정에서 bottleneck이 생기게 되는 것이었는데 이를 모델 스스로가 region proposal을 생성할 수 있도록 만듦으로써 해결한다!
동작방식: 대부분의 방식은 비슷하지만 Fast CNN에서 2번과 3번 사이에 새로운 단계가 추가됨
- feature map에서 Region Proposal Network(RPN) 를 만듦: 즉, 모델 스스로가 학습하며 어떤 region을 후보로 만들지 정한다.
- 이 후보가 된 지역은 multitask loss를 구하는데 사용
- Classification loss: RPN이 만든 proposal안에 물체가 있는지 구별하며, ground truth 데이터가 따로 존재하지 않는데 이를 특정 구역이 물체가 많이 겹친다고 판단할 수록 값이 높고 적을 수록 값을 낮게 설정하고 loss의 경우는 물체의 유무에 따라 0과 1의 값을 갖는 binary classification을 진행한다. 자세한 구조에 대해서는 언급하고 있지 않다
- Bounding box regression loss: 이 후보가 된 지역의 좌표를 조정하는 역할을 한다.
- Fast CNN과 같이 ROI pooling 진행 후 classification과 regression을 진행: 최종 분류 점수를 구해 물체의 class를 예측하며 box coordinate의 좌표도 구하는 이는 RPN 단계에서 생성된 region안에서 더 정확하게 어디에 물체가 있는지 확인함으로써 오류를 줄이는 역할을 한다
Test time에서의 시간을 0.2초로 줄며 잘못된 region proposal을 스스로 학습하여 극복함으로써 이 과정에서의 bottleneck을 없애 Fast R-CNN의 2.3초와 비교하여 큰 성능의 향상을 가져왔다. 또한 계산한 region proposal외의 부분(outside the network) 부분을 제한한다.
Single Shot Detection (YOLO/ SSD- No Proposal)
You only look once/ Single Shot Detection으로 위에서 언급한 모델들과 다르게 region의 후보를 뽑아 학습을 진행하지 않는 non-region based model이다. ⭐️ 다만 region의 후보가 되는 지역들을 뽑아 여러번의 반복을 통해 학습하는 것이 아닌 base bounding box가 확정된 region이 되어 모든 예측을을 한번에, 하나의 큰 CNN을 이용하여 계산하는 방식으로 regression 문제로 해결하려는 방법이다.
동작방식: 단 한번의 통과를 통해 진행이 된다!
- 입력 image를 일정한 간격의 grid로 나눔 (아래 그림에서는 7X7로 나눔)
- 각각의 cell마다 base bounding box를 만듦(여러개이며 아래 그림에서는 3개를 만듦)
- 각각의 cell의 base bounding box마다 회귀를 진행하여 해당 박스에 객체가 있을 가능성을 확인한다. 이때 1) 박스 안객체의 좌표(4개)와 2) 각 객체 클래스에 대한 신뢰도(객체 존재확률 X 클래스 확률)을 계산한다.
- C개 class만큼 predict score을 계산하여 가장 신뢰도가 높은 박스를 남겨 학습을 진행한다. 이로 인해 만들어진 Output의 크기는 가 되어 3차원 tensor로 생각할 수 있게 된다
- 7X7의 grid와 final box의 5개 수
- B: base box의 수로 각 box마다 5개의 결과값을 만들어내 실제 object location을 구함
- C는 classification score
참고로 Faster R-CNN이 더 느리지만 정확하다고 하며 이는 YOLO와 같은 모델은 단 한번의 CNN을 통과하여 학습을 하기 때문이다. 이에 YOLO와 같은 single shot 방식은 매우 빠른 처리 속도 혹은 실시간으로 객체를 탐지할 때 사용된다고 한다. SSD는 더 빠르지만 정확성은 좀 낮은 편이라고 한다
Dense Captioning(Object detection + Captioning)
각 region마다 caption(설명)을 다는 network로 faster R-CNN을 통한 object detection 후 각 region마다 class score을 내지 않고 중간에 다른 layer을 RNN 모델과 연결하여 설명을 만들어내는 방법이다. CS231n 10-1. Recurrent Neural Networks(Single RNN) 이런 방법과 같이 여러 computer vision 분야들을 서로 섞어서 새로운 작업에 활용이 가능하다.

4. Instance Segmentation
object detection 후 segmentation mask를 진행하여 pixel-wise 정확도로 물체를 detection 가능!
Mask R-CNN
object detection과 semantic segmentation을 합친 방식으로 여러 객체를 탐지하되 그 정확도가 픽셀 단위가 되도록 만든다. Mask R-CNN은 말 그대로 R-CNN모델을 masking하여 각 pixel마다 어떤 객체인지를 확인하는 모델이다.
동작방식
- image를 CNN에 넣은 뒤 feature map을 얻어 region의 후보를 학습시킨다 (
R-CNN) - 같은 사이즈로 만들어주기 위해 ROI Align 진행 (
R-CNN) - detection을 위해 classification score와 class마다 box coordinate를 구함 (
R-CNN) - Conv layer을 거쳐 region proposal에 대해 여기에 들어가있는 각 pixel이 어떤 class에 들어가는지를 masking한다 (
Semantic Segmentation) Faster R-CNN에서 bounding box regression 하는 부분에 object mask prediction branch 추가하여 만들어진다
이런 방식을 통해 굉장히 좋은 결과를 가지게 되며 사람의 pose를 구분하기 위해서는 단순히 joint coordinate를 추가하면 된다. 또한 faster R-CNN의 기반하기 때문에 실시간으로 구별해낼 수 있다
