200303 TIL

|


Today, what I did

  • CAM 논문 읽기
    • 논문의 의의
      1. image의 위치 정보를 그대로 사용하여 분류하게 한다.
      2. 이미지가 분류될 때, 어떤 부분이 이미지 분류에 영향을 미친 건지 알 수 있다. (개인적으로, back propagation의 느낌이 든다..! back propagation은 추출하고 싶은 값(target)과 실제 모델이 계산한 결과값(output)이 얼마나 차이가 나는지 구한 후에 그 오차값을 다시 뒤로 전파해가면서 각 노드가 가지고 있는 변수들을 갱신하는 알고리즘이다.)
      3. 즉, 원하는 이미지(output)를 뽑기 전에(=prediction layer를 통과하기 전에) 전체 feature map들을 종합해서 어떻게 나올건지 먼저 보여주는 방법이다.
    • CNN에 대한 이해
      1. Conv layer의 역할: layer가 얕다면, input image에서 edge를 추출하고 layer가 깊다면, image의 feature들을 추출한다.
      2. FC layer: 그 중 softmax는 classification을 수행한다.
    • CAM의 baseline
      1. 마지막 Convolution layer를 거치고 feature map을 얻는다.
      2. 이렇게 얻은 feature map에서 GAP를 수행한다.
      3. GAP을 거쳐 계산된 1*1의 채널들을 다 더해서 softmax에 넣어 확률값을 얻어낸다 => heat-map 완성.
    • GAP에 대한 이해
      1. CAM을 구현하기 위해 GAP을 사용한다.
      2. CAM 이전의 분류 방법: 마지막 출력값을 낼 때 FCN(Fully Connected Network)에서 flatten으로 1차원 벡터로 만든 후에 softmax에 넣어 분류한다.
      3. CAM의 분류 방법: CNN의 마지막에 Conv layer를 1*1의 채널로 나오게끔 한다. 이로서 flatten이 필요없게 된다.
      4. 계수가 없어서 overfitting에 더 안전하다(아직 무슨 말인지 이해 못함).
      5. 1*1로 만들지라도, 데이터의 위치 정보가 훼손되지 않는다. 즉, GAP을 사용한다면 위치정보를 그대로 사용하여 분류할 수 있게 된다.
    • 종합: 예를 들어서 설명하고자 한다. 고양이(f1), 사람(f2)이 있는 이미지를 넣으면, CNN에서 각각이 가진 특징들을 모조리 추출하고, 고양이(f1)에 가까운 특징들을 묶고 사람(f2)에 가까운 특징들을 묶은 뒤, 각각의 특징들을 하나의 노드로 만든다. 이렇게 되면 f1 노드, f2노드가 생기는데 추출하고 싶은 이미지가 f1노드라면, f2보다 f1이 더 큰 값으로 지배되게끔 f1 노드에 가중치를 곱하여 고양이(f1)가 있는 heatmap을 출력한다.

Today, what I realized

  • 논문을 읽을 수 있어서 뿌듯했다.
  • 스스로 공부할 수 있는 지식이 쌓인 것 같다는 느낌이 들었다.
  • 컨디션이 좋아서 그런지 배가 고프다.

Tommorow’s work

  • GAP 수식 증명하기
  • GMP가 무엇인지 GAP와 뭐가 다른지 찾아보기
  • TLI 업로드 하기
  • 블로그에 논문 정리하고, ppt만들기 (내일 당장 노노)

R-CNN/Fast R-CNN/Faster R-CNN/SSD

|

R-CNN/Fast R-CNN/Faster R-CNN/SSD

전문은 https://seongkyun.github.io/papers/2019/01/06/Object_detection/ 을 가져왔다. 초반에 공부하기 매우 좋은 게시글이며, 해당 저자의 블로그에 들어가보면 더 풍부한 내용을 얻을 수 있다.


Introduction

views
Object detection
  • 객체 탐지(Object detection)은 사진처럼 영상 속의 어떤 객체(Label)가 어디에(x, y) 어느 크기로(w, h) 존재하는지를 찾는 Task를 말한다.
  • 수 많은 객체 탐지 딥러닝 논문들이 나왔지만, 그 중 Base가 될 법한 기본적인 모델들인 R-CNN, Fast R-CNN, Faster R-CNN, 그리고 SSD에 대해 알아본다.

R-CNN

views
R-CNN의 구조
  1. Hypothesize Bounding Boxes (Proposals)
    • Image로부터 Object가 존재할 적절한 위치에 Bounding Box Proposal (Selective Search)
    • 2000개의 Proposal이 생성됨.
  2. Resampling pixels / features for each boxes
    • 모든 Proposal을 Crop 후 동일한 크기로 만듦 (2242243)
  3. Classifier / Bounding Box Regressor
    • 위의 영상을 Classifier와 Bounding Box Regressor로 처리
  • 하지만 모든 Proposal에 대해 CNN을 거쳐야 하므로 연산량이 매우 많은 단점이 존재

