1. Computer vision의 다양한 task
이전 CS231n 정리 포스팅은 주로 인공지능을 활용한 컴퓨터 비전 문제 중 주로 "분류"에 대해 다루었다.
CV에는 분류 뿐만 아니라 다양한 Task들이 존재한다.
객체가 아닌, 픽셀 단위로 그 픽셀이 어떤 클래스에 속하는지를 예측하는 Semantic Segmentation 문제
분류를 하고, 그 분류된 클래스의 하나의 객체가 이미지의 어디에 있는지 예측하는 Classification+ Localization 문제
하나의 이미지에 여러 클래스의 여러 객체가 어디에 있는지 예측하는 Object Detection 문제
Object Detection에서, 위치만 예측하는 것이 아닌, 객체가 존재하는 픽셀까지 예측하는 Instance Segmentation 문제
우선, 분류만 하면 되지 않냐, 왜 이런 Task들이 필요하는가?에 대한 의문이 있을 수 있는데, 각 문제별로 적용할 수 있는 문제가 다양할 뿐만 아니라, 이렇게 가시화 함으로써 네트워크가 어떤 부분을 보고 판별을 하는지 설명할 수 있고, 어떤 부분을 개선해야할지 알 수 있기 때문이다. 이렇게 다양한 필요에 의해 다양한 task들이 있다. 각 task들이 어떻게 구현되는지, 어떻게 활용되는지를 앞으로 알아보자.
2. Semantic Segmentation
각 픽셀에 카테고리 레이블을 붙인다. 이때 주의해야할 개념은 이미지를 객체별로 분류하는 것이 아닌, 하나의 픽셀에 대해서만 분류한다는 것이다. 픽셀에 대한 분류 과정은 다양한 방식으로 행해질 수 있는데, 각 방식이 어떤 문제점이 있었고 어떻게 개선되었는지 확인해보자.
1. Sliding window
CNN의 Filter와 같이 Window의 크기를 설정하고, 그 Window를 Sliding하면서 가운대 pixel을 분류하는 방식이다. 이 방식의 경우 Window가 겹치는 부분을 서로 다른 pixel예측에 공유되지 않고, 독립적으로 연산을 하므로 data를 공유하지 않고, 자원의 낭비가 심하다는 단점이 있다.
2. Fully Convolutional
이미지를 네트워크에 입력으로 제공하고, 출력으로 픽셀 별로 레이블링 하는 방식이다. 이 방식의 경우, 하나의 이미지에 대해 하나의 네트워크로 한번에 연산하므로 데이터를 공유할 수 있다는 장점은 있지만, 출력과 입력의 크기가 동일해야 하므로, 중간 레이어의 입출력 크기를 그 크기로 유지시켜주는 과정에서 자원이 너무 비싸진다는 단점이 있다. 가령 4K이미지를 Semantic Segmentation해야 한다면, 한 레이어당 대략 10^7개의 파라미터가 필요할 것이다.
3. Fully Convolutional with downsampling and upsampling
차원적 문제를 해결하기 위해서 downsampling과 upsampling을 적용하는 방식이다. downsampling은 이전 CONV에서 적용된 것을 보았는데 Upsampling은 새로울 것이다. downsampling과 반대로 upsampling은 공간적 데이터를 최대한 유지하면서 크기를 키우는 것이다. 이때 downsampaling하면서 소실된 데이터를 어떻게 채우는지에 문제가 생긴다고 하는데. 그 예시로는 다음과 같은 방식들이 있다고 한다.
1. Unpooling
Pooling의 반대 개념으로, 하나의 값을 이용하여 큰 범위(receptive field)로 확장하는 방법이다. 범위를 확장하는 방식으론 하나의 값을 복제하는 방식으로 구현할 수도, 0으로 그냥 채우는 방식으로 구현할 수도, 그 외의 방식을 이용할 수도 있다.
2. Max unpooling
Downsampling 중, Maxpooling을 사용할 때 선택된 값의 위치를 기억해뒀다가, 일정 연산 이후 upsampling할 때 기억한 위치를 기반으로 값을 채워넣는 방식이다. 즉, 네트워크 레이어의 대칭성을 이용하는 것이다. 하지만 이 방식 역시도 선택된 위치 외에 다른 값들은 0으로 채워넣으므로 특정 feature map에 대한 spatial data를 잃는다는 단점이 존재한다.
3. Transpose Convolution
CNN을 할때 차원이 Filter의 크기와 stride의 크기에 따라서 다수의 값들이 하나의 값으로 축소되는 many to one구조를 띄었음을 배웠다. Transpose는 그 반대로 하나의 값을 다수의 값으로 확장시키는 Convolution연산이다. (one to many) 이 방식은 유동 함수 + 학습 가능이라는 의의가 있다.
하나의 값에 다차원의 필터의 입력으로 넣고, 다차원의 결과물을 얻어내는 방식이다. 이때 겹치는 부분은 단순히 더하는 방식을 채택한다. 하지만 이 부분에 대해서 문제가 제기되고 있기는 하다더라
이에 대한 연산을 수학적으로 표현해보자. 우선 Convolution연산을 matrix로 나타낼 수 있음을 기억할 것이다. 여기서 weight를 transpose한 것이 Transepose Convolutional의 개념이라고 생각하면 된다. 다음은 1차원 데이터의 예시이다.
커널이 [x,y,z]로 size가 3이고, stride가 1이며, padding이 1인 convolution연산이 있다고 가정하자. 이를 단순히 transpose하면 다른 padding rule를 가진 일반 convolution연산과 같음을 확인할 수 있다. ( 크기가 3인 [z,y,x]커널 )
하지만 stride가 커진다면 이는 convolution 연산에서 벗어남을 알 수 있다.
다음은 stride가 2인 transe convolution의 예시이다. transpose한 결과가 convolution 연산을 벗어남을 알 수 있다. 여기서 upsampling 과정에서 겹치는 부분을 평균을 취하는게 아닌 덧셈을 취하는 이유를 알 수 있었다.
// convolution 연산의 의미 (어떻게 연산하는가 x, 어떤것을 의미하는가 o)
3. Classification + Localization
네트워크를 학습시킬 때 classification 뿐만 아니라 Localization에 필요한 위치 데이터까지 함께 학습하는 것이다.
classification과 Localization 두가지에 대해서 예측하고, 두 결과에 대해서 Loss를 연산한 후 합친다. 그 총 Loss를 최소화 하는 방식으로 두 Fully connected layer을 학습한다. 여기서 공통된 부분은 일반적으로 Pretrained model을 freeze 하고 두 FC를 finetuning 하는 방식을 종종 사용한다더라. 또한 이렇게 Loss를 더할 때 하이퍼 파라미터로 Loss별 가중치를 줄 수 있다. 이 하이퍼 파라미터는 Loss에 직접적인 영향을 끼치지만, Loss를 최소화 하는 방향이 optimal하다는 보장이 없으므로 조심하여 선택하여야 한다.(가령 두 weight를 0, 0으로 설정하면 Loss는 0으로 minimal이지만 절대 optimal하지 않다.). classification과 모든 classificatino에 대해 box를 따로 학습하고, 분류된 카테고리에 대해 box를 예측하는 방식도 존재하고, 잘 적용하지만 이렇게 한번에 두가지를 학습하는 방식도 가능하다더라 (optimal하지 않을 순 있어도 유의미하게 작동한다더라)
// 두 Loss의 크기가 다르고, 영향을 끼치는 정도도 다를텐데 이 방식이 옳을까? 악영향을 주지 않을까?
4. Object Detection
이전 localization과 다르게 Object Detection은 다수의 객체의 위치를 추출하는 방법이다. 즉, 하나의 네트워크를 통해 고정된 출력을 리턴하는 것이 아닌, 가능한 공간 데이터들을 추출하고, 각 공간에 대해 클래스에 해당하는 객체가 있는지 판별해야 하는 것이다. 이때 객체가 있을만한 공간을 추출하는 방식에 따라서 이 방식은 나뉜다. 그 방식은 다음과 같다.
1. Sliding window
크기, 위치를 유동적으로 바꾸면서 그 window에 속하는클래스가 있는지 판별하는 방식이다. 이를 위해서 속하는 클래스가 없다는 것을 의미하는 background클래스를 추가하여 이를 해결하였다. 하지만 이 방식은 CNN이 위치, 크기에 따라 CNN의 스케일이 커지고, 연산이 비싸진다는 단점이 있기 때문에 실질적으로 사용하기는 어렵다.
2. Reigion Proposals
객체가 존재할 가능성이 있는 위치를 일일히 sliding하며 찾는 대신 이를 알고리즘을 통해 구하는 방식이다. 어떤 객체가 존재할만한 위치, 크기 정보를 1000개 정도를 구하는 알고리즘을 이용하여 anchor를 얻고, 그 anchor에 대해 분류를 하여 그 클래스가 background가 아니라면 객체를 배정하는 방식이다. 알고리즘이 고정적으로 1000여개의 위치 및 크기 정보를 리턴하므로 noise가 많다는 단점이 있지만 Recall(맞은 비율)은 크다는 점에서 유의미 한 방식이다.
여기서 객체에 대한 클래스 예측은 CNN으로 하는데, 입력의 크기가 유동적이므로 일반적인 CNN방식을 사용하기 어렵다는 문제가 있다. 이를 해결하기 위해 R-CNN을 사용한다. R-CNN은 알고리즘으로 구한 Region에 대해 FC를 거쳐 ConvNet의 입력으로 이용하는 방식이다. 이 네트워크를 거치면 각 Region에 대해 SVM과 박스 위치 및 크기의 offset을 리턴 하도록 한다. 이 출력을 학습하는 것이 이 방식의 키포인트이다. (Region을 선택하는 것은 학습이 아닌 알고리즘으로 정의되어 있다.)
이 방식은 앞선 Sliding window보다 연산 복잡도가 낮지만 여전히 자원적으로 비싸므로 더 좋은 알고리즘의 필요성이 대두되었다.
3. Fast R-CNN
고화질의 이미지를 픽셀단위로 Region을 나누고, 분류하기에는 연산적으로 너무 비싸다는 단점이 있었다. Fast R-CNN은 이를 픽셀단위가 아닌 이미지를 ConvNet의 입력으로 하여 나타난 결과인 feature map에 대하여 알고리즘으로 Region을 나누고, Pooling하여 고정된 크기의 입력으로 변경한 후 통일된 FC를 통해 이를 분류하도록 네트워크를 구성하여 속도를 올린 방법이다.
4. Faster R-CNN
기존 Fast R-CNN이 느렸던 이유는, 알고리즘을 통해 일정 수의 객체가 있을법한 Region을 고정적인 갯수를 구하고 이 Region에 대해 독립적으로 FC를 거쳐 객체에 대한 분류를 했기 때문이었다. 이를 해결하기 위해 객체가 있을만한 Region들을 알고리즘이 아닌, 단 하나의 이미지 입력으로 다수의 ROI(Regions of Interst)를 출력하는 네트워크(Region Proposal Network, RPN)를 구성하고, 이렇게 나온 ROI들에 대해 Fast R-CNN을 거치는 방법이다.
Region을 예측하기 위한 2개의 Loss(object인지 아닌지를 판별하는 Classification loss와 박스의 크기 및 위치를 조정하는 Bounding-box regression loss)와 Region에 대해 객체를 판별하는 2개의 Loss(어떤 객체인지에 대한 Loss와 proposal을 미세 조정하는 offset에 대한 Loss)로 다중 Loss구조를 갖는다. 이때 놀라운 것은 Region을 학습할 때 이미지 외에 추가적인 데이터가 필요 없다는 것이다 (Class가 있다고 판별된 Region에 대해 가중치를 조정하고, Class가 없다고 판별된 Region에 대해 가중치를 조정하는 방식인듯)
// Region을 학습하는 방식에 대해 좀 더 공부가 필요
// Region을 구하는 네트워크와 분류를 하는 네트워크를 분류하는 것이 더 정확도가 높지 않을까? 한번에 이렇게 학습하는 이유가 있을까?
5. Detection without Proposal
앞선 방식들은 객체가 존재할만한 Region을 구하고, 그 Region에 대한 분류를 통해 객체에 대한 정보들을 얻었다. 하지만 Region을 얻는데에 필요한 자원이 너무 크다는 문제점이 있었는데, 이를 극복하기 위해 하나의 이미지를 학습하므로써 직접 객체에 대한 정보 및 위치를 학습하는 네트워크를 구상하게 되었다. 이의 예시로는 YOLO(Yout Only Look Once)와 SSD가 있다. 이 방식으로는 이미지에 대해 grid를 나누고 각 gride에 대해 dx, dy, dh, dw, confidence를 학습하는 방식이다 (여기서 dx, dy, dh, dw는 grid의 미세 조정을 위한 것들이다. 가령 하나의 grid에 대해 객체가 x,y좌표에 w,h크기로 존재할 수 있는것 처럼 말이다)
5. Instance Segmentation
객체별로 Localization을 넘어' 객체 별로 Segmentation을 얻는 방식이다. Object Detection의 확장으로, 객체가 있을것이라고 예측되는 Region에 Segmentation을 하는 것이다.
1. Mast R-CNN
기존 R-CNN에 Segmentation을 위한 Conv를 추가한 방식이다.
6. Reference
CS231n lecture 11
'ML' 카테고리의 다른 글
SOLOv1 논문 리뷰 (0) | 2021.07.16 |
---|---|
CS231n lecture 12 : Visualizing and Understanding (0) | 2021.07.12 |
Recurrent Neural Network (RNN) (0) | 2021.07.10 |
CNN 구조 (0) | 2021.07.06 |
인공지능 Learning rate, Regularization, Weight update, Transfer Learning (0) | 2021.07.05 |