spp 넷에서 rcnn의 단점인 2000번의 cnn연산과 warp과정에서 정보손실을 해결했지만

 

svm과 bbr이 따로 수행되고 svm이 gpu에서 돌아가지 않는다는 단점들은 해결되지않은 상태였다.

 

이를 해결하며 나온 것이 fast R-cnn이다.

이름에서 볼 수 있듯이 속도면에서 R-cnn에 비해 훌륭했고 정확도도 높아졌다.

 

 

 

fast R-cnn의 과정은 다음과 같다

 

1. 이미지를 cnn에 통과 시켜 feature map을 얻는다.

2. selective search를 통해 찾은 ROI들을 featuremap에 대응시키고 RoI pooling을 적용하여 고정된 feature vector를 얻는다

3. feature vector를 softmax, bbr에 활용한다.

 

1. ROI pooling 

 

vgg net을 바탕으로 fine tuning을 한다.

 

spp넷에서 언급했던 피라미드풀링과 비슷한 개념이라생각하면된다. 단 점점 작아지는 모습을 보였던 것과 달리

하나의 레이어만을 사용한다. 여기서는 7x7을 사용하였다

 

 

 

2, Multi task loss

 

spp net과 rcnn에서는 분류기로 cnn에서 softmax를 사용한 것이아니라 feature만을 추출하여 개별적인 svm 및 bbr을 활용하였다.

하지만 fast rcnn은 classification과 bounding box regression을 적용하여 각각의 loss를 얻어내고, 이를 back propagation하여 전체 모델을 학습시키도록 했다. 이를 위해서는 두개념을 통합한 loss가 필요했는데 아래 식이 Multi task loss이다. 

먼저 classification loss부분부터보면

p는 어떤 클래스일지 예측한 확률 (p0, ..., pk) k+1 길이의 벡터이고 u는 해당 roi의 true값이다.

 

Localization loss를 보면

tu는 tx, ty, tw, tw인 벡터이고 모두 0이상 1이하의 값을 같는 이미지내에서의 상대적인 값을 가진다.

lambda는 두 loss사이의 balancing parameter이다. 

 

 

하지만 roi를 찾는 과정에서 selective search를 하는 것은 이전과 동일하여 이부분에서 속도향상은 없었다. 이를 faster R-CNN에서 해결한다.

'CV > object detection' 카테고리의 다른 글

[cv] SPP-net  (0) 2022.06.01
[CV] R-CNN  (0) 2022.06.01
[cv] object detection 기본용어  (0) 2022.05.25

SPP -net은 Spatial Pyramid Pooling의 준말이다.

 

R-CNN의 단점은 crop/warp를 거치면서 이미지가 찌그러져 가지고있는 정보를 잃는다는 점이다. 

warp는 feature vector의 크기를 맞추기 위하여 사용되었는데

다른 방법으로 feature vector의 크기를 맞출 수 있다면 정보를 보전한 상태로 분류에 사용할 수 있을 것이다.

이를 극복한 방법이 SPP다.

 

 

SPP net의 과정은 다음과 같다.

 

1. 이미지를 cnn에 통과 시켜 feature map을 얻는다.

2. selective search를 통해 찾은 ROI들을 featuremap에 대응시키고 spp를 적용하여 고정된 feature vector를 얻는다

3. R-cnn과 같이 svm, bbr을 적용시킨다.

 

고정된 feature vector를 얻는 방식을 제외한다면 R-cnn의 과정과 같다고 볼 수 있다.

 

1. SPP - Spatial Pyramid Pooling

 

 

위의 그림처럼 먼저 cnn을 이용하여 featuremap을 얻고 SS를 통해 얻은 ROI를 대응시킨다.

 

위와 같이 crop된 feture map을 얻게 될텐데 이를 4x4 , 2x2, 1x1로 쪼갠이후 각 영역별로 맥스풀링한 결과를 얻게된다.

이를 spatial pyramid pooling layer 라고한다. 

위의 경우 16 + 4 + 1 = 21크기의 vector를 얻을 수 있을 것이다.이는 하나의 채널에 대한 내용이고 채널이 256개있다면 

총 21 x 256개의 고정된 vector를 얻을 수 있는것이다.

저자들은 1x1, 2x2, 3x3, 6x6 총 4개의 피라미드로 SPP를 적용합니다.

 

 

2. R-cnn과의 비교

 

r-cnn은 2000번의 cnn을 거친데 반에 spp는 1번의 cnn을 거치기 때문에 속도차이가 있을 것이고

warp과정에서 정보손실이 적어 더 좋은 결과를 가져올 수 있들 것이다.

하지만 rcnn의 다른 단점이었던 cnn, svm, bbr이 여전히 나누어져있다는 점은 여전히 해결되지 않았다는 점에서 한계를 가지기도 한다.