Fast R-CNN

views
상: R-CNN의 구조, 하: Fast R-CNN 구조
  • Fast R-CNN은 모든 Proposal이 네트워크를 거쳐야 하는 R-CNN의 병목(bottleneck)구조의 단점을 개선하고자 제안 된 방식
  • 가장 큰 차이점은, 각 Proposal들이 CNN을 거치는것이 아니라 전체 이미지에 대해 CNN을 한번 거친 후 출력 된 특징 맵(Feature map)단에서 객체 탐지를 수행
views
Fast R-CNN 구조
  • R-CNN
    • Extract image regions
    • 1 CNN per region(2000 CNNs)
    • Classify region-based features
    • Complexity: ~224 x 224 x 2000
  • Fast R-CNN
    • 1 CNN on the entire image
    • Extract features from feature map regions
    • Classify region-based features
    • Complexity: ~600 x 1000 x 1
    • ~160x faster than R-CNN
  • 하지만 Fast R-CNN에서 Region Proposal을 CNN Network가 아닌 Selective search 외부 알고리즘으로 수행하여 병목현상 발생

Faster R-CNN

views
상: R-CNN 구조, 하: Faster R-CNN 구조
  • Region Proposal을 RPN이라는 네트워크를 이용하여 수행(병목현상 해소)
views
  • Region Proposal 단계에서의 bottleneck 현상 제거
    • 해당 단계를 기존의 Selective search 가 아닌 CNN(RPN)으로 해결
  • CNN을 통과한 Feature map에서 슬라이딩 윈도우를 이용해 각 지점(anchor)마다 가능한 바운딩 박스의 좌표와 그 점수를 계산
  • 2:1, 1:1, 1:2의 종횡비(Aspect ratio)로 객체를 탐색
views
R-CNN 계열 구조 비교
views
R-CNN 계열 성능 비교

Single Shot Multi-box Detector (SSD)

views
R-CNN과 SSD방식 구조 비교
views
SSD의 추론 방식
  • Multi-scale feature maps
    • 크기가 다른 객체 검출을 위한 다양한 크기의 Grid cell을 사용
    • 검출기는 Grid cell과 크기가 비슷한 객체를 찾도록 학습됨
views
SSD 구조
  • Base network : VGG-16[5]
  • Conv 4_3, 7, 6_2, 9_2, 10_2, 11_2을 입력으로 컨벌루션하여 6개의 특징맵 생성
  • 특징맵에는 경계박스(x, y, w, h)와 클래스 정보(Classification)가 저장됨
    • Conv 4_3 : 3838(4(Classes+4)) = 5776(Classes+4)
    • Conv 7(FC7) : 1919(6(Classes+4)) = 2166(Classes+4)
    • Conv 8_2 : 1010(6(Classes+4)) = 600(Classes+4)
    • Conv 9_2 : 55(6(Classes+4)) = 150(Classes+4) = 클래스당 8732개의 경계박스를 예측
    • Conv 10_2 : 33(4(Classes+4)) = 36(Classes+4)
    • Conv 11_2 : 11(4(Classes+4)) = 4(Classes+4)
views
  • SSD는 Faster R-CNN에서 사용하는 Anchor box와 비슷한 Default Box 사용
    • 기본적으로 가로/세로 로 계산되는 종횡비를 사용
    • 4* : 1, 2, 1/2, 종횡비가 1인 크기가 작은 박스 사용
    • 6* : 1, 2, 3, 1/2, 1/3, 종횡비가 1인 크기가 작은 박스 사용
views
IoU(Jaccard overlap)
  • IoU로 정의되는 Jaccard overlap이 50% 이상이 되는 모든 디폴트 박스들 학습
  • 특징맵의 각 Grid cell의 경계박스들과 정답과의 Jaccard overlap이 가장 큰 곳 학습

  • Jaccard overlap(IoU) 계산 방법
    • $s_{k}=s_{min}+\frac{s_{max}-s_{min}}{m-1}(k-1)$, $k\in[1,m]$
    • Jaccard overlap 계산을 위해 스케일 계수 $s_k$를 이용하여 디폴드 박스 가로/세로를 구함.
    • $a_{r}\in{{ {1, 2, 3, \frac{1}{2}, \frac{1}{3}}}}$
    • $\left( {w_k^a=s_k\sqrt{a_r}} \right)$
    • $\left( {h_k^a=\frac{s_k}{\sqrt{a_r}}} \right)$
    • 위 공식을 이용하여 넓이가 1인 디폴드 박스의 가로, 세로 길이를 정의
views
Positive/Negative 비율
  • 예측 된 경계박스의 Positive : Negative = 1 : 3 비율
  • 객체에 대한 Confidence loss가 큰 것 만을 골라 loss를 줄이는 방향으로 학습

