티스토리 뷰

ML DL

[ML/DL][cs231n]Lec11.Detection and Segmentation

무엇보다_빛나는_샤트 2022. 2. 14. 23:26

*2021.12.5 20:32

 

안녕하세요

프로그래밍을 배우는 빛나는 샤트입니다.

 

cs231n 11강 Detection and Segmentation

*이 포스팅은 cs231n 강의를 듣고 작성했습니다.


 

11강 Detection and Segmentation

 

 

Segmentaion, Localization, Detection
이 문제들을 CNN 적용하는 방식

 

<So far: Image Classification>
분류
입력 이미지 - 네트워크(Featrue Vector) - FCN(1000개의 클래스 스코어)
입력 이미지가 들어오면 "전체 이미지"가 속하는 카테고리가 출력

 

<Other Computer Vision Tasks>
첫 번째 Sementic Segmentation. 입력은 이미지이고 출력으로 이미지의 모든 픽셀에 카테고리를 정함
여기에서는 출력은 모든 픽셀에 대해서 그 픽셀이 '고양이', '잔디', '하늘', '나무', '배경'인지 결정.
Classfication처럼 카테고리가 있지만 이미지 전체에 카테고리 하나가 아니라 모든 픽셀에 카테고리가 매겨진다.

 

<Semantic Segmentation>
개별 객체를 구분하지 않는다. 즉 우측의 2마리의 소가 있지만 하나의 소(cow)로 인식한다.
픽셀의 카테고리만 구분한다. 'cow'라고 레이블링된 픽셀 덩어리만 얻을 수 있다.
이는 Semantic Segmentation의 단점이며 추후에 배울 Instance Segmentaion이 이를 해결한다.

Classfication을 통한 접근을 이용해 Semantic Segmentaion을 접근할 수 있다.
> Sliding Window를 적용할 수 있다.

 

<Semantic Segmentaion Idea: Sliding Window>
입력 이미지를 아주 작은 단위로 쪼갬. 여기에서는 소의 머리 주변에서 영역 세 개를 추출함.
이 작은 영역만을 가지고 Classfication 문제를 푼다고만 생각하면, (해당 영역이 어떤 카테고리에 속하는지를 정하는 것) 
이는 매우 큰 비용이 든다.
이유는 모든 픽셀에 대해서 작은 영역으로 쪼개고 이 모든 영역을 forward/backward pass하는 일은 상당히 비효율적이다.
> 하지만 Semantic Segmentation을 하고자 할 때 가장 먼저 생각해볼 수 있는 방법

 

<Semantic Segmentaion Idea: Fully Convolutional>
개선된 방법: Fully Convolution Network
FC-Layer가 없고 Convolution Layer로 구성된 네트워크.
이 네트워크의 출력 Tensor은 C*H*W이며, C는 카테고리의 수이며 입력 이미지의 모든 픽셀값에 대해  Classfication Scores를 매긴 값
Conv Layer만 쌓아올린 네트워크를 이용해서 계산 가능하며 이 네크워크를 학습시키려면 모든 픽셀의 Classfication loss를 계산하고 평값을 취한다. 그리고 기존처럼 back propagation 수행.

질문: Training data를 어떻게 만드나?
답변: 매우 많은 비용이 든다.

질문: 손실함수는 어떻게 디자인?
답변: 이 문제에서는 모든 픽셀을 Classifcation하는 것. 따라서 출력의 모든 픽셀에 Cross Entropy를 적용. 출력의 모든 픽셀에는 Ground Truth가 존재하며 출력의 모든 픽셀과 Ground Truth간의 Cross Entropy를 계산. 이 값들을 모두 더하거나 평균화시켜서 Loss를 계산하거나 또는 미니배치 단위로 계산.

질문: 모든 픽셀의 카테고리를 알고 있다고 가정하는지?
답변: 맞다. 모든 픽셀의 카테고리를 알고 있다는 가정이 필요. Classification에서도 10,20,1000 등 클래스 개수가 정해져 있었듯이 Segmentation에서도 클래스의 수가 고정.

이 모델(conv layer로만 구성된 네트워크)은 하이퍼파라미터만 잘 조절해서 학습하면 비교적 잘 동작. 하지만 문제가 하나 있다.
이 네트워크의 경우에는 입력 이미지의 Spatial Size를 계속 유지시켜야 한다. 그래서 비용이 아주 크다.

[개인질문: 입력 이미지의 Spatial Size는 무엇이고 왜 계속 유지시켜야하며 그에 따른 비용은 왜 큰가?]

이 네크워크에 고해상도의 이미지가 입력으로 들어오면 계산량과 메모리가 엄청 커서 감당할 수 없을것.
> 실제로는 이렇게 생긴 네트워크를 보기는 힘들다.

 

<Semantic Segmentation Idea: Fully Convolutional>
대신에 이렇게 생긴 네트워크가 대부분. 특징맵(Feature Map)을 Downsampling/Upsampling한다.
Spatial resolution 전체를 가지고 Convolution 전체를 가지고 Convolution 수행하기보다는 Original resolution에서는 conv layer는 소량만 사용한다. Maxpooling, Stride Convolution 등으로 특징맵을 Downsampling한다. 이를 반복. Classification과 구조가 유사해 보인다. 하지만 차이점은 Classfication에서는 FC-Layer가 있었지만 여기에서는 Spatial Resolution을 다시 키운다. 결국 다시 입력 이미지의 해상도와 같아진다.
>> 이 방법을 사용하면 계산 효율이 더 좋아짐. 네트워크가 lower resolution을 처리하도록 하여 네트워크를 더 깊게 만들 수 있다.

