ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [딥러닝] (이미지)R-CNN vs Yolo
    Tech/머신러닝 2020. 2. 25. 08:56
    반응형

    Detecion 을 위해 두가지 방법을 비교 하려고한다. R-CNN 와 Yolo 인데 Object Detector 를 만들기위해 어떤 알고리즘을 사용할지 고민을 많이 했고 그중 이 두가지를 비교 하려고 한다. 

     

     

    R-CNN

     

    • R-CNN은 Multi-stage pipeline임. 학습이 복잡함.
    • R-CNN에서 SVM으로 만들어져있던 classifier 등을 neural network으로 변경함
    • ROI Pooling 제안으로, 효율성을 높임.
    • 9개의 박스 형태를 가지고 이미지에서 영역을 대조함.
    • 앵커박스와 정답박스를 서로 비교하여 나온 수치 ( Iou ) 중에 높은 수치인것들만 검출함.
    • top 300, NMS 를 사용하여 후보군을 줄일수 있음.
    • Vgg16
      • 512 필터 사용 -> 박스 영역 계산/ 오브젝트 존재 유무 계산-> 회귀 / 분류를 함. -> 박스 크기를 보정 ( 풀링 ) -> 박스와 클래스를 fc 레이어로 전달 -> 박스 좌표와 클래스 정보 검출

     

    정확히는 CNN 자체가 아니라 더 발전시진 Fast R-CNN 을 비교할 생각이다. CNN 은 2012년 세계적인 이미지 인식 경연 대회 (ILSVRC) 에서 세계 유수의 기관을 제치고 난데없이 큰 격차로 캐나다의 토론토 대학의 슈퍼비전이 우승하게 되는데 그때 사용된 방법이 CNN 이고 이 CNN 을 좀더 속도를 향상시킨 Fast R-CNN 이다. CNN 에 대해서 먼저 보면 CNN 은 크게 컨볼루션층과 풀링층으로 나눌수 있다. 

     

    컨볼루션(convolution)

     - 컨볼루션층에서는 여러가지 필터를 적용하여 full connected 로 들어오는 이미지에 대해서 필터를 적용하여 다수의 아웃풋을 만들어내고 그 값들을 풀링층에서 샘플링하여 아웃풋을 축소하게 된다.  이때 샘플링을 하는 이유는 overfitting( 컨볼루션 레이어에서 필터가 많아 질수록 피쳐에 수가 기하급수적으로 많아지는 현상) 을 방지 하기 위해서 이다. 

    - 만일 흑백 이미지가 아닌 RGB 이미지 경우 필터를 구성시에 평면형태의 단일 행렬 형태가 아니라 3차원 형태의 필터를 적용해야 한다. 말이 어려울수 있는데 그냥 단순하게 Red , green , blue 각 색별로 필터를 하나씩 만들어야 한다고 생

    각하면 된다. 

    - 일반적으로 많이 가이드되는 필터는 3x3 형태이며 스트라이드는 1~2를 적용하는것을 권장한다. 

    - 나도 공부하면서 들은 내용이지만 초반의 인공지능 개발시에는 필터를 어떤 스트라이드 값을 줘서 어떤 알고리즘 형태로 만드냐에 대해서 다같이 고민했다면 지금은 최적화된 일반적 필터를 잘 적용해서 필터마져도 학습을 시켜 가중치를 딥러닝을 통해 자동으로 필터를 학습해나가는게 요즘 추세라고한다.  이부분이 아직까지는 잘 와닿지는 않지만 예전보단 집중하는 부분이 달라졌다는이야기 인거 같다. 

    - 필터 형태는 기본적으로 패팅형태와 value 형태가 있는데 기본적으로는 패딩형태를 많이 쓴다고한다. 아무래도 value 형태를 취할경우 데이터를 버리게 됨에 따라 데이터손실 우려가 있어서 그렇다고 한다. 

     

    풀링(pooling) 

    - 풀링은 다운 샘플링으로 2x2 크기에 필터를 사용하며 스트라이드 값은 보통 2를 사용한다고 한다. 

    - 풀링은 기본적으로 max 풀링과 avg 풀링을 사용가능한다. 일반적으로는 max 풀링을 사용한다고 한다. 

     

     

    컨볼루션+ 풀링 형태의 구성을 여러개를 중첩시켜 CNN 을 구성하며 이 반복된 구성으로 이미지 처리 프로세스 구성이 가능하다. 컨볼루션층의 핵심은 필터를 얼마나 잘구성하여 딥러닝이 잘되도록 하는지가 중요하고 샘플링하여 이미지에서 필요한 정보를 잘 추출 해야만 한다. 컨볼루션만 잘 학습시킬수 있다면 이미지에 대한 학습은 필터가 지향하는 목적에 맞게 학습이 자동으로 이루어진다. 

     

     

     

    Yolo (https://github.com/zeuseyera/darknet-kr/blob/master/2_YOLO/yolo.md)

     

    yolo 가 CNN 과 다른점중에 하나는 후보군추천이 존재 하지 않는다는것이다. 그리고 네트워크가 상대적으로 심플하다. 

    siglenetwork 를 사용하기 때문에 속도적으로 아주 빠른 연산이 가능하고 기존 속도를 우선시했던 방식들에 비해 성능적으로 우수한 편에 속한다. 기존적인 디텍션 방식을 보면 7x7 output 을 사용하고 class 에 맞게 일정 범위의 차원을 설정한뒤 그 가운데에 한점을 기준으로 두개의 박스를 설정한다.

    그러고 나면 한 사진에서 무수히 많은 박스가 생성되게 되는데 클래스별 확률를 각각 추출한뒤 최정적으로 박스를 그룹핑하여 표현하게 된다 , 이때 NMS 방식을 사용하게 되면 박스의 갯수를 줄일수 있다. 이런 방식이 기존 yolo v2 의 방식 이였다. NMS 는 오브젝트가 있는곳에 박스가 여러개가 겹치는 경우가 발생하는데 이것을 최대한 제거하기 위한 처리방식중 하나이다.  이때 필요한게 IOU 개념인데 가장 유명한 그림이라고 해서 아래 첨부한다.  그리고 같은 곳에서 찾은 NMS 처리 로직이 있어서 같이 첨부!

     

    def nms(boxes, probs, threshold):
      """Non-Maximum supression.
      Args:
        boxes: array of [cx, cy, w, h] (center format)
        probs: array of probabilities
        threshold: two boxes are considered overlapping if their IOU is largher than
            this threshold
        form: 'center' or 'diagonal'
      Returns:
        keep: array of True or False.
      """
     
      order = probs.argsort()[::-1]
      keep = [True]*len(order)
     
      for i in range(len(order)-1):
        ovps = batch_iou(boxes[order[i+1:]], boxes[order[i]])
        for j, ov in enumerate(ovps):
          if ov > threshold:
            keep[order[j+i+1]] = False
      return keep
    
    
    출처: https://dyndy.tistory.com/275 [DY N DY]

    실제 yolo v2 구성은 아래와 같다. 솔직히 아직까지도 전혀 모르겠다. ( 사파 인공지능 개발자의 한계 .... ) 하지만 확실히 F-CNN 과는 구성이 다르고 처리하는 방식도 다르다는게 눈에 확연히 보이고 가장 큰차이는 박스를 생성하는 방식이다. CNN 은 순차적으로 필터가 움직이면서 검색을 한다고 하면 Yolo 는 이미지 하나를 통째로 읽어서 한번에 일단 박스부터 생성해내는 식이라고 보면 될거 같다. 

    Yolo v2 때만 해도 속도는 괜찮았지만 성능은 조금 아쉬웠던거 같다. 하지만 다크넷이 등장하면서 yolo 의 인기가 비약적으로 늘어난거 같다. 다크넷은 일반적인 오브젝트들에 대하여 사전 트레이닝이 되있는 네트워크이다.  그리고 앵커박스 자체를 사전에 미리 제작해서 사용하며 5개의 다른모약의 앵커박스를 대표적인 이미지 기준으로 생성 한다. 그리고이미지 처리를 하는 과정에서 결과를 계속 누적시켜 처리하여 정확성을 높이는 방식을 사용한다. output 도 기존 7x7 에서 13x13로 크기도 증가하였다. 

     기존 v2와 크게 달라진점은 없지만 다크넷 레이러를 기존보다 좀더 깊게 구성하고 FPN 방식을 적용하였다. 그리고 기존 앵커박스를 5개에서 9개로 증가 시켜서 성능을 좀더 확보하고 속도를 조금 손해를 보았다. 내부에 수식이 개선되었다고 하지만 ^^ 난 잘 모르겠다. 어쨋든 변경되는 것들이 좀 있다보니 이미지 해상도에 따라 성능의 변화가 있을수 있다고 한다. 

     여기서 잠깐 말했던 FPN 이 뭔지 기록하고 넘어 가야할거 같다. Object Detecion 시 Scale-Invariant 를 중요시 여겼다고 한다. 다양한 물체를 탐지하기 위해서 이미지 자체의 크기를 리사이즈 하면서 찾았다고하는데  대신 메모리나 시간 측면에서 문제가 생길수 밖에 없었다. 그래서 나온 여러가지 방식이 있는데 이해하기 쉬운 그림이 있어 첨부 한다. 

      

     

    • Featurized Image Pyramid : 각 레벨에서 독립적으로 특징을 추출하여 탐지

      • 단점 : 시간관점에서 비효율적, 현실 적용이 힘듬.
    • Single Feature Map : 컨볼루션 레이어를 통해서 특징을 압축시키는 방식

      • 단점 : 멀티스케일 미사용, 한번에 특징을 압축 하여 마지막 압축된 특장만 사용해서 성능이 떨어짐
    • Pyramidal Feature Hierarchy : 서로다른 스케일의 특징맵을 이용하여 멀티스케일특증을 추출함. 이미 계산된 상위레벨의 특징을 사용하지 않음 ( SSD 에서 사용 )

    • Feature Pyramid Network: Top-down 방식으로 특징을 추출. 추출 결과들을 low/high resolution 들로 묶는 방식 각 레벨에서 독립적으로 특징을 추출하여 객체를 탐지하는데 상위레벨에 계산된 특징을 재사용 하므로 멀티스케일 특징들을 효율적으로 사용 가능

      • FPN 은 RPN 과 Fast R-CNN 을 기반으로 함.

      • 백본 층과는 독립적이며 Resnet 을 사용하여 결과를 보여줌.

      • Bottom-up : 원본대비 사이즈가 줄어드는 특징이 있음.

      • Top-Down :많은 의미 정보들을 가지고 있는 특징 맵을 2배로 업샘플링(Up-sampling) 하여 더 높은 해상도의 이미지를 만들수 있음.

     

    Feature Pyramid Network

    • CNN 자체가 layer를 거치면서 프라미드 구조를 만들고 forward 를 거치면서 더많은 값을 가지게 되고 각 레이어마다 예측과정을 추가해서 scale 변화에 유연한 모델로 됨.

    결론적으로는 yolo 를 사용중이고 현재 팀내에서 파이썬 버전과 C++ 버전 두가지를 사용중이다. yolo 사이트에 보면 C++ 로 작성된 코드를 제공을 하고 있다. 그리고 다음 글에서 정리하겠지만 인공지능 서비스를 만든다는건 단순히 인공지능 모델을 만드는것이 끝이 아니라 시작이란점이 아주 흥미롭고 고달픈 부분인거 같다.  아... 정말 웃프다 ! ㅋㅋㅋ

     

    반응형
Designed by Tistory.