SSD Loss function

  • $L(x, c, l, g)=\frac{1}{N}(L_{conf}(x, c)+\alpha L_{loc}(x, l, g))$
  • Loss function은 객체에 대한 confidence와 경계박스에 대한 localization을 더한 형태
views
  • $\hat{g}^{cx}_j=(g^{cx}_j-d^{cx}_i)/d^w_i \qquad \hat{g}^{cy}_j=(g^{cy}_j-d^{cy}_i)/d^h_i$
  • $\hat{g}^w_j=log(\frac{g^w_j}{d^w_i}) \qquad \hat{g}^h_j=log(\frac{g^h_j}{d^h_i})$
    • $N$: 검출된 박스 개수
    • $g$ : ground truth box (실제 박스의 변수들)
    • $d$ : default box
    • $c$ : category
    • $l$ : predicted boxes (예상된 박스의 변수들)
    • $cx$, $cy$ : offset of center
    • $w, h$ : width and height
    • $\alpha$ : weight term( $\alpha$ = 1)
  • The confidence loss is the softmax loss over multiple classes confidences ($c$).
  • The weight term $\alpha$ is set to 1 by cross validation.
views
Flowchart
  • Fast NMS를 사용하여 6개의 Classifier의 예측 중 신뢰도가 가장 큰 것 하나만을 남기고 나머지는 모두 지움

  • ex. Conv 9_2 : 55(3(Classes+4)) = 150(Classes+4)

    • 원래는 Conv 9_2 : 55(6(Classes+4)) = 150(Classes+4)이나, 예시를 위해 3으로 함
views
SSD example
  • 21개의 클래스가 있는 경우, 위와 같이 553=75의 특징맵에 대해 55(3(21+4))로 55의 그리드 각각 셀에서 경계박스와 클래스 확률 3개씩을 예측함(75=25*3)
  • 출력은 21개의 클래스에 대한 신뢰도
views
  • 이렇게 생성된 75개의 경계박스 중 신뢰도 점수가 0.01보다 높은 것만 남기면 대부분의 경계박스는 사라짐.
    • 검출된 75개의 경게박스에 대한 confidence에 의한 필터링

Experimental Result of SSD

  • Base network
    • VGG16 (with fc6 and fc7 converted to conv layers and pool5 from 2x2 to 3x3 using atrous algorithm, removed fc8 and dropout)
    • It is fine-tuned using SGD
    • Training and testing code is built on Caffe toolkit
  • Database ‘07
    • Training: VOC2007 trainval and VOC2012 trainval (16551 images)
    • Testing: VOC2007 test (4952 images)
  • Database ‘12
    • Training: VOC2007 trainval, test and VOC2012 trainval(21503 images)
    • Testing: VOC2012 test(10991 images)
  • Mean Average Precision of PASCAL VOC 2007
views
  • Mean Average Precision of PASCAL VOC 2012
views
  • Inference time 비교
    • Non-maximum suppression 알고리즘에 대한 효율성 개선의 여지가 남아있음
views
  • Visualization
views

  • [원문 출처]

https://seongkyun.github.io/papers/2019/01/06/Object_detection/


  • [참고 글]

[1] Ross Girshick, “Rich feature hierarchies for accurate object detection and semantic segmentation”, 2013

[2] Ross Girshick, “Fast R-CNN”, 2015

[3] Shaoqing Ren, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015

[4] Wei Liu, “SSD: Single Shot MultiBox Detector”, 2015

[5] Karen Simonyan, “Very Deep Convolutional Networks for Large-Scale Image Recognition”, 2014

200302 TIL 시작

|


Intro

앞으로 어떤 일을 할 지는 모르지만, 현재 즐겁게 공부하고 있는 딥러닝 관련 논문 리뷰를 위주로 기록 하려고 한다. 여유가 된다면, 백준 알고리즘도 공부할 예정이다.

Today, what I did

  • Github에 파일 업로드하기
    • 로컬파일과 github 연동에 있어서 계속 애먹고 있었다. 연동하고 파일을 commit하고 push하면서 5번 이상 오류가 발생했다. 계속 초기화하다보니 자연스럽게 명령어와 익숙해지고 파일 커밋정도는 익숙하게 할 수 있게 되었다.

Today, what I realized

  • 미래를 위해서 공부하지 않고, 현재 재밌는 공부를 하자. (아자잣!)
  • 지금처럼만 열정을 갖고 달려나가자.
  • 뒷심을 잃지 말자.
  • 시작을 했으면, 끝까지 마무리하자.

Tommorow’s work

  • ROI pooling에 대해 공부하기
  • CAM 논문 쭉 읽고, 관련 알고리즘 공부하기
  • TLI 업로드 하기 (잊지말고!)