[개인 질문: Spatial resolution, Original resolution이란?]

 

 

<Upsampling???>
Downsampling관련: 이미지의 Spatial Size를 줄이기 위한 Stride conv 혹은 다양한 Pooling
Upsampling은 처음.

전략 중 하나는 unpooling.

 

<In-Network upsampling: "Unpooling">
Avgerage Pooling의 경우 Pooling하는 각 영역에 해당하는 Receptive Field내에 spatial average 를 계산.

[개인 질문: Receptive Field?]

upsampling 방법 중에는 nearest neighbor unpooling이 있다.
좌측을 보면 2x2 입력을 4x4 출력을 만들었다. 2x2 stride nearest neighbor unpooling은 해당하는 receptive field로 값을 그냥 복사.

bed of nails unpooling(bed of nails upsampling): 이 방법은 unpooling region에만 값을 복사하고 다른 곳에는 모두 0을 채워넣는다.
Max unpooling이라는 방법도 있다.

 

<In-Network upsampling: "Max Unpooling">
대부분의 네트워크는 대칭적인 경향이 있다. Downsampling/Upsampling의 비율이 대칭적.
Downsampling시에는 Max Pooling에 사용했던 요소들을 잘 기억하고 있어야한다. Upsampling시에는 선택된 위치에 맞게 넣어줘야 한다. 

정리하면 Low Resolution 특징 맵을 High Resolution 특징 맵으로 만들어준다. 이 때 Low Resolution의 값들을 Max Pooling에서 선택된 위치로 넣어주는 것.

질문: 왜 이 방법이 좋은 아이디어이고 어떤 점에서 중요한지?
답변: Sematic Segmentaion에서는 모든 픽셀들의 클래스를 모두 잘 분류해야 한다. 예측한 Segmentation 결과에서 객체들간의 디테일한 경계가 명확할수록 좋다. 하지만 Max Pooling을 하게 되면 특징 맵의 비균진성이 발생(어디에서 온 값인지를 모름, 공간정보를 잃는다) Max Pooling 후의 특징 맵만 봐서는 이 값들이 Receptive Field 중 어디에서 왔는지 알 수 없다. Unpooling을 이용해 기존 Max Pooling에서 뽑아온 자리로 값을 넣어주면 공간 정보를 조금은 더 정확하게 다룰 수 있다. Max Pooling애서 잃어버린 공간 정보를 조금은 더 잘 유지하도록 도와준다.

질문: Max unpooling이 Back prop을 더 수월하게 해주는지?
답변: 이 방법이 Backprop dynamics를 크게 바꾸지는 않는다. Maxpool indices를 저장하는 비용이 그렇게 크지 않다.

 

<Learnable Upsampling: Transpose Convolution1>
Strided convolution은 어떤 식으로 Downsampling을 해야할지를 네트워크가 학습할 수 있다.
이와 유사하게 Upsampling에서도 학습가능한 방법이 있다. -> Transpose convolution

 

<Learnable Upsampling: Transpose Convolution2>
3x3 필터가 있고 이미지와 내적. 우선 이미지의 좌측 상단부터 시작. 내적의 결과는 출력의 좌측 상단의 코너값이 된다.

<Learnable Upsampling: Transpose Convolution3>
이 연산을 이미지 전체에 대해 반복.

<Learnable Upsampling: Transpose Convolution4>
자 그럼 Strided convolution을 살펴보자. 입력이 4x4, 출력은 2x2.

 

<Learnable Upsampling: Transpose Convolution5,6>
계산 방식은 기존과 유사. 내적 실시. 
하지만 Strided conv는 한 픽셀씩 이동하면서 계산하지 않는다.
"Stride=2"는 입력/출력에서 움직이는 거리 사이의 비율이라고 해석 가능.
따라서 Stride=2인 Strided conv는 "학습 가능한 방법"으로 2배 Downsampling하는 것을 의미.

<Learnable Upsampling: Transpose Convolution7>
Transpose convolution은 반대의 경우. 입력이 2x2이고 출력이 4x4.

<Learnable Upsampling: Transpose Convolution8>
연산은 기존과 다름.
여기에서는 내적을 수행하지 않는다. 우선 입력 특징맵에서 값을 하나 선택(빨간색, 스칼라)
이 스칼라 값을 필터(여기에서는 3x3)와 곱한다. 출력의 3x3 영역에 그 값을 넣는다.
입력값이 필터에 곱해지는 가중치의 역할을 한다. 출력값은 필터x입력(가중치)

 

<Learnable Upsampling: Transpose Convolution9> 36
Upsampling 시에는 입력에서 한 칸씩 움직이는 동안 출력에서는 두 칸씩 움직임.
출력에서는 Transpose convolution간에 Receptive Field가 겹칠 수 있다. 겹칠 경우 더한다.
이 과정을 반복해서 마치면 학습 가능한 upsampling을 수행한 것.
Spatial Size를 키워주기 위해서 학습된 필터 가중치를 이용한 것.

