728x90

1.RCNN : Region Proposal + CNN Detection 

RCNN은 전 시간에 배웠던 selective searh 통하여 객체 있을만한 장소를 추천해 줍니다. 추천 해준 영역은 설정에 따라 몇천 개가 될 수 있습니다. 위 그림을 보면 1단계에서 selective search 실행합니다. 여기서는 대략 2000개를 뽑았다고 가정합시다. 2000개를 AlexNet에 넣어서 분류와 바운딩 박스 예측을 실행하게 됩니다. 

RCNN의 특이점은 SVM Classification 머신러닝을 이용한다는 점입니다. SVM을 적용하기전에 softmax로 업데이트한 가중치를 가지고 SVM 분류를 적용하면 성능이 향상되는 결과를 얻을 수 있습니다. 

 

 

하지만 문제점이 있는데, AlexNet의 입력값은 227*227입니다.  Region Proposal로 추천된 것들은 제각각
크기가 달라서 227*227로 통일하면 이미지가 찌그러진다. (객체가 있을법한 장소를 임의로 선택해서 출력하므로 정해진 규격이 없습니다.)  pretrained AlexNet은 찌그러진 이미지를 학습하지 않았으므로 성능이 떨어집니다. 이를 해결하기 위해선 찌그러진 이미지를 포함시켜 다시 학습을 진행하면 개선됩니다. 

여기서 짚고 넢어 가야 할 점은 selectiveSearch자체로 바운딩 박스 역할하면 되지 않겠는가?라는 의문이 들 수 있습니다. 하지만 이는 객체가 있을만한 곳을 알려줄 뿐이지 정확한 위치를 반환하진 않습니다. 그래서 따로 회귀를 통해 바운딩 박스 예측을 해야 합니다.

 

2번에서 region proosals를 2000개 뽑았습니다. 각 한 장 한 장을 위와 같이 모델에 넣어서 분류, 바운딩 예측 두 가지를 진행합니다. 이렇게 되면 수행 시간이 매우 길어지는 큰 단점이 생기게 됩니다.

바운딩 박스를 예측하는 수식은 아래와 같습니다.

 

예측 바운딩 박스와 실제 박스를 계산해서 손실 함수를 가장 적게 만드는 가중치를 찾게 됩니다.
pw: predict width(예측한 너비)
ph: predict height(예측한 높이)
(px,py) -> 예측한 바운딩 박스의 중심 좌표

간단하게 정리를 하자면 위 식을 통해서 실제 박스의 중심점에 가장 가까운 가중치를 찾습니다.

 

RCNN의 장단점은..

장점보단 단점이 많은데, 일단 수행 시간이 길다는 치명적인 단점이 존재합니다. 2000개(설정에 따라 2000개 이상 될 수 있음) 각 이미지를 모델에 적용시키는 것이 아닌 좀 더 효율적인 방법을 연구하게 되는데,,, 이때 나온 개념이 SPPNet입니다.

 

2. SPP(Spatial Pyramid Pooling)Net

위 내용처럼 2000개 이상의 많은 region proposal 이미지를 한 번에 피처 맵에 맵핑을 적용한다는 점 핵심입니다. 하지만 여기서도 문제가 있습니다. region proposal 이미지는 각자 크기가 다릅니다. CNN은 서로 다른 사이즈의 Image를 수용하지 않는데, 가장 큰 이유는 Flatten Fully Connection Input의 크기가 고정이 되어야 하기 때문입니다. 따라서

제 각각인 이미지를 FC로 변환을 못하게 됩니다.

이때 적용되는 도구가 SPP개념입니다. 서로 다른 크기의 이미지가 들어와도 고정된 벡터로 변환해줍니다. 제각각인 크기가 모두 통일이 되므로 FC적용이 가능해집니다.

SPP는 SPM에 근간을 둡니다.

 

SPM(Spatial Pyramid Matching)?

SPM은 고전적인 방법인 Bag of Visual words을 해결하기 위해 등장한 개념입니다.

Bag of Visual words에 대해서 간략하게 설명하자면 

NLP에서의 bag of words란 개념이 있습니다. 대상이 되는 문서의 단어를 모두 담아 놓은 가방입니다. 마찬가지로 위 그림처럼 사람 객체 이미지를 담아 놓습니다. 그 후 예측할 대상이 들어오면 가방 안에 있는 것과 비교하여 개수를 카운트합니다. 히스토그램을 만드는 것이죠. 그러면 예측할 객체가 무엇인지 분류가 가능해집니다. 

하지만 이것도 문제점이 존재합니다.

대상이 되는 객체에 쓸데없는 배경이나 다른 객체가 뒤섞여 있다면 분별하기가 힘들어집니다. 이를 해결하기 위해서

이미지를 분할하고, 분할된 이미지 각각을 히스토그램 계산한 다음, 분할된 수만큼 생긴 히스토그램을 통합시키면 

향상된 성능을 보이게 됩니다. 이미지를 분할하는 개념이 SPM입니다.

level0은 분할하지 않았을 때 히스토그램

level 1은 4개로 분할했을 때 히스토그램

level 2은 16개로 분할했을 때 히스토그램

좀 더 자세하게 살펴보겠습니다.

파란색, 노란색, 빨간색(사람, 자전거, 바이올린) 각각 있습니다. 

level 1에서 좌측 상단부터 우측 하단까지 파란색은 몇 개, 노란색은 몇개, 빨간색은 몇 개인지 각각 표현합니다. 

이렇게 되면 각 분변에서 어떤 값이 가장 높은지 파악할 수 있습니다. 

