Other/Computer vision

[CV] 객체 검출, YOLO

hyebin Lee 2021. 12. 6. 03:13

객체검출에도 다양한 알고리즘이 있는데 최근에 가장 관심을 받고 있는 알고리즘은 YOLO(you only look once) 이다. 

한 번 보고 객체 검출의 위치와 인식 기능이 구현된 알고리즘이다.  😎 실시간으로 검출이 가능하기 때문에 초당 30 프레임까지도 객체 검출이 가능해 다양한 활용사례에 나타난다.

 

일단 객체 검출에 대해서 알아보자!

 

주어진 영상에서 오브젝트 단위로 판단하기 보단 픽셀 단위로 판단해서 픽셀이 어느 클래스에 해당하는지 영역 분할을 한다. (Semantic Segmentation)

 

이때! Semantic Segmentation의 단점

소가 두마리 인 것을 구분하지 않는다. 그냥 소 영역 일 뿐

만약 고양이를 검출하기 위해서는 고양이가 어디 있는지 위치를 잡고 (Localization)

이 위치에 어떤 오브젝트가 있고 어떠한 객체인지를 분류 (Classification)

하나의 사진에 여러개의 오브젝트가 있다고 가정하고 문제 해결 (Object Detection)

각각이 오브젝트들을 구별 가능(Instance Segmentation)

 

오브젝트 인식을 위해서 CNN 구성하는 과정

입력 영상이 들어오면 특징을 추출하고 Flatten 과정을 거쳐서 MLP를 거쳐 사진이 고양이일 확률과 개일 확률 자동차일 확률 등을 구해서 가장 높은 확률 값으로 분류하는 것

*MLP? 다층 퍼셉트론은 퍼셉트론으로 이루어진 층(layer) 여러 개를 순차적으로 붙여놓은 형태

 

Semantic Segmentation이 CNN적용 과정

위와 거의 동일, 작은 이미지 영상을 가지고 이 영역이 무엇인지 구분

 

After Segmentation?

사람의 자세, 얼굴에서의 요소들의 포즈까지 분석 가능

Open Pose로 활용 가능

 

R-CNN

주어진 영상에서 객체가 존재할 수 있을 만한 위치에 수백 개의 후보군을 만들고 각각에 대해 어떤 오브젝트 인지 CNN을 가지고 판단

수백개 수천 개의 후보지를 찾는 것이기 때문에 그만큼 분류를 해야 하기 때문에 객체 검출이 매우 느릴 수 있다. 계산 복잡도가 높다.

이런 단점을 보완한 알고리즘 등장!

 

YOLO란❓

격자 그리드로 나눠서 한 번에 클래스를 판단하고 통합하여 최종 객체 구분

어떻게 격자를 나누고 격자를 중심으로 어떤 오브젝트가 있는지 판단하고 만들어진 판단을 모아서 최종 결론을 만들어 낼 것인지 이해하는 것이 중요✔️

 

기존의 방법들과 달리 Object detection을 이미지 픽셀 좌표에 대응하는 bounding box를 찾음, 그리고 이에 대한 class 확률을 구하는 Single Regression Problem으로 해결

Regression Problem이라고 ❓ 왜 ❓

점이 하나 주어졌을 때, 윈도우의 시작 좌표와 윈도우의 폭, 높이, 오브젝트일 확률 값, 80개의 클래스일 확률 이와 같은 85개의 값을 추정하는 알고리즘이라고 보면 된다. (그리드 격자 하나당)

prediction layer = SS(B*5+C)

SS로 영상을 분할 시 영상 하나 당 (B5+C)만큼의 출력 결과가 나온다.

여기서 B는 하나의 그리드에서 가져가는 bounding box의 개수이다.

*5 는 bounding box마다 좌표 4개, 오브젝트일 확률 값 이렇게 5개이기 때문

C는 클래스의 개수이다.

예를 들어 셀 하나에 대해서 B가 1일 경우 , 5 + 80이다. 따라서 85가 된다.

 

 

YOLO 버전에 따라 다르다고

yolo버전에 따라서 격자를 나누는 크기, bounding box의 나누는 수가 다르다.

version 1 은 4484483의 이미지가 network를 통과하여 7730의 텐서로 출력

version 2 은 4164163의 이미지가 network를 통과하여 131325의 텐서로 출력

 

그렇다면 7*7과 13*13으로 분할하는 것의 차이는 ❓

검출할 수 있는 영상의 크기와 관련이 있다. 7*7은 영상을 큰 영상으로 자르기 때문에 작은 오브젝트인 경우 검출이 어렵다.

하지만 13*13로 영상을 한 번 더 잘게 나눠서 작은 객체도 검출이 가능하게 된다.

 

 

전체적인 YOLO알고리즘 과정

  1. 이미지를 split into a grid
  2. 각각의 셀에 대해서 바운딩 박스와 오브젝트가 있을 확률을 예측(Regression Problem)
  3. 각 셀에 대해서 이 영역이 무엇인지 분류한다.
  4. 최종적으로 바운딩 박스의 오브젝트가 무엇인지 계산
  5. 수많은 박스들의 결과를 그룹핑 (combine) Non-maximum Suppression 알고리즘을 사용, 최대 확률 값을 갖는 사각형만 찾아낸다. (최댓값이 아닌 것들을 줄인다는 의미)

추가적으로 YOLO v3는

성능 개선을 위해서 CNN으로 구성되어있다.

출력이 3개가 있는데 영상을 77, 1414, 28*28로 쪼갠다.

작은 오브젝트, 큰 오브젝트 모두 정밀하게 검출 가능

이때 나온 각 레이어의 출력 값 행렬의 크기는 85개의 값들로 이루어져 있다.