[개인 질문: Spatial Size를 키워주기 위해?]

 

<Learnable Upsampling: Transpose Convolution11> 38
다른 이름도 있다. deconvolution -> 그닥 좋지 않은 이름. 신호처리의 관점에서 deconvolution은 convolution 연산의 역연산을 의미.하지만 Transpose convolution은 그런 연산이 아님.
또는 upconvolution, fractionally strided convolution, backward strided convolution이라고 한다.

 

<Transpose Convolution: 1D Example> 39
Transpose Convolution의 구체적인 예시.
이 예제에서는 1차원에서 3x1 Transpose Convolution을 수행.
필터에는 세 개의 숫자(x,y,z)
입력은 두 개의 숫자(a,b)
출력을 계산해보면 입력이 가중치로 쓰이고 필터에 곱해짐. 이 값을 출력에 넣는다.
그리고 Receptive field가 겹치는 부분은 그냥 더한다.

 

<Convolution as Matrix Multiolication(1D Example)> 41
왜 Transpose일까?
> 이 이름의 유래는 Convolution 연산 자체를 해석해보면 알 수 있다.
Convolution 연산은 언제든 행렬 곱 연산으로 나타낼 수 있다.

Transpose Convoultion은 같은 행렬을 사용해서 행렬곱 연산을 수행하되 이 행렬을 Transpose시킴.
왼쪽은 기존의 stride1 conv이고 오른쪽은 stride1 transpose conv이다.

 

<Convolution as Matrix Multiolication(1D Example)> 43
stride=2인 경우에는 상황이 달라짐.
왼쪽은 stride2 conv를 행렬곱 연산으로 표현.
Stride>1인 경우에는 transpose convolution은 더이상 convolution이 아니다.
> 왜 아닌지는 conv이 어떤식으로 행렬처럼 표현되는지 생각해보면 알 수 있다.

이제 stride2 transpose convolution은 normal convolution과 근본적으로 다른 연산이 된다.
이것이 바로 Transpose Convolution이라는 이름이 붙은 이유.

질문: 왜 평균을 내지 않고 합하는지?
답변: 그냥 더하기만 하는 이유는 앞서 살펴본 transpose convolution 수식 때문
하지만 분면 sum은 문제가 될 수 있다. Receptive field의 크기에 따라서 magnitudes가 달라진다.
3x3 stride 2 transpose convolution을 사용하면 checkerboard artifacts가 발생하곤 한다.
최근 논문에선 4x4 stride 2 혹은 2x2 stride 2를 사용. 문제가 조금은 완화.

[개인 질문: magnitude란?]

질문: stride 1/2 convolution이라는 용어가 어떻게 생겨났는지?
답변: 본인의 논문에서 사용.

 

<Semantic Segmentation Idea: Fully Convolutional> 44
이런 Semantic Segmentation 구조는 상당히 일반적인 구조.
네트워크 내부에 downsampling/upsampling을 하는 거대한 convolution network가 있다.
downsampling은 strided conv나 pooling 사용
upsampling은 transpose conv 또는 다양한 종류의 unpooling or upsampling을 사용

그리고 모든 픽셀에 대한 cross-entropy를 계산하면 네트워크 전체를 end-to-end로 학습시킬 수 있다.

 

<Classification + Localization> 45
이미지가 어떤 카데고리에 속하는지 뿐만 아니라 실제 객체가 어디에 있는지를 알고 싶을 수 있다.
이미지 내에 cat이 어디에 있는지 네모박스를 그리는 것.
이는 Object Detection 문제와는 구별된다. -> localization 문제에서는 이미지 내에서 내가 관심있는 객체가 오직 하나뿐이라고 가정.
이미지 내에 객체 하나면 찾아서 레이블을 매기고 위치를 찾아낸다.

 

<Classification + Localization> 46
기존의 image classification에서 사용하던 기법들을 고스란히 사용 가능.
위의 예시는 AlexNet이며 입력 이미지가 있고 출력이 있다.
출력 레이어 직전의 FC-Layer는 "Class Score"로 연결되서 카테고리를 결정. 하지만 여기에서는 FC-Layer가 하나 더 있다. 이는 4개의 원소를 가진 Vector와 연결(x,y,w,h)->bbox

> 네트워크는 두 가지 출력값을 반환한다. 하나는 Class Score이고 하나는 입력 영상 내의 객체 위치의 Bounding box의 좌표.

 

<Classification + Localization> 47
이 네트워크를 학습시킬 때는 loss가 두 개 존재.
그리고 이 문제는 fully supervised setting을 가정(지도학습) -> 학습 이미지에는 카테고리 레이블과 해당 객체의 bounding box Ground Truth를 동시에 가지고 있어야 한다.

두 가지 Loss Function.
> Class Score를 예측하기 위한 Softmax loss
> Ground Truth BBox와 예측한 BBox 사이의 차이를 측정하는 loss
L2 Loss로 BBox Loss를 쉽게 디자인 가능.
이 Loss들은 모두 예측한 BBox와 Ground Truth BBox 좌표 간의 차이에 대한 regression loss

