본문 바로가기

Data-science/deep learning

detection research review paper review 2

728x90

지난 번에 적던 포스트가 다 날라가버림,,,

SPP-net이랑, Faste R-CNN과 Faster R-CNN에 대해 적었는데...ㅠㅠㅠ

 

대충 다시 정리하겠다.

 

R-CNN에서 FC layer로 인해 고정된 input이 요구됐음, 그래서 region proposal 단계에서 계속 같은 크기로 잘라야 했다.

 

근데 이게 문제가 될 수도 있다! 물체가 잘려나갈수도 있는거임. 왜곡이 일어날 수도있고 (특히 물체의 스케일이 다양할 때 문제가 됨), 이문제를 해결하기 위해 SPP-net이 나왔다.

 

SPP-net

  • conv5를 재활용한다. 이걸 다시 region proposal에 쓴다. (피쳐맵은 로컬한 반응의 세기나 공간상의 위치와 연관된 게 이를 재활용한다는 건 어느정도 말이된다.) 
  • SPP layer는 마지막 spatial py
  • ramid pooling layer를 일컫는데, conv5의 피쳐맵 개수가 256이면 단계3의 피라미드가 적용되서 마지막 피쳐 벡터의 개수는 256 * (1^2 + 2^2 + 4^2) = 5376이 되는 방식.
  • 스케일들에 따른 다른 영역을 추천함으로써 정확도가 향상됐고, 각 scale별 region proposal 전단계 즉 SPP layer 전단계까지 계산 비용이 동일해서 테스트시 효울성이 향상됨

 

SPP-net은 R-CNN 처럼 multi-stage pipeline이다.

피쳐추출/네트워크망 미세조정/SVM 학습, bounding box regressor 피팅시키기... -> 중간 중간 메모리에 저장되야 한다는 단점.

또 SPP-layer 전에 오는 conv layer는 미세조정을 통해 업데이트 되지 않는다는 단점. 

 

Fast R-CNN

  • muti-task loss를 소개함 (분류 + 바운딩 박스 회귀)
  • conv layer로 피쳐맵 추출 -> ROI pooling layer (SPP-layer의 special case, 1-level) -> feature vector -> FC layers 2 [1개는 C+1개 클래스에 대한 softmax 확률 값, 나머지 1개는 바운딩 박스 위치(중심좌표x,y,너비,높이)
  • Fast R-CNN은 자꾸 여러 단계로 학습하지말고, 한 번에 학습하자는 게 핵심

region proposal이 너무 selective search나 Edgebox 같은 알고리즘에 의존하고 있음, 여기에 드는 제안 비용이 보틀낵으로 작용 ->Region Proposal Network 등장 (Faster R-CNN)

 

 

Faster R-CNN

  • FCN ( 경계 예측, 각 위치에서 점수 산출 )
  • n x n conv layer -> Relu -> 2개의 1 x 1 conv (각각 박스분류,박스회귀)
  • 3 scale anchors, 3 aspect ratio가 채택
    • pi shows the predicted probability of the i-th anchor being an object.
    • The ground truth label p ∗ i is 1 if the anchor is positive, otherwise 0.
    • ti stores 4 parameterized coordinates of the predicted bounding box while t ∗ i is related to the groundtruth box overlapping with a positive anchor
    • Lcls is a binary log loss and Lreg is a smoothed L1 loss
    • These two terms are normalized with the mini-batch size (Ncls) and the number of anchor locations (Nreg), respectively.
  • backpropation/SGD로 end-to-end 학습 가능

Faster R-CNN은 학습 알고리즘이 시간이 너무 많이 든다.

RPN이 물체 인스턴스를 산출하는게 아닌 물체와 비슷한 배경속 무언가를 산출, 스케일이나 모양별로도 요령이 없었음

  • RPN계산 과정
    • 1. conv feature map : Deep CNN (shared CNN)에서 conv feature map을 입력 받는다. (가령 VGG의 경우 14x14x512)
    • 2. Intermediate layer : 3x3 filter를 적용, 14x14x512 아웃풋
    • 3. Output layer :
      • cls layer : 1x1 filter 9x2(=18)개 적용, 14x14x9x2 아웃풋, filter의 개수는 anchor box의 개수 (9개) x score의 개수(2개 : object or non-object)로 결정
      • reg layer : 1x1 filter 9x4(=36)개 적용, 14x14x9x4 아웃풋, filter의 개수는 anchor box의 개수 (9개) x 각 box의 좌표 표시를 위한 데이터 개수 (4개 : dx,dy,w,h)로 결정
  • RPN 학습
  • 한 이미지당 랜덤하게 256개의 sample anchor들을 사용. 이때, Sample은 positive anchor:negative anchor = 1:1 비율로 섞는다. 혹시 positive anchor의 개수가 128개보다 낮을 경우, 빈 자리는 negative sample로 채운다. 이미지 내에 negative sample이 positive sample보다 훨씬 많으므로 이런 작업이 필요하다.
  • ROI pooling

    • 각각의 region proposal을 동일한 크기의 sections으로 나눕니다. (section의 크기는 RoI pooling의 output크기가 동일합니다.)

    • 각각의 section마다 가장 큰 값을 찾습니다.
    • 각각의 찾은 maximum값을 output 으로 만듭니다.
  • Region Proposal Network은 특정 크기의 창(window)를 CNN의 feature 위에서 sliding 시킨다. 각각의 윈도우의 위치에서 네트워크는 점수(score) 및 한 앵커지점으로 부터 bounding box 를 출력해낸다. (따라서 k개의 앵커가 있다면, 4k 개의 박스 좌표들이 구해질 것이다.)


R-FCN

  • ROI와 상관없이 공유되는 FCN 부분 네트워크망, 공유되지 않는 ROI-wise 부분 네트워크망으로 이루어짐
  • A manual insertion of the RoI pooling layer into convolutions can break down translation invariance at the expense of additional unshared region-wise layers
  • 즉 이미지를 분류하는데 있어서는 translation에대해 invariant하려하는데 object detection시에는 translation을 respect해야해서 이 두개가 서로 딜레마 -> FCN object detection은 성능이 더 떨어짐
  • 각 클래스별로 마지막 conv layer는 k^2 위치에 sensitvie한 score map을 내뱉음 
  • a position senstive RoI pooling layer is then appended to aggregate the responses from these score maps. Finally, in each RoI, k 2 position-sensitive scores are averaged to produce a C + 1-d vector and softmax responses across categories are computed. Another 4k 2 -d conv layer is appended to obtain class-agnostic bounding boxes

 

  • Faster R-CNN  및 Mask R-CNN에서 각 hyperparamter들의 의미

    • IOU(Intersection-over-Union) 
      • (Anchor n Gt) / ( Anchor u GT)
      • 1. 가장 높은 IOU를 가진 anchor 
      • 2. IOU > 0.7를 만족하는 anchor
      • 2번 만으로는 잡아내지 못하는 Object가 존재 -> 1번 기준이 추가, IOU < 0.3 이면 non-positive anchor로 간주
      • 그외 IoU 값이 높지도 정확하게 낮지도 않은 anchors들 같은 경우는 학습시 사용되지 않는다. (Task에 따라서 0.7이상이냐 0.3이하냐는 언제든지 바뀔 수 있다.)

    • NMS (Non-Maximum Suppression)

      • non-maximum suppression (NMS) 알고리즘을 사용해서 proposals의 갯수를 줄이도록 합니다. NMS를 간단히 설명하면 먼저 IoU값으로 proposals을 모두 정렬시켜놓은뒤, RoI점수가 가장 높은 proposal과 다른 proposals에 대해서 overlapping을 비교한뒤 overlapping이 높은 것은 특정 threshold이상이면 지워버리며 이 과정을 iterate돌면서 삭제시킵니다.

      • 직관적으로 설명하면 RoI가 높은 bounding box가 있는데.. 이 놈하고 overlapping 되는 녀석들중 특정 threshold이상이면 proposals에서 삭제시켜버리는 형태입니다. 그러면 서로 오버랩은 되지 않으면서 RoI가 높은 녀석들만 남게 됩니다.

      • 일반적으로 threshold의 값은 0.6~0.9 정도로 합니다.

  • Mask R-CNN에서 추가된 부분

    • ROI Align? (Input : RPN 을 통해 나온 region proposal, output : align 및 pooling된 roi
  • 원본 영상의 좌상단의 15x15 영역이 RoI (= 경계박스)다. 

    CNN은 원본 이미지 128x128 을 입력 받아 25 x 25 의 특징맵을 출력한다.

    원본 영상의 15 x 15 에 해당하는 특징맵의 크기는 2.93 x 2.93 이다.

    128 x 128 이 25 x 25 로 작아졌다. 128 / 5.12 = 25 

    15 / 5.12 = 2.93 이므로 원본 이미지의 15 x 15 는 최종 특징 맵의 2.93 x 2.93 이다.


    RoIPool 은 이런 경우에 2.93을 반올림 하여 특징맵 좌상단의 3x3 부분만 가져와서(pool) 클래스를 예측하였다.

    2.93은 반올림되어 3.00 이 된다.

    0.07의 차이는 작아보일지 모르지만 이 차이는 최대 0.5 까지 발생하며, 이러한 정렬 불량 은 성능에 큰 영향을 미친다.

    RoIAlign 은 2.93 x 2.93 에 해당하는 특징맵을 정렬(align)시켜 바이리니어 인터폴레이션을 사용하여 보정된 특징값을 사용한다.


    인터폴레이션은 채널 별로 독립적으로 수행한다.


  • FCN ( Segmentation 부분)

    • Input: CNN Feature map
      Output: 1,0으로 이루어진 행렬, 1은 그 픽셀이 객체에 포함되는 경우, 0은 아닌 경우로 binary mask로 불린다.

ref) https://lilianweng.github.io/lil-log/2017/12/31/object-recognition-for-dummies-part-3.html

https://curt-park.github.io/2017-03-17/faster-rcnn/

http://incredible.ai/deep-learning/2018/03/17/Faster-R-CNN/

https://m.blog.naver.com/PostView.nhn?blogId=sogangori&logNo=221012300995&proxyReferer=https%3A%2F%2Fwww.google.com%2F