CS231n(Lecture7~12)
2020년 하반기 가짜연구소의 메인 스터디로 참여자로 스탠포드대학에서 발표한 CNN 강의영상을 듣고 자료를 정리 했습니다. 자료의 사진과 code는 모두 CS231n 강의자료를 참조하였습니다.
Last updated
2020년 하반기 가짜연구소의 메인 스터디로 참여자로 스탠포드대학에서 발표한 CNN 강의영상을 듣고 자료를 정리 했습니다. 자료의 사진과 code는 모두 CS231n 강의자료를 참조하였습니다.
Last updated
지난 CS231n 6강을 간단히 복습하면 Neural network(NN)에서 최적화 해결방법에 대한 소개가 나왔다. 이외에도 하이퍼파라미터를 찾기 위한 grid search 와 random search 도 다뤘다.
이번 7장에서는 6장에 이어서 최적화와 정규화, 배치 정규화를 통해 drop out 기법에 대해 상히 알아보겠다.
SGD는 batch 단위로 끊어서 데이터 loss를 계산하고 gradient descent의 방향으로 파라미터를 업데이트한다. 하지만 그림에서와 같이 gradient의 방향이 매우 크게 튀면서 지그재그 형태로 이동하다보니 굉장히 속도가 느리고 비효율적인 단점이 있다.
Local minima는 순간적으로 기울기가 0이 되어 컴퓨터가 최적점을 찾은줄 착각하여 중간에 계산을 멈춘 것이다. Saddle point도 마찬가지로 컴퓨터가 순간적으로 기울기가 0인 가 지점을 찾은줄 알고, 연산을 멈춰버린 것이데, 고차원에서 주로 saddle point가 발생한다. 이는 gradient 값이 작아 업데이트가 느리게 진행되기 때문이다. 또한 미니배치로 gradient를 업데이트 하면 부정확한 값을 추정하기에 이 문제를 개선하고 모멘텀(momemturm)이 등장한다.
기울기가 0인 지점에 빠지더라도 가속도로 탐색을 진행하도록 SGD에서 grident 계산시 속도(velocity)를 추가하는 방법인다. 위의 code를 보면 vx가 속도를 나타내고, rho는 마찰계수다. (보통 0.9~0.99로 맞춤)
SGD와 비교시 파랑색 선이 더 부드럽게 이동하는 것을 확인할 수 있다. 즉 Momemtum은 loss에 덜 민감하여 수직 방향의 변동을 줄이고 수평 방향의 움직임을 점차 가속화하 노이즈를 줄여 SGD보다 local minima와 saddle points 에서도 더 안전한다. 이외에도 Nesterov Momemtum 이라는 방법이 있다.
이 방법은 SGD Momemtum에 계산 순서를 바꾼 방법으로, 기존 방법은 gradient를 계산하고 velocity와 합쳤지만, Nesterov는 velocity 방향으로 먼저 움직인 후 gradient를 계산한다.
Nesterov 는 convex optimization에서 굉장히 뛰어난 성능을 나타내지만, 고차원에서의 deerp 러닝에서는 none-convex가 많아 뉴럴 네트워크(NN)에서 성능이 좋지 않다.
AdaGrad는 매개변수를 갱신하는 알고리즘으로 training 중에 gradient를 활용하는 방법이다.
모멘텀이 velocity를 이용했다면, AdaGrad는 grad squared term을 이용한다. 코드를 보면 학습 도중에 계산 되는 gradient를 제곱해서 더해주고, 업데이트 할 때 앞서 계산한 gradient 제곱근 항으로 나눠준다. 아래 그림을 보면 빨간색으로 밑줄 부분이 업데이트할때 제곱은 항으로 나눠주는 부분이다.
AdaGrad는 step을 진행할수록 값이 점점 작아지다보니 속도가 느려진다. AdaGrad도 convex 한 경우 minimum에 서서히 속도를 줄여서 수렴하여 좋지만, Non convex에서는 saddle point에 걸려 멈추는 문제가 생겨 업데이트가 되지 않는다. NN을 학습시킬 때 AdaGrad를 잘 사용하지 않는다.
속도가 줄어드는 문제를 해결하기 위해 RMSProp라는 방법이 나온다. AdaGrad의 gradient 제곱항을 그대로 사용하지만, decay_rate(보통 0.9~0.99로 설정)를 곱해준다. 그리고 gradient 제곱은 (1-decay_rate)를 곱해주고 더해준다. 이렇게 하면 step의 속도를 효율적으로 가속/감속 시킬 수 있다고 한다.
모멘텀과 Ada를 합친 Adam은 더 최적화된 방법으로, 코드를 보면 First moment와 second moment를 이용해 이전 정보를 유지하고(모멘텀 방), AdaGrad나 RMSProp처럼 gradients의 제곱을 이용하는 방법이다. 마치 모멘텀과 RMSprop를 합친것과 유사하다. 그런데 초기 step에서 second_moment를 0으로 설정해 초기 step이 엄청 작아지는 문제가 발생될 수 있다. 그래서 Adam은 값이 튀지 않도록 보정항(bias)을 추가했다(1e-7는 나누는 값이 0이 되는 것을 방지한다).
그림을 보면 Adam이 가장 효과적이고 실제로 많이 사용된다.
지금까지 우리는 loss를 최소하며 training과 validation간의 차이를 줄이는 오버피팅 문제 해결하기위해 optimization 알고리즘을 알아보았다.
최적화를 마친 상황에서 새로운 데이터를 접했을 때 성능을 올리기 위한 방법에 대해 알아보겠다.
가장 빠르고 쉬운 방법으로 Ensemble 방법이 있다.
다수개의 모델을 만들어 훈련시키고 다수의 모델 결과의 평균을 이용하는 방법이다.
모델 성능이 90% 이상대로 가면 1~2% 올리는게 쉽지 않은데, 이때 보통 앙상블을 많이 사용한다.
다른 방법으로, 모델을 독립적으로 학습시키지 않고, 학습 도중 모델을 snapshot하고 앙상블을 사용할 수 있다. 그리고 test에서 여러 snashot에 나온 예측값을 평균을 내어 사용한다.
즉 앙상블을 사용하면 다수의 모델을 만들어 내는데 시간이 걸려, 한 모델안에서 10개의 구간을 두고 앙상블처럼 사용하는 방법이다. 위 그림을 보면 train loss가 반복적으로 증감하는데, 이는 learning rate를 반복적으로 조절해 손실함수에 다양한 지역에서 수렴하도록 위해서다.
다음은 앙상블을 사용하지 않고 단일 모델 성능을 향상시킬 수 있는 방법으로 정규화(Regularization)을 소개하겠다. 앞에서 L1과 L2에 대해 배웠지만 뉴런 네트워크에서 잘 사용하지 않는다. 그래서 나온 방법이 Dropout이다.
forward pass 과정에서 일부 뉴런을 0으로 만드는 방이다.
forward pass iteration 마다 모양이 바뀌는데, 현재의 activatons의 일부를 0으로 만들어 다음 레이어의 일부가 0과 곱해지게 하는 것이다. Dropout의 특징은 상호작용을 방지하는 것이다.
예를들어 그림에서 고양이를 예측 할때 다양한 feature를 이용할 수 있도 하여 오버피팅을 방지해준다.
이외에도 Data Augmetation이라는 방법이 소개된다. 학습 시 이미지를 조금씩 임의로 변하여 데이터를 최대한 많이 확보하는 방법이다.
너무 내용이 길다보니 이만 소개하겠다. 자세한 방법은 CS231N 내용을 참고하길 바란다.
8강은 딥러닝 프레임워크에 대한 소개다. 내용상 중요한게 많지않아 대부분 생략하고 알아둬야 할 것들만 기재하겠다.
컴퓨터의 뇌와같은 CPU(Central Processing Unit) 는 기억,해석,연산,제어를 수행한다.
CPU는 적은 core수로 연속적인 작업을 처리한다. 반면 컴퓨터 그래픽 rendering하기 위해 GPU(Graphics Processing Unit)는 많은 core로 병렬로 수행하고, 내부적으로 RAM을 사용한다. GPU는 communicationd을 생각해줘야한다. data를 읽을때 종종 Bottleneck이 발생한다.
병목현상은 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상으로 한 번에 처리할 수 있는 데이터의 양보다 처리할 수 있는 능력이 충분하지 않을 경우 발생한다.
Tensorflow
텐서플로우는 Neural Network를 먼저 정의하고 run을 통해 training 시켜야 한다. 특징은 Graph가 static하고, 모델을 구성하면 재사용이 쉽고, 최적화 과정을 진행할 수 있다.
코드를 리뷰하면 처음 Neural Net을 만들고, placehorder에 input과 weight를 넣어준다. 다음 Xavier에 의해 weight의 초기화 값을 설정한 후, y_pred에 의해 자동적으로 weight를 갱신하도록 한다.
optimizer를 이용해 gradient를 계산하고 loss 가 최소화되도록 업데이트한다.
부분 이후에 실제 data값을 넣어주고, training 시키는 과정이다.
keras는 Tensorflow에서 제공하는 high-level-wrapper로 간결한 API를 제공하며, 일반적인 유스케이스에 필요한 사용자의 조작을 최소화 하고, 오작동에 대한 명확하고 실용적인 피드백을 제공한다. 또한 tensorflow보다 코드가 쉽다.
pytorch는 3가지 abstraction이 있다.
tensor : 다차원배열로 GPU에서 run 될 수있도록 하는 일종의 numpy 배열
variable : computational graph의 노드중 하로 데이터와 gradient 저
module : neural network의 layer, state와 학습 가능한 weight를 저
pytorch는 tensorflow와 다르게 graph가 dynamic 하다. 또한 forwar pass시 그래프를 다시 구성하여 학습시킬때마다 새로운 그래프를 그린다. 이외에도 optimizer를 이용해 learning rate를 쉽게 설정할 수 있다.
9강에서는 imagenet에서 좋은 성적을 거둔 AlexNet, VGG, GoogLeNet, ResNet 모을 소개한다.
CNN 모델은 1998년 Convoulution Net 개념이 도입된 모델인 LeNet에서 시작되었다.
이후 2012년, Alexnet 모델이 등장하면서 오차율이 줄어들었고, Alexnet 이후로 CNN 모델이 발전하게 되었다.
2012년에 도입된 AlexNet는 최초의 Large scale CNN 모델이다.
기본구조는 Convolution layer, Max Pooling Layer, Normaliztion이 2번 반복된 다음, 3번의 Convolution layer, 1번의 MaxPooling을 거친 후, 3번의 Fully Connected Layer가 나온다.
당시 당시 GPU 메모리가 32GB 한계로 모델을 두 파트로 나누어 계산했다.
1번째에서는 convoution layer 15 에서는 feature map만 학습하게 되어있고, 2번째에는 convoulution 3, Fully Connected 6~8 GPU간 통신ㅇ르 허용해 이전 layer의 모든 input으로 featuremap을 참고하여 학습한다.
AlextNet의 특징은 LeNet보다 layer가 많. 또한 AlexNet은 ReLU, 정규화로 Dropout, 최적화로 SGD momentum을, Enseomble 기법을 적용했다.
강의에서는 output volume size를 구하는 방법을 소개하는데 자세한 부분은 영상을 참고하길 바란다.
아웃풋 볼륨 사이즈에 대한 강의영상을 간단하게 정리하면 입력이미지가 227 * 227 * 3이미지로 들어와 conv 필터와 연산을 거쳐(총 96개 의 필터) 출력이미지가 55*55*96이 된다. 이때 파라미터 개수는 11*11*3*96으로 348348이다.
2014년 Simonyan과 Zisserman이 만든 VGGNet은 이전모델보다 네트워크가 더 깊고 3*3의 작필터를 사용했다. layer가 깊어진 만큼 레이어 갯수가 많아지고, 작은필터를 사용하면 Depth를 더 키울 수 있다.
3 x 3 필터를 여러 개 쌓으면 7 x 7 필터를 사용하는 것과 실질적으로 동일한 Receptive Field를 가진다. Receptive Field은 filter가 한번에 볼 수 있는 입력의 Spatial area이다. (출력 레이어의 뉴런 하나에 영향을 미치는 입력 뉴런들의 공간 크기).
2014년도 ImageNet Challenge에서 Google의 GoogLenet 다음으로 성능이 우수하고 강력한 네트워크를 가지고 있다.
VGGNet의 네트워크는 AlexNet과 비슷한 패턴으로 Conv Layer와 Pooling Layer가 반복적으로 진행되는 패턴이다. 즉. 다른 데이터에서도 특징(feature) 추출이 잘되며 다른 Task에서도 일반화 능력이 뛰어나다.
2014년 Classification Challenge에서 우승한 GoogLeNet은 22개 층으로 네트워크는 더 깊어졌고 연산 효율은 증가했다. GoogLeNet은 Inception module을 여러개 쌓아서 만들었고, 파라미터를 줄이기 위해서FC-Layer가 없앴다. Inception module 개념에 대해서 다음 블로그 글씨 클릭 참조하길 바란다.
inception module 내부에는 다양한 필터들이 병렬로 존재한다. conv연산을 나중에 depth 방향으로 concatenate하는것이다.
그런데 레이어를 거칠때마다 Depth가 늘어나고, Pooling의 출력은 이미 입력의 Depth와 동일한 문제가 발생한다. 즉 계산량이 커지는 문제를 해결하기 위해 bottleneck block"(1*1conv)을 사용했다. . Conv 연산을 수행하기에 앞서 입력을 더 낮은 차원으로 보내 계산 복잡도를 줄인다.
layer가 깊어 gradient vanishing 문제가 발생할 수 있기에 중간에 보조 분류기(auxiliary classfication)을 둔다. 보조분류기는 일종의 mini network로 대표적으로 Average pooling가 있다.
2015년에 이미지 대회를 휩쓸었 ResNet(Residual Network)은 깊은 네트워크(152개 layer)를 가지고 있고, residual connection(skip connection, short cur) 을 사용한다.
모델이 깊어질 수록 최적화가 어려워 성능이 저하되는 문제가 발생한다.
그래서 얕은 네트워크를 가져와 input을 output으로 내보내는 identiy mapping을 이용했다.
오른쪽 그림과 같이 residual block 안에 identity mapping 을 사용해 출력단으로 보내고 실제 layer는 그 안에서 추가된 F(x) 변화량만 학습한다. 따라서 최종 출력값은 input X + 변화량(F(x)) 가 된다.
따라서 ResNet에서는 residual block으로 구성된 추가 layer를 깊게 쌓았다. 기본구조는 VGG Net에서 가져왔으나, 모든 residual block은 3x3 conv 2층을 가진다. 주기적으로 필터수를 2배씩 늘려주고, feature map 의 spatial dimension을 줄일 땐 pooling이 아닌 stride=2를 적용했다. 필터수를 늘린 이유는 feature map의 spatial dimension을 줄이면서 depth를 대신 늘려 layer 간 연산의 time complexity를 비슷하게 유지하려고 했다고 한다. parameter 수를 줄여 연산량을 낮추기 위해 마지막 FC layer를 없애고, Global Average Pooling을 사용해 FC layer 하나만 갖게한다.
ResNet의 추가적인 특징을 살펴보면 다음과 같다.
Conv layer 다음 Batch Normalization(BN)을 사용한다.
초기화는 Xavier를 사용하는데 2로 나눈 것을 쓴다. 이렇게 하면 SGD+Momemtum에서 좋은 성능을 가진다.
learning rate 는 0.1로 설하고 loss가 줄어들지 않도록 조금씩 줄여준다.
dropout은 사용하지 않는다.
weight decay는 1e-5 이다.
2017년 기준으로 모델 성능을 비교했을 GoogleNet과 ResNet을 결합한 모델이 가장 좋은것을 확인할 수 있다.(원의크기 메모리 크기 , x축: 연산량, y축: 성능(정확도))
VGG : 기장 많은 메모리를 요구하고 연산량도 많다.
GoogleNet : VGG와 비교해서 성능은 비슷하지 메모리와 연산량을 줄였다.
AlexNet : 연산량은 적고 성능도 낮다. 메모리또한 많이 요구된다.
ResNet : 메모리나 연산이 중간이고 성능이 제일 좋다.
10강에는CNN과 함께 많이 사용되는 RNN에 대해 소개한다.
RNN은 주로 Sequential 데이터 시계열데이터에서 주로 사용되고, 보통 주식, 공장, 비디오, 문자 등 다양한하게 쓰인다.
이전수업인 CNN 하나의 입력을 넣으면 하나만 출력되는 구조(one to one)였지만 나의 입력 혹은 여러개의 입력을 넣었을때 다양한 출력값이 생성되는구조인(one to one, one to many, many to one, many to many) Recurrent Neural Network(RNN)에 대해 알아본.
RNN은 주로 입력이 많거나 출력이 다양한 가변적인(sequential) 데이터를 수용한 모델로서 위의 구조를 간단히 정하면 다음과 같다.
one-to-many : 이미지 입력은 하나이고 그 입력에 대한 설명하는 여러 결과를 만드는 image captioning에서 쓰인다.
many-to-one : 연속적인 단어를 입력했을 때 하나의 결과를 출력하는 sentiment classification 중 감정분석, 뉴스 카테고리에서 쓰많이 사용하는 방식이다.
many-to-many : 중간에 hidden state가 많고 문장을 입력했을 때 다양한 문장을 다시 추출할 수 있는 Machine Translation 번역 모델에서 사용다.
many-to-many : 비디오와 ㅌ이 프레임이 연속적으로 입력됬을때 그에 따른 출력결과 다양한 video classification on frame level에서 많이 사용되는 방식으 실시간으로 영상을 분류할 때 사용된다.
이외에도 RNN은 고정된(non- sequential) 데이터에서도 유용하게 쓰인다. 아래 그림을 보면 고정된 데이터를 sequential 하게 접근하여 이미지 숫자를 파악한다.
sequential process를 구현하기 위해 RNN은 입력을 했을 때 hidden state를 반복적으로 거쳐 업데이트 한 후 출력을 내보낸다.
수식을 간단히 이해해보기로 하자. h(t-1)은 이전 상태의 hiden state, Xt는 현재 입력 값, h(t)는 다음 상태의 hidden state 혹은 update hidden state를 말한다. Fw는 매번 업데이트 된 h(t)를 입력받아 출력을 결정한다. 즉 과거의 데이터가 미래에 영향을 주는 구조를 가진 것이 RNN 특징이다.
Vanilla RNN을 예시로 살펴보자.
h(t−1 )은 이전 상태를, Xt는 입력값, W(hh) hidden state에서 오는 가중치, W(xh) 력값에서 RNN으로 가는 가중치, W (hy)는 RNN cell에서 출력값으로 가는 가중치를 의미한다. non- linearity를 위해 tanh를 사용했고, 각각의 W는 서로 자신의 영역에서 매 step마다 같은 값을 값을 사용한다.
이러한 RNN을 사용하면 이전의 state가 반영되어 새로운 state를 만드는 sequential 데이터에 강점이 있다.
Vanilla RNN을 Computational Graph에 그리면 위 그림과 같다. 구체적으로 input x가 여러개 들어오고, output으로 여러개가 출력되는 many to many 구조를 예로 살펴보면 시간에 따라 연속적인 입력값이 hiden state로 들어오고 모두 같은 가중치(Wh)를 사용하는 것을 알 수 있다. 또한 hidden state가 반복적으로 사용됨에 따라 출력값도 연속적으로 나오는 것을 볼 수 있다. 이때 각 출력값 마 loss를 계산해 최종 loss에 합산한다.
이번에는 many-to-one과 one-to-many를 합쳐 놓은 구조이다. 이구조는 seqeunce to sequence라고 불리는데, Encoder는 가변 입력을 받고 요약하면, 이를 다시 입력값으로 넣어 decoder가 가변 출력다. 이 구조는 주로 번역모델에서 주로 활용된다.
hello라는 문자열로 예를 들어 설명해보자. helo 를 입력했을 때 o를 예측하는 것이 목표다. 문자를 원핫인코딩으로 바꾸어 입력하고 hidden state를 반복적으로 거친다. 그리고 softmax 함수를 사용해 스코어를 확률분포로 표현하였다. 확률분포를 사용한 이유는 모델의 다양성을 위해서다.
그런데 RRN을 이용해 학습을 진행하다 보면 sequence 길이가 긴 데이터의 경우 backpropagation trhough time(출력 값들의 loss를 계산하여 최종 loss 를 얻을 때까지 걸린 시간) 이 길어지는 문제가 발생할 수 있다.
이러한 경우 전체 문장을 잘게 쪼게서 각 단위별로 loss를 계산하는 방식을 사용한다.
또한 RNN은 여러 Sequence Cell을 쌓아 Back prop 과정에서 모든 cell을 통과할 때 가중치 행렬 W의 transpose factor가 곱해져 특이값이 1보다 커져 exploding gradient가 발생하거나, 1보다 작아져 0이 는 vanishing gradient 문제가 발생한다. gradient clipping이라는 방법을 사용해 해결 할 수 있지만, 아키텍쳐를 새로 디자인 한 모델이 등장한다.
이러한 RNN의 기울기 문제를 해결하기 위해 LSTM(Long Short Term Memory)가 등장한다.
LSTM은 RNN에 4개 게이트웨이를 추가한 모델이다. hidden state를 스택하고 4개의 gate로 가중치 행렬을 곱해다.
i 는 input gate로 cell 에서의 입력에 대한 가중치
f 는 forget gate 이다. 이전 스텝 cell에 정보를 다음 스텝으로 넘어갈때 지지를 정하는 가중치다.
o 는 output gate로 cell state 를 얼마나 밖으로 출력할 것이냐를 정한.
g 는 gate gate 로 input cell 을 얼마나 포함시킬지를 정한다.
semantic segmentation은 각각 필셀 별로 카테고리를 항당하는 방법으로 픽셀로 모든 사물을 구분한다. 하지 여러 객체들이 있는 경우에도 한 가지의 카테고리로 분류하기 때문에 객체들의 개수는 파악할 수 없다는 것이 단점이다.
Semantic Segmentation을 하기 위해 이미지를 쪼개 patch 별로 학습을 시켜야 한다. 그러나 이 방식은 계산이 너무 많아 비효율적이다.
이 방법을 개선하기 위해 전체 이미지를 convoluntion layer에 넣고 최종적으로 출력되는 모든 픽셀에 score를 적용하는 방식이 있지만, fully convolution을 하기 위해선 spatial size를 계속 유지시켜야 하기 때문에 계산비용이 크다.
앞의 문제를 개선하기위해 나온 방법이 downsampling한 다음, Upsampling 하는 방법이다.
Down sampling은 Max pooling, Stride convoluton을 사용한다. 이미지 분류tㅓ느 FC- layer가 있고, 이 방법에서는 Spatial Resolution을 키운다. 따라서 입력 미지의 해상도와 같다.
Upsampling은 이미지 사이즈를 늘리면 빈공간이 생기는데, 이 공간을 채우는 방법으로 Unpooling, Max Unpooling, Transpose Convolution이 있다.
Unpooling에는 2가지 방이 있다.
Nearest neighbor unpooling은 해당 원소를 입력 사이즈와 같이 인접한 값을 복사하 붙이는 것
Bed of Nails는 unpooling 지역에만 값을 복사하고, 다른 곳은 0으로 만들어 해당 값을 돋보이게
3. Max unpooling은 feature map의 공간정보를 균형있게 유지하기 위해 max pooling한 위치를 기억해두고 그 선택된 자리에 값을 넣고 나머지는 0으로 채운다.
Transpose Convolution에서는 학습을 한다. 이 방법은 convolution 방법이다. . Transpose convolution은입력에서 한 스칼라 값을 선택해 filter와 곱하고 그 값을 출력에 넣는다.
입력은 가중치라고 생각하면 겹치는 부분이 생기는데 이 부분은 각 결과값을 더해서 채워준다. 이런 식으로 upsampling을 진행하는데 이게 왜 transpose convolution인지는 matrix 관점으로 생각해보면 된다.
Classification + localization은 물체를 구별하는 것 뿐만 아니라 물체의 위치까지 파악할 때사용하는 방법이다. Object Detection과 다른 점은 localization에서는 객체가 오직 하나라고 가정하는 점이다.
이를 구현하기 위해서는 classification과 관련된 loss 뿐만 아니라 위치와 관련된 box coordinates loss도 계산해야 한다. 각각 따로 구한 뒤 나중에 합친다.
Object Detection은 한 장의 이미지에서 다수의 물체를 찾고, 그 물체가 어디 있는지 알아내는 것이다. Object Dectection에서 R-CNN, Fast R-CNN, Faster R-CNN을 배운다.
classification + localization과 다르 이미지 마다 객체의수가 달라져 미리 예측하는 것이 불가능하다.
Object Detection은 크게 2-stage, 1-stage Detector로 나눠질 수 있다고 한다.
object Detection은 sliding winodw 대신 region proposal을 사용해 객체를 찾아내는데, 객체가 있을만한 곳을 후보로 선정한다. 다음 1000개의 region을 selective search를 통해 찾아낸다.
이러한 방법으로 region proposal을 이용해 찾은 객체를 CNN으로 입력으로 추출하는 방법이 R-CNN이다.
region proposals을 CNN에 적용하기 위해 FC layer로 같은 사이즈로 맞추 CNN의 입력으로 넣는다.이 방식을 warped image region이라 한다. 그다음 SMs를 이용해서 분류하고 region proposals을 보정하기 위해 Bbox reg도 따로 구한다.
R-CNN의 문제는 크게 5가지가 있다.
계산 비용이 많이 든다.
용량(Memory)가 많이 든다.
학습 과정이 느리다. (84시간이 걸린다.)
Test Time이 느리다.
학습이 되지 않는 Region Proposal이 존재한다.
하지만 이 문제를 개선하기 위 fast R-CNN이 나왔다.
Fast R-CNN은 R-CNN과 다르게 각 ROI마다 각각 CNN을 수행하지 않고, 전체 이미지를 ConvNet을 이용해 고해상도 feature map 얻고, Regions of Interest를(ROI)구하는 방식으로 속도를 개선시켰다.
Fast R-CNN보다 더 빠르게 처리되도록 개선한 방법이 바로 faster R-CNN인데 이는 region proposal도 Region Proposal Network(RPN)을 이용해 예측하는 방식이다.