질문: 왜 Classification과 BBox Regression을 동시에 학습시키는 것이 왜 좋으며, 가령 오분류에 대해 BBox가 있으면 어떻게 되는지?
답변: 일반적으로는 괜찮다. 실제로 많은 사람들이 두 Loss를 동시에 학습시킨다. 하지만 간혹 오분류의 문제에서 까다로울 수 있다.
많이 사용하는 해결책 중 하나는 BBox를 딱 하나만 예측하지 않고 BBox를 카테고리마다 하나씩 예측. 그리고 Ground Truth 카테고리에 속한 예측된 BBox에만 Loss와 연결시킨다.

질문: 두 개의 Loss의 단위가 달라서 Gradient 계산에 문제가 될 소지가 있지 않은지?
답변: 이 두 개의 Loss를 합친 Loss를 Multi-task Loss라고 함. Gradient를 구하려면 네트워크 가중치들의 각각의 미분값(스칼라)을 계산해야 한다. 이제는 Loss가 두개인 미분값(스칼라)도 두개이고 이 두개를 모두 최소화시켜야한다. 실제로는 두 loss들의 가중치를 조절하는 하이퍼파라미터가 있다. 두 loss들의 가중치 합이 최종 loss이다. 그리고 이 두 loss들의 가중합에 대한 Gradient를 계산하는 것. 하지만 두 loss들간의 가중치를 결정하는 것은 상당히 까다롭다. 이 가중치는 하이퍼파라미터로써 우리가 설정해줘야하만 한다. 이 하이퍼파라미터는 지금까지 우리가 살펴본 하이퍼파라미터들보다는 상당히 까다롭다. 이 하이퍼파라미터는 실제로 손실함수의 값 자체를 바꿔버리기 때문.
지금까지는 하이퍼파라미터를 다양하게 조절하면서 loss가 어떻게 변하는지를 관찰했다. 하지만 이 경우에는 하이퍼파라미터의 값이 변하면 loss 자체의 속성이 변하므로 비교하기가 상당히 까다롭다. 조절하는 것이 상당히 어렵다.
일반적인 방법은 loss값으로 비교할게 아니라 다른 성능 지표를 도입하는 것. Cross Validation으로 하이퍼파라미터를 최적화할때 Loss가 아니라 실제 모델의 성능지표를 봐야할 것.

질문: 앞 쪽의 큰 네트워크는 고정시키고 각 FC-Layer만 학습시키는 방법은 어떤지?
답변: 시도할만하다. Transfer learning의 관점에서 보면 fine tune을 하면 항상 성능이 더 좋아진다. 실제로 사람들이 많이 하는 트릭 중 하나는 우선 네트워크를 Freeze하고 두 FC-Layer를 학습시킨다. 그리고 두 FC-Layer가 수렴하면 다시 합쳐서 전체 시스템을 Fine-tune하는 것.

[개인 질문: L1, L2 loss]

 

 

<Aside: Human Pose Estimation> 50
bbox와 같이 이미지 내의 어떤 위치를 예측한다는 아이디어는 다양한 문제에도 적용 가능
Human Pose Estimation 문제에서는 사람 이미지가 입력으로 들어감. 출력은 각 관절의 위치.
이 네트워크는 사람의 포즈를 예측.
이 문제를 풀기 위해서는 가령 일부 Datasets은 14개의 관절의 위치로 사람의 포즈를 정의.

 

<Aside: Human Pose Estimation> 51
네트워크의 출력은 각 관절에 해당하는 14개의 좌표값.
예측된 14개의 점에 대해서 regression loss를 계산하고 backprop으로 학습.
간단하게 L2 loss를 사용하기도 하고 다양한 regression loss들을 적용할 수 있다.

질문: regression loss?
답변: cross entroy나 softmax가 아닌 loss들을 의미. L1, L2, smooth L1 등이 있다. 
Classification과 Regression의 일반적인 차이점: 결과과 categorical인지 continuous인지 입니다.
> 가령 고정된 갯수의 카테고리가 있고 모델은 이를 결정하기 위한 클래스 스코어를 출력하는 경우라면, Cross entroy / sofrmax / SVM margin loss와 같은 것들을 사용할 수 있다.

 

<Aside: Human Pose Estimation> 52
> 반면 출력이 연속적인 값인 경우라면 (Pose Estimation에는 관절의 위치)
이런 경우에는 출력이 연속적인 값이기 때문에 다른 종류의 loss들을 이용해야 한다. L2, L1 등
regression output이 고정된 숫자(ex 14관절)의 경우라면 pose estimation과 같은 다양한 문제를 풀 수 있다.

<Object Detection> 53
강의에서는 Object Detection + Deep Learning에 관련한 주요 아이디어만 간단히 짚고 넘어간다.
Object Detection의 task는 입력 이미지가 주어지면 이미지에 나타나는 객체들의 bbox와 해당하는 카테고리를 예측.
> classfication + localization과 다름: 예측해야하는 bbox의 수가 입력 이미지에 따라 달라지기 때문
각 이미지에 객체가 몇개가 있을지 미지수(어려운 문제)

 

<Object Detection: Impact of Deep Learning> 54
해마다 Image Classfication의 성능이 얼마나 상승했는지 알 수 있다.
2013년 Deep Learning이 도입된 이후로는 매년 성능이 아주 빠르게 증가.

> Object Detection이 Localization과는 다르게 객체의 수가 이미지마다 다르다.

 

