현 프로젝트에서 영상 분석을 진행하게 되었다. 그중에서 중요도를 가장 많이 차지하는 객체 탐지 알고리즘에 대해 한 발짝 다가가고자 한다. 이번 게시글에서는 객체 탐지에 대해 알아보고 대중적인 기술 중 하나인 YOLO에 대해 파헤쳐 본다. 더 나아가 객체 트래킹, 객체 분석 등 다음 게시글에서 다루고자 한다.
객체 탐지는 이미지나 비디오에서 객체를 식별하고 찾을 수 있게 하는 컴퓨터 비전 기술.
YOLO에 대해 알아보기 전 YOLO의 기초 구조인 CNN을 간단하게 알아보자.
CNN은 입력 계층, 출력 계층, 여러 은닉층으로 구성된다.
은닉층은 일반적으로 3가지 계층인 Convolution 계층, ReLU 계층, Pooling 계층으로 구성된다.
Convolution 계층: 입력 이미지나 영상을 Convolution 필터에 적용, 이때 특정 특징을 활성화한다.
ReLU 계층: 활성화 함수로 비선형성을 추가하는 역할을 한다. 활성화 함수가 없다면 모든 층이 선형으로 변환되어 네트워크 표현력이 제한된다. 비선형성인 활성화 함수를 사용하게 된다면 입출력이 비례적이지 않기 때문에 더 복잡한 패턴을 학습할 수 있게 된다.
실시간 객체 탐지를 위한 딥러닝 기반 모델. 이름에서 알 수 있듯이 전체 이미지를 한 번에 처리하여 여러 객체를 동시에 탐지하는 방식으로 작동한다.
기존의 two-stage detector는 일단 영역 제안을 받고, 해당 부분에 대한 특징 정보만 보고 추출하는 방식이다. 이 방식은 객체 주변의 정보들을 무시하기 때문에 이미지의 전체 맥락에 대한 이해도가 낮을 수 밖에 없어 배경 이미지를 객체로 인식하고 탐지하는 경우가 많다. 예시로 R-CNN, fast R-CNN, faster R-CNN이 있다.
하지만 YOLO와 같은 one-stage detector는 이미지 전체를 보면서 객체의 일반화된 특징을 학습하기 때문에 실제 사진들을 가지고 학습을 진행한다. 이제 YOLO의 자세한 작동 방식에 대해서 알아보자.
그리드는 이미지나 다른 2차원 표면을 일정한 사이즈의 사각형으로 분할하는 것이다. 복잡한 이미지나 데이터를 더 작고 관리하기 쉬운 여러 부분으로 나누는 데 도움을 준다.
맨유팬과 호동생으로써 호날두를 예시로 동작 방식을 이해해보자. 아래의 이미지와 같이 8*6개의 그리드로 나누어봤다.
나누어진 각 그리드 셀은 N개의 바운딩 박스를 예측한다. 이 바운딩 박스들은 이미지 내의 객체를 포함할 가능성이 있는 영역을 나타낸다. 여기서 객체는 호날두의 얼굴이라고 하겠다.
각 바운딩 박스는 '신뢰도 점수'를 구한다. 이 신뢰도 점수는 바운딩 박스내에서 객체가 존재하는 확률과 예측된 바운딩 박스와 실제 객체의 위치 사이의 일치도이다.
이미지 내에 호날두 얼굴이 있을 때, 호날두 얼굴의 중심이 특정 그리드 셀 내에 위치한다고 해보자. 중심점은 하늘색 점으로 표시했다.
위와 같이 중심점을 기준으로 여러 개의 바운딩 박스가 생성되었다었다. 각 바운딩 박스는 신뢰도 점수를 계산하고 클래스 확률도 동시에 예측한다. 최종적으로 클래스별 신뢰도 점수를 계산한다.
최종 바운딩 박스를 선정하기 위해 겹치는 박스 중에서 가장 신뢰도 높은 것만 남기고 나머지 제거한다. 따라서 흰색 바운딩 박스를 선택하여 호날두 얼굴을 탐지하게 된다.
객체 탐지 모델 중 YOLO에 대해 간단히 알아보았다. YOLO 모델에 직접 가공한 데이터를 학습시켜 프로젝트에서 사용하는 영상에 적용해 보려고 한다. 과연 연속적인 이미지인 영상에서도 객체 탐지를 잘할 수 있을까? 다음 게시글에서는 객체 탐지에서 더 나아가 영상에서 탐지된 객체를 잘 따라가는 객체 트래킹에 대해 알아보려 한다.
참고자료
https://kr.mathworks.com/discovery/convolutional-neural-network.html
https://dsbook.tistory.com/79
https://docs.ultralytics.com/ko
https://roboflow.com/
https://pjreddie.com/darknet/yolo/
https://www.g2.com/articles/activation-function
도서: 이미지 처리 바이블 - 류태선