level0의 각 색깔별 카운트는 11,10,12, 총 3개이고, level 1의 각 분 면도 색깔별로 카운트할 수 있습니다. (총 12개)

아래 빨간 직사각 형안에 이렇게 카운트된 갓을 일렬로 벡터화시킨다면 해당 벡터는 원본 이미지인 level0을 가장 잘 표현한 값이 됩니다.

파란색, 노란색, 빨간색이 들어있는 8*8 피처 맵이 존재한다고 가정할 때

원본 이미지는 분할이 없으므로 각 3개의 색깔별로 카운트 값이 일렬로 나열되어 있을 것입니다. (3*1의 벡터)

4분면은...

각 분 면마다 카운트 값을 센 후, 나열하면 총 12개 값이 나열됩니다. 

이렇게 16분면까지 하면 총 63*1이라는 벡터가 생성이 됩니다. 

 

 

그렇다면 본론으로 돌아와서 SPP은 무엇인지 말씀드리자면

SPP의 마지막 P는 Pooling입니다. 즉 나눠진 각 반면에 가장 큰 값 하나만 가져오면 됩니다. 이 개념 덕분에 

어떤 사이즈라도 나중엔 고정된 벡터로 출력이 가능해지는 것입니다. 

가장 큰 값 하나만 있으면 되므로 각 분면의 대푯값만 나오게 됩니다. 만일 사이즈가 8*8이 아니라 다른 사이즈라도 

분할수만 같다면 똑같은 벡터 값을 생성할 수 있다는 점이 핵심입니다. 이렇게 생성된 벡터를 FC로 넘길 수 있게 됩니다.

 

 

 

 

 

3. Fast RCNN

Fast RCNN에서 바뀐점이 있다면 SPP layer가 ROI Pooling으로 변경되었다는 점입니다. 

ROI Pooling은 7*7(49분면) 하나의 형식만을 이용합니다. 그외에 두가지 변경된 점이 있는데

내용은 아래 이미지를 통해 확인할수 있습니다. 

   

SPP에서 사용된 SVM->Softmax로 변경 및 multi_task loss를 통해 분류와예측을 함께 최적화 하는 방향으로 바뀌었습니다. 

 

SmoothL1은  오차값이 1보다 작으면 L2(제곱)유형의 함수값을 적용하고 그게 아니라면 L1(절대갓)유형의 함수값을 적용합니다. u>=1이라는건 백그라운드를 제외한다는 의미입니다. (백그라운드의 값은 0이고 밝은 색일수록 값이 증가)

위 공식을 이용해서 loss가 최소가 되는 가중치를 찾게 됩니다.

하지만 큰 문제점이 있습니다. 바로 Region Proposal 수행시간이 길다는 점입니다.

영상을 처리할려면 보통 20~30 FPS가 나와야 하지만 그에 비해 FAST RCNN은 현저히 성능이 떨어집니다.

Region Proposal 수행시간이 긴 이유는 CPU를 사용하기 때문입니다. 

이를 해결한 것이 Faster RCNN인데, Region Proposal 작업을 Net으로 만들어서 end-to-end net으로 묶으면 GPU를 사용할수 있게 됩니다. 

 

 

 

4. Fast RCNN

Faster RCNN = RPN(Region Proposal Network) + Fast RCNN

피처맵에서 3*3 Conv을 실행한 결과를 RPN에 입력되어서 객체인지 아닌지 분류 판단을 하고, 객체라면 바운딩 박스는 어디인지 예측을 하게 됩닌다. 단지 region propsal이므로 정확한 값이 아닌 대략적인 위치를 나타내는 용도입니다.

단지 문제점이 있다면 어떻게하면 FM(feature map)에서 Selective Search 수준의 Region Proposal을 할 수 있을 것인가? 입니다. 이 문제를 해결하기 위해 앵커박스라는 방법이 적용 되는 것입니다.

각자 크기가 다른 9개의 앵커가 적용이 됩니다. 객체를 식별할때 사각형이 가장 잘 detection하는 모습을 보여왔습니다.

따라서 사각형을 유지한 채 크기와 사이즈를 달리하여 놓칠수 있는 객체을 모두 검출하고자 노력합니다.

만일 앵커 모습이 사각형이 아니라 비행기를 검출하기 위한 비행기 모양의 앵커를 사용한다거나 다른 모양으로 할 경우엔 비행기는 검출할지 몰라도 다른 객체는 검출이 안될 확률이 커지게 됩니다. 즉, 과적합의 우려가 있게됩니다.

아래 그림을 통해 이해를 도울수 있겠습니다.

차와 사람이 있는 이미지입니다. 자동차, 사람 각각 검출하기 위해선 위와 같이 서로 다른 크기의 앵커가 필요하게 됩니다. 이러한 현상때문에 각자 크기가 다른 앵커는 객체 검출에 효과적일수 있겠습니다.

 

 

원본이미지에 일정한 간격으로 점이 찍혀 있습니다. 이점을 중심으로 각각 9개씩 앵커박스가 적용이 됩니다.

600*800 이미지를 16으로 서브샘플링하게 되면 세로 가로 각각 40*50이 됩니다. 약 1900개의 점이 생깁니다.

하나의 점 마다 9개의 앵커박스가 있으므로 총 17100개의 앵커박스가 생기게됩니다.

이렇게 많은 앵커박스중 filter 역할을 하는 것이 RPN입니다. 

 

현재 이 fater RCNN의 원리를 제대로 이해하지 못하고 있어서 여기까지 올립니다. 좀 더 공부를 한 후에 이해한 내용을 바탕으로 다시 블로그 업데이트 할 예정입니다.

728x90

+ Recent posts