<Object Detection as Regresstion?> 56
좌측 상단의 고양이 이미지는 객체가 하나 뿐이다. 따라서 네트워크는 4개의 숫자만 예측하면 된다.
하지만 중간의 이미지에는 3개의 객체가 있다. 각 bbox마다 좌표 4개씩 총 12개의 값을 예측해야 한다.
마지막 오리 사진의 경우에는 오리 한 마리 당 값이 4개씩 아주 많은 값을 예측해야 한다.

> 따라서 Object Detection 문제로 Regression 문제를 풀기란 상당히 까다롭다.

 

<Object Detection as Clsaafication: Sliding Window> 57
Sliding Window를 이용하려면 입력 이미지로부터 다양한 영역을 나눠서 처리.
가령 이미지의 왼쪽 밑에서 작은 영역을 추출해서 그 작은 영역만 CNN의 입력으로 넣는다.
CNN은 이 작은 영역에 대해서 Classfication을 수행. 네트워크가 배경이라고 예측했다면 이곳은 어떤 카테고리에도 속하지 않는다는 것을 의미.

 

<Object Detection as Clsaafication: Sliding Window> 58
다른 영역을 추출해보자. 여기에는 개는 있고 고양이는 없고 배경은 아닙니다.


<Object Detection as Clsaafication: Sliding Window> 59
또 다른 영역을 추출해보면 이곳에도 개는 있고 고양이는 없고 배경도 없습니다.

<Object Detection as Clsaafication: Sliding Window> 60
또 다른 영역에서는 개는 없고 고양이는 있고 배경은 없다.

> 그렇다면 이 방법의 문제는 무엇일까요?
>> 어떻게 영역을 추출할지가 문제!
이미지에 Objects가 몇개 존재할지 어디에 존재할지 알 수 없다. 그리고 크기가 어떨지도 알 수 없다. 또한 어떤 종횡비로 표현해야할지도 모른다.
따라서 이런 brute force 방식의 sliding window를 하려면 너무 많은 경우의 수가 존재.
즉, Object Detection문제를 풀려고 brute force sliding window를 하는 일은 절대 없다!

<Region Proposals> 62
대신에 Region Proposals이라는 방법이 있다. 사실 이 방법은 Deep Learning을 사용하지는 않는다.
전통적인 신호처리 기법을 사용(Faster-RCNN RPN 아님)
Region Proposal Network는 Object가 있을법한 가령, 1000개의 bbox를 제공해준다.
이미지 내에서 객체가 있을법한 후보 region proposals을 찾아내는 다양한 방법(edges, etc)이 있겠지만 Region Proposal Network는 이미지 내에 뭉텅진(blobby) 곳들을 찾아낸다.
Region Proposal을 만들어낼 수 있는 방법에는 Selective Search가 있다.
> Selective Search은 2000개의 Region Proposal을 만든다. 이 방법은 노이즈가 아주 심하다. 대부분은 실제 객체가 아니지만 Recall은 아주 높다. 따라서 이미지에 객체가 존재한다면 Selective Search의 Region Proposal안에 속할 가능성이 높다.

다음은 Region Proposal Network를 적용하고 객체가 있을법한 Region Proposal을 얻어낸다. 그리고 이 Region Proposals을 CNN의 입력으로 한다. 이를 사용하면 계산량 다루기 수월해진다. 모든 위치와 스케일을 전부 고려하는(brute force)방법보다는 낫다.

 

<R-CNN> 67
지금까지 언급한 아이디어가 모두 R-CNN이라는 논문에 등장.
이미지가 주어지면 Region Proposal을 얻기 위해 Region Proposal Network를 수행.
Region Proposal은 Region of Interest(ROI)라고 한다. Selective Search를 통해 2000개의 ROI를 얻어낸다.

하지만 여기에서는 각 ROI의 사이즈가 제각각이라는 점이 문제가 될 수 있다. 추출된 ROI로 CNN Classification을 수행하려면 FC-Layer 등으로 인해서 같은 입력사이즈로 맞춰야 한다.
따라서 Region proposals을 추출하면 CNN의 입력으로 사용하기 위해서는 동일한 고정된 크기로 변형시켜야 한다.
다시말해 Region proposal을 추출하면 고정된 사이즈로 크기를 바꾼다.

그리고 각각의 Region Proposals을 CNN에 통과. R-CNN의 경우에는 ROI들의 최종 Classfication에 SVM을 사용.
슬라이드에는 없지만 R-CNN은 Region Proposals을 보정하기 위한 Regression 과정도 거친다.
> 왜? Selective Search의 Region Proposals이 대게는 정확하지만 그렇지 못한 경우도 있기 때문.
R-CNN은 bbox의 카테고리도 예측하지만 bbox를 보정해줄 수 있는 offset값 4개도 예측.
이를 Multi-task loss로 두고 한 번에 학습.

질문: 종횡비(aspect ratio)가 변함에 따라 정확도에 얼마나 영향을 미치는지?
답변: 정확한 답변이 어렵다. 

질문: ROI가 사각형이어야할 이유
답변: 사각형이 아닌 것들의 크기를 조정(warp)하기는 까다롭다. Instant Segmentation의 경우에는 Proposals이 사각형이 아닌 경우도 있다.

질문: Region Proposals이 학습되는가?
답변: R-CNN의 Region Proposals은 전통적인 방식을 사용. R-CNN에서 Region Proposal을 학습시키지는 않는다. 고정된 알고리즘을 쓴다.(Selective Search)

질문: offsets이 항상 ROI의 안쪽으로만 작용할 수 있나?
답변: 그래서는 안된다. 가령 현재 Region Proposals이 사람을 잡았는데 머리를 빼먹었다고 생각해보면 네트워크는 "사람이야. 근데 머리가 없네. 사람은 머리가 있어야해"라고 추론하면서 bbox를 조금 더 위로 올릴 수도 있어야한다. 따라서 예측한 bbox의 offse이 bbox의 외부로 향하기도 한다.

질문: 수많은 ROI들 중에서 실제 객체를 포함하지 않는 ROI들은 어떻게 해야하나?
답변: 카테고리에 배경클래스를 추가. 객체가 없는 ROI는 배경이라고 예측.

질문: 필요한 데이터가 무엇?
답변: 이 Task는 Fully Supervised이다. 따라서 학습데이터에는 이미지 내의 모든 객체에 대한 bbox가 있어야 한다. 학습데이터에 bbox ground truth가 일부만 혹은 아예 없거나 노이즈가 심한 경우 어떻게 학습할지에 대한 논문들도 있다. 하지만 일반적인 상황에서는 Train time에 Fully Supervision이 있다고 가정.

 

<R-CNN: Problems> 68
R-CNN 프레임워크에는 많은 문제가 있다.
*오른쪽 그림에 bbox reg가 보임
계산 비용이 높다.
2000개의 region proposals이 있고 각각이 독립적으로 CNN의 입력으로 사용됨.
학습이 되지 않는 Region Proposal은 앞으로 문제가 될 소지가 많다.
학습 속도 느리다.

R-CNN 구현을 살펴보면 CNN에서 나온 Feature를 디스크에 dumping -> 용량이 매우 크다.
이미지당 2000개의 ROIs를 Foward/Backward pass를 수행
(논문에서는 전체 학습시간이 81시간 소요)
각 Region Proposals마다 CNN을 수행해야하므로 수천번의 forward passes가 요구됨 -> 매우 느리다(test time: 이미지당 30초)

 

<Fast R-CNN> 71
Fast R-CNN에서는 각 ROI마다 각각 CNN을 수행하지 않는다. 전체 이미지에 CNN을 수행.
그 결과 전체 이미지에 대한 고해상도 Feature Map을 얻을 수 있다.
여전히 Selective Search같은 방법으로 Region Proposals을 계산
> CNN Feature map에 ROI를 Projection 시키고 전체 이미지가 아닌 Feature map에서 뜯어온다.
이제는 CNN의 Feature를 여러 ROIs가 서로 공유가능.

 

<Fast R-CNN> 72
FC-Layer는 고정된 크기의 입력을 받는다.
따라서 CNN Feature Map에서 뜯어온 ROI는 FC-Layer의 입력에 알맞게 크기를 조정해줘야 한다.
학습이 가능하도록 미분가능한 방법을 사용해야한다. 이 방법이 바로 ROI Pooling layer.

 

<Fast R-CNN> 74
Featur Map에서 뜯어낸 ROI의 크기를 조정하고(warped)나면 FC-Layer의 입력으로 넣어서 Classification Score와 Linear Regression Offset을 계산할 수 있다.

<Fast R-CNN> 75
Fast R-CNN을 학습할 때는 두 Loss를 합쳐 Multi-Task Loss로 Backprop를 진행.

<Fast R-CNN> 76
이 방법을 통해 전체 네트워크를 합쳐서(jointly) 동시에 학습시킬 수 있다.

<R-CNN vs SPP vs Fasr R-CNN> 78
R-CNN과 Fast R-CNN을 비교. SPP Net도 함께.
Train time에는 Fast R-CNN이 10배 가량 빠름.
> Fast R-CNN은 Feature map을 서로 공유하기 때문

<R-CNN vs SPP vs Fasr R-CNN> 79
Test time에는 Fast R-CNN은 정말 빠르기 때문에 Region Proposal을 계산하는 시간이 대부분.
Region Proposal을 계산한 이후 CNN을 거치는 과정은 모든 Region Proposals이 공유하기 때문에 1초도 안 걸림.
> 따라서 Fast R-CNN은 Region Proposal을 계산하는 구간이 병목구간.
>>Faster R-CNN이 이를 해결

<Faster R-CNN> 80
Faster R-CNN은 네트워크가 region proposal을 직접 만들 수 있다.
입력 이미지 전체가 네트워크로 들어가서 Feature Map을 만든다.
Faster R-CNN은 별도의 Region Proposal Network(RPN)가 있다.
RPN은 네트워크가 Feature Map을 가지고 Region Proposal을 계산하도록 한다.
RPN을 거쳐 Region Proposal을 예측하고 나면 나머지는 Fast R-CNN과 동일.
Conv Feature Map에서 Region Proposals을 뜯어내고 이들을 나머지 네트워크에 통과시킨다.
그리고 multi-task loss를 이용해서 여러가지 loss들을 한 번에 계산.
4개의 loss들을 한 번에 학습. 이 loss들의 균형을 맞추는 것은 사실 조금 까다롭다.

RPN에는 2가지 Loss가 있다. 한 가지는 이곳에 객체가 있는지 없는지를 예측.
나머지 loss는 예측한 bbox에 관한 것.

최종단에서도 두 개의 loss가 있다.
하나는 Region Proposals의 Classfication을 결정.
남은 하나는 bbox Regression입니다. 앞서 만든 Region Proposal을 보정해주는 역할.

질문: Multi-task Learning이 얼핏 보면 Regularization처럼 보이는데 그런 효과가 있는가?
답변: 그런 식의 controlled study가 있는지는 모른다. Original Faster R-CNN 논문의 몇 가지 실험
> region proposal network의 두 가지 loss를 합쳐서 학습하거나 나눠서 학습하면 성능이 어떻게 달라지는지,
RPN과 Classficaition Network를 분리하면 성능이 어떻게 변하는 지 실험하지만 엄청 큰 차이는 없다.
하지만 실제로 통짜로 학습. 계산량이 가장 적기 때문.

질문: 어떻게 Region Proposal Network GT가 없는데 어떻게 RPN을 학습시키는가?
답변: 자세하게 설명하지 않겠다. 간단한 설명을 하면 ground truth objects와 일정 threshold 이상 겹치는 proposal이 있을 것. 이런 region proposal은 positive라고 예측. 반면 GT object와 조금만 겹치는 proposal은 negative라고 예측. 하지만 여기에는 다양한 하이퍼파라미터가 많기 때문에 자세한 설명은 생략.

질문: Region proposal network의 Classfication loss가 무엇?
답변: 간단히 말하면 RPN은 Binary Classfication을 수행. RPN은 Region proposal 후보들에 대해서 각각을 binary decision한다. Region 안에 객체가 존재하는 지 아닌지를 결정한다. 따라서 Loss는 Binary Classfication Loss이다.

 

<Faster R-CNN> 81
빨라진 가장 큰 이유는 네트워크 밖에서 계산했던 Region proposal의 병목을 제거했기 때문.
흥미로운 점은 Region Proposals 자체도 학습되었기 때문에 RPN과 우리의 새로운 데이터 사이의 간극이 존재할 수도 있다.
이 경우에는 새로운 데이터에 맞게 region proposal을 새롭게 학습시키면 된다.

R은 Region을 뜻함.
R-CNN 계열 네트워크들은 후보 ROIs마다 독립적으로 연산을 수행(FC-Layer)
R-CNN 계열의 네트워크들을 region-based method라고 한다.

 

<Detection without Proposals: YOLO / SSD> 82
Object Detection에는 다른 방법도 있다.
Feed forward를 오로지 한 방향으로 수행하는 네트워크들.
그 중 하나가 YOLO(You Only Look Once)
다른 하나는 SSD(Single Shoe Detection)

이들의 주요 아이디어는 각 Task를 따로 계산하지 않고 하나의 regresstion 문제로 풀어보자는 것.
거대한 CNN을 통과하면 모든 것을 담은 예측값이 한 번에 나온다.
입력 이미지가 있으면 이미지를 큼지막하게 나눈다. 가령 7x7 grid로 나눌 수 있다.
각 grid cell 내부에는 base bbox가 존재.
이 경우에는 base bbox가 세 가지 있다. (실제는 세 개 이상 사용)
grid cell에 대해서 bbox들이 있고 이를 기반으로 예측을 수행.

우선 하나는 bbox의 offset을 예측할 수 있다. 실제 위치가 되려면 base bbox를 얼만큼 옮겨야 하는 지를 뜻함.
그리고 각 bbox에 대해서 classfication scroes를 계산해야 함.
이 bbox 안에 이 카테고리에 속한 객체가 존재할 가능성을 의미.
네트워크에 입력 이미지가 들어오면 7x7 Grid마다 (5B+C)개의 tensor를 가진다.
(B는 base bbox의 offset(4개)와 confidence score(1개), C는 C개의 카테고리에 대한 Classfication score)

정리하면 네트워크 입력은 이미지이고 출력은 3-dim tensor입니다.

 

<Detection without Proposals: YOLO / SSD> 83
그리고 이를 거대한 CNN으로 한 번에 학습.
지금까지 알아본 방법들(YOLO/SSD)은 "Single Shot Methods"입니다.
후보 base bboxes와 GT Objects를 매칭시키는 방법

하지만 가만보면 Faster R-CNN에서 쓰는 RPN이 이와 유사.
> 결국은 둘 다 Regression + Classfication 문제를 푸는 것.
Faster R-CNN은 PRN으로 먼저 Regression 문제를 풀고 ROI 단위로 Classfication을 하는 방식.
반면 single shot methods는 단 한 번에 forward pass만으로 끝내버린다.

[개인 질문: Faster R-CNN은 PRN으로 먼저 Regression 문제를 풀고 ROI 단위로 Classfication을 하는 방식. 왜?]

 

<Object Detection: Lots of variables...> 84
Object Detection 문제에는 다양한 요소들이 있다.
다양한 base networks 적용해 볼 수 있다(VGG, ResNet등)
다양한 아키텍쳐를 선택할 수 있다.
이미지 크기를 몇으로 할지. Region Proposals 몇 개로 할 지 등등 매우 다양함.

Faster R-CNN 계열의 Region based methods는 정확도가 높긴 하나 single shot methods보다는 속도가 느리다
> Single shot methods는 ROI당 별도의 연산을 요구하지 않기 때문.

<Aside: Object Detection + Captioning = Dense Captioning> 85
각 Region에 대해서 카테고리를 예측하는 것이 아니라 각 Region의 Caption을 예측해야 한다.
각 Region에 Caption이 있는 데이터셋이 있어야 한다.
이 모델을 end-to-end로 학습시켜서 이 모든 것을 동시에 예측할 수 있도록 만들었다.
이 네트워크는 Faster R-CNN과 방식이 유사하다. 네트워크에는 Region Proposal stage가 있다.
그리고 예측한 bbox 단위로 추가적인 처리를 한다.
Caption을 예측해야하므로 SVM이나 Softmax loss를 사용하지 않고 RNN Language Model 도입.

이걸 보여준 이유는 다양한 문제들을 서로 묶어서 문제를 풀 수 있다는 것을 보여주기 위해.
앞서 본 Dense Captioning을 이미 다룬 Object Detection이나 Image Captioning의 요소들을 재활용할 수 있다는 뜻.
두 네트워크를 합쳐서 end-to-end로 학습시킴으로써 여러분의 문제를 해결해 볼 수 있을 것.

 

<Instance Segmentation> 88
입력 이미지가 주어지면 객체별로 객체의 위치를 알아내야 한다. Object Detection과 유사.
하지만 객체별로 bbox를 예측하는 것이 아니라 객체별 Segmentation Mask를 예측해야 한다.
이미지에서 각 객체에 해당하는 픽셀을 예측해야 하는 문제.
Instance Segmentation은 Semantic Segmentation과 Object Detection을 합친 것.
Objecte Detection 문제처럼 객체별로 여러 객체를 찾고 각각을 구분해줘야 한다.
예를 들어 우측의 이미지처럼 두 마리의 개가 있다면 두 마리를 구별해야 한다.
그리고 각 픽셀이 어떤 객체에 속하는지를 전부 다 결정해줘야 한다.

<Instance Segmentation> 89
Mask R-CNN 논문. Faster R-CNN과 유사함.
처음 입력 이미지가 CNN과 RPN을 거친다. 여기까지는 Faster R-CNN과 유사.
그리고 Fast/Faster R-CNN에서 했던것처럼 특징맵에서 RPN의 ROI만큼을 뜯어낸다(Project)
그 다음 단계는 Faster R-CNN에서처럼 Classfication/bbox regression을 하는 것이 아니라 각 bbox마다 Segmentation mask를 예측.
RPN으로 뽑은 ROI 영역 내에서 각각 Semantic Segmentation을 수행.
Feature Map으로부터 ROI Pooling(Align)을 수행하면 두 갈래로 나뉜다.
상단에 보이는 첫 번째 갈래는 Faster R-CNN과 유사하게 생김. 각 Region Proposal이 어떤 카테고리에 속하는지 계산. 그리고 Region Proposal의 좌표를 보정해주는 bbox Regression도 예측.
그리고 하단의 두 번째 갈래는 Semantic Segmentation을 위한 미니 네트워크같이 생겼다. 각 픽셀마다 객체인지 아닌지를 분류.

Mask R-CNN은 오늘 배운 모든 방법들을 전부 통합

<Mask R-CNN: Very Good Results!> 90
놀라운 결과를 보여준다.
왼쪽 사진을 잘 보면 배경 먼 곳에 군중들도 Segmentation한 것을 알 수 있다.

<Mask R-CNN Also dose pose> 91
Mask R-CNN으로 Pose Estimation도 가능.
사람들의 관절의 좌표를 예측하는 부분을 추가하면 된다.
Mask R-CNN 하나로 Objecte Detection, Pose estimation, Instance segmentation이 가능
Pose Estimation을 위해선 각 Region Proposals 갈래 하나를 추가해서 현재 Region Proposal 안의 객체의 관절에 해당하는 좌표를 예측하도록 하면 된다. 이를 위해선 Loss와 Layer를 하나 더 추가하면 된다. Multi-task Loss에 Loss가 하나 더 추가되는 것.
이렇게 갈래를 하나 추가시키고 한 번에 학습시킨다.

 

<Mask R-CNN Also dose pose> 92
그러면 위와 같은 결과를 얻을 수 있다.
Feed forward 한 번으로 이미지 내에 사람이 몇 명 있는지 어디에 있는지 어떤 픽셀에 해당하는지 알 수 있다.
사람들의 Skeleton Estimation도 가능
Faster R-CNN 프레임워크 기반이기 때문에 실시간에 가깝게 처리할 수 있다.
이 모든 것이 Forward pass 한 번으로 수행되므로 GPU에서 1초에 5장 정도 처리 가능.

질문: 데이터가 얼마나 많이 필요한가?
답변: 이 Instant Segmentation은 MS COCO 데이터셋으로 학습시킨 결과이다. 200,000개 정도 데이터. 80개의 카테고리. MS COCO 데이터셋 이미지에는 모든 사람 객체들의 관절에는 그 위치가 표시되어 있다.

 

<Recap> 93
여러 가지 Computer Vision Task를 배움.
그리고 Image Classfication의 방법론들을 다른 Task에서 어떻게 활용할 수 있는지 배움.

LIST
댓글