'CV > object detection' 카테고리의 다른 글

[CV] fast-R-cnn  (0) 2022.06.01
[CV] R-CNN  (0) 2022.06.01
[cv] object detection 기본용어  (0) 2022.05.25

 

 

r-cnn의 과정

 

1. 이미지를 입력 받는다

2. selective search 를 통해 region proposals (물체가 있을 것이라고 예상되는 영역)을 2000개 추출한다.

3. 추출한  region proposal을 고정된 크기의 이미지로 warp한다. (4.에서 추출될 feature vector의 길이를 통일 시키기위함)

4. warp한 이미지를 cnn에 넣어 feature vector를 추출한다.

5. feature vector를 SVM에 넣어 어떤 이미지일지 classification한다.

 

크게 나누면

1. 물체가 있을 만한 영역 (RoI)을 찾는다.

2. 영역에 해당하는 이미지가 무엇인지 판단한다.

 

이렇게 두 stage로 나뉘게 되는데 이런 detector를 2-stage detector라고 하며 r-cnn계열이 대표적이다

반면에 1-stage detector은 YOLO가 대표적이다.

 

 

 

다시 rcnn으로 넘어와 하나하나의 과정을 디테일하게 살펴보자

 

1. Selective search 

 

https://www.geeksforgeeks.org/selective-search-for-object-detection-r-cnn/

Region proposal 단계에서 물체가 있을만한 영역을 찾는 기법이다.

 

1. Efficient GraphBased Image Segmentation 이라는 기법을 통해 초기 영역을 생성한다

2. 작은 영역들을 유사도가 비슷한 영역끼리 합쳐 큰영역으로 통합한다.

 

Selective search는 위와 같은 과정을 반복하여 총 2000개의  roi를 찾아낸다.

이는 추후에 사용되지않는 방법이기 때문에 자세히 설명하지 않고 넘어간다.

이후 같은 크기로 warp한다.

 

2. CNN

alex net
warp

 

227*227 크기로 warp 하여 cnn모델에 넣는다. 모델은 alex net의 구조를 거의 따와 finetuning 한다.

 

인풋은 train image중에 selectiove search의 결과물을 crop한 것이다.

이때에 iou가 0.5이상인경우 positive, 즉 물체이다. 아닐경우 negative, 즉 배경이라고 전제하고 학습하게된다.

이렇게 데이터셋을 구축후에 alexnet을 기반으로 finetuning한다

 

이 crop시에 원래의 값대로 crop하는 것보다 padding을 16pixel만큼 줘서(원래보다 16pixel씩 w,h를 더 늘렸다) crop한것이 더 성능이 높았다고 한다. (warp이미지의 1행이 without padding 2행이 padding)

 

아직 GAP나 Roi pool, FCN이 나오지 않은 시기이기때문에 CNN에서 나오는 feature vector(4096)의 크기를 일치시키기 위하여 warp한다.

 

fine tuning 시에 k 종류의 object를 인식한다하면 k+1개를 학습하게 되는데 +1은 배경이다 측 k개에 해당하지 않는경우이다.

 

이 finetuning 완료된 cnn을 통해 softmax이전의 4096 길이의 feature vector를 얻는다.

 

3. SVM

 

위의 과정을 거쳐 4096크기의 vector를 통해 classification을 진행한다.

총 k개의 오브젝트가 있다면 배경을 포함해 k+1개의 linear SVM을 학습한다. (이진분류)

 

SVM의 학습시에도 selective search의 결과물을 학습에 이용하는데 

이때 원래 박스값 ground truth만을 positive로 사용하고 IOU 0.3미만인 값을 negative로 사용한다.

 

학습된 SVM에 2000*4096을 입력하여 각 region의 class와 confidence를 얻는다.

 

cnn에서 softmax를 사용하지 않은 이유는 단순히 cnn으로 나온 벡터를 통한 svm의 성능이 좋아서였다. 

 

 

 

4. Bounding box regression

 

https://lilianweng.github.io/posts/2017-12-31-object-recognition-part-3/

bounding box의 위치를 실제와 가깝게 만들기 위하여 bounding box regressor을 이용한다 G 가 ground truth, p가 예측 bounding box이며 t 는 이동량이다.

 

cnn을 통과한 4096의 벡터를 bbr에 통과시켜 x,y,w,h를 얻는다.

 

이후 NMS를 거쳐 최선의 bb를 출력한다.

 

 

R-CNN은 당시의  엄청나게 좋은성능을 가졌지만 여러 단점을 가진다

1. 2000번의 cnn연산

2. cnn, svm, brr 따로 학습 및 예측

3. selective search의 느린속도

 

위의 것을 보완해서 fast R-CNN 이 나오게된다

'CV > object detection' 카테고리의 다른 글

[CV] fast-R-cnn  (0) 2022.06.01
[cv] SPP-net  (0) 2022.06.01
[cv] object detection 기본용어  (0) 2022.05.25

1. object detection이란

 

한 이미지에서 물체를 둘러싼 사각형(bounding box)를 탐지하는 것으로 
일반적으로 이미지를 입력으로 받고, bounding box와 그에 대응하는 예측 클래스와 클래스의 신뢰도(confidence)를 출력한다. 

 

출처 : https://deep-eye.tistory.com/6

2. IOU (intersection over union)

 

출처 : https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/

정답 값과 모델이 예측한 사각형이 얼마나 겹치는 지를 나타내는 지표이며 높을수록 잘 예측한 모델이다.

import numpy as np

def compute_iou(pred_box, gt_box):
  x1 = np.maximum(pred_box[0], gt_box[0]) 
  y1 = np.maximum(pred_box[1], gt_box[1])
  x2 = np.maximum(pred_box[2], gt_box[2])
  x2 = np.maximum(pred_box[3], gt_box[3])

  intersection = np.maximum(x2 - x1, 0 ) * np.maximum(y2 - y1, 0)

  pred_box_area = (pred_box[2] - pred_box[0]) * (pred_box[3]- pred_box[1])
  gt_box_area = (gt_box[2] - gt_box[0]) * (gt_box[3]- gt_box[1])

  union = pred_box_area + gt_box_area - intersection

  iou = intersection / union
  return iou

pred_box와 gt_box 는 각각 

 

 

3. NMS(non maximum suppression, 비최댓값 억제)

 

한가지 object에 여러가지 bbox가 겹쳤을 경우

확률이 가장 높은 상자와 겹치는 상자들을 제거하는 과정

 

1) 확률 기준으로 모든 상자를 정렬하고 먼저 가장 확률이 높은 상자를 취함
2) 각 상자에 대해 다른 모든 상자와의 IOU를 계산
3) 특정 임곗값을 넘는 상자는 제거 (너무 겹치는 녀석을 없앤다)

 

위와 같은 과정으로 이루어진다.

https://pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/

def non_max_suppression_fast(boxes, overlap_thresh):
  if len(boxes) ==0:
    return []
  if boxes.dtype.kind == 'i':
    boxes = boxes.astype('float')

  pick = []
  x1, y1, x2, y2 = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]

  area = (x2 -x1 + 1) - (y2 - y1 +1)
  idxs = np.argsort(y2)

  while len(idxs) > 0:
    last = len(idxs) - 1
    i = idxs[last]
    pick.append(i)

    xx1 = np.maximum(x1[i], x1[idxs[:last]])
    yy1 = np.maximum(y1[i], y1[idxs[:last]])
    xx2 = np.maximum(x2[i], x2[idxs[:last]])
    yy2 = np.maximum(y2[i], y2[idxs[:last]])

    w = np.maximum(0, xx2 - xx1 +1)
    h = np.maximum(0, yy2 - yy1 +1)

    overlap = (w*h) / area[idxs[last]]

    idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlap_thresh)[0])))

  return boxes[pick].astype('int')

 

4. 모델 성능평가

 

4-1. 정밀도와 재현율

https://towardsdatascience.com/precision-and-recall-made-simple-afb5e098970f

 

모델이 객체 존재를 엄격하지 않게하면 FP가 커져 precision(정밀도)이 낮아지고

너무 엄격해서 FN이커져 recall(재현율)이 낮아지게된다.

 

 

 

4-2 정밀도 재현율 곡선

 

https://github.com/ultralytics/yolov3/issues/898

 

T이하는 제거하는 임계값 T에 따라 정밀도와 재현율이 달라지게 된다.

- 0 < T < 1 

- T가 1에 가까우면 놓치는 객체가 많아져 재현율이 낮아지고 신뢰도가 높은 예측만 유지하여 정밀도는 높아진다.

- T가 0에 가까우면 대부분의 예측을 유지하기에 재현율은 높어자고 정밀도는 낮아진다.

 

예를 들어 모델이 보행자를 참지하면 이유없이 차를 세우더라도 보행자를 놓지지않도록 재현율을 높여야한다.

 

 

4-3 AP, mAP

 

위 그래프의 곡선 아래영역의 넓이이다. 

항상 0~1사이 값을 가지며

단일 클래스에 대한 모델성능 정보를 제공한다.

데이터셋이 10개의 클래스로 구성된다면 각 클래스에 대한 ap를 계산하고 그의 평균인 map를 구한다.

 

 

'CV > object detection' 카테고리의 다른 글

[CV] fast-R-cnn  (0) 2022.06.01
[cv] SPP-net  (0) 2022.06.01
[CV] R-CNN  (0) 2022.06.01

+ Recent posts