늦깎이 공대생의 인공지능 연구실
YOLO로 이해하는 이미지 객체 감지(2) - YOLO의 역사 본문
지난 글에서 우리들은 컴퓨터 비전(Computer Vision)에서의 객체 감지(Objection Detection)의 발전 과정과 이를 이해하기 위한 기계학습 및 인공신경망의 개념에 대해 살펴 보았습니다.
본 글에서는 전체적인 관점에서의 YOLO 객체 감지 알고리즘이 발전하였던 과정들을 작성하였습니다. 각 버전별 YOLO 시리즈의 구조에 대해 공부해보고자 하시는 분들께서는 해당 버전의 논문 혹은 공식 웹사이트를 참조해주시길 바랍니다.
YOLO: You Only Look Once
2016년 6월 27일, 미국 라스베이거스에서 열린 컴퓨터비전 및 패턴인식 학회인 CVPR 2016에서 YOLO가 공개되었습니다. 워싱턴 대학교 컴퓨터공학부에서 대학원을 다니던 중이었던 조셉 레드몬(Joseph Redmon)이 발표한 이 논문은 2021년 현재 약 2만여 건의 피인용수를 기록하며 공개 당시부터 많은 파장을 불러왔습니다.
그가 공개한 YOLO에서 상당한 주목을 받았던 특징은 무려 객체 감지를 실시간으로 해낸다는 점이었습니다. 기존에도 사진을 통해 이미지를 분석하는 알고리즘들이 존재하였으나 정확도를 높일수록 그만큼 동작 시간이 늘어나는 단점을 갖고 있었습니다. 높은 정확도를 보여주면서 이미지에 해당 객체에 대해 표시까지 해주는 Mask R-CNN의 경우 아무리 빨라도 5fps의 성능을 나타낸 한편 YOLO의 경우 객체 정확도가 그리 높지 않지만 실시간에 근접하는 45fps의 성능을 보여줍니다.
심지어 논문을 발표하던 그 자리에서 바로 카메라를 보여주며 성능을 과시할 정도로 YOLO의 성능은 지금 시점에도 엄청남을 알 수 있습니다.
YOLO를 이토록 실시간으로 동작할 수 있게 할 수 있었던 비결은 가장 연산 시간이 많이 걸리는 인공신경망 CNN을 단 한번만 사용한다는 점입니다. 다른 알고리즘들의 경우 정확도를 높이기 위해 한 장의 사진을 수백개의 case로 나누어서 신경망 연산을 하다보니 시간이 많이 소요되는데 YOLO의 경우 이름 그대로 CNN을 단 한 번만 사용함에도 빠른 속도로 이미지를 분류할 수 있는 것이지요!
그렇다면 YOLO는 어떻게 이미지에서 객체를 찾아낼 수 있을까요? 이를 간단하게 표현하면 다음과 같습니다.
먼저 입력 이미지를 S x S 그리드셀로 나눈 다음 각 그리드셀에서 물체의 중앙에 가까운 셀이 객체를 탐지하는 역할을 맡게됩니다. 각 그리드셀은 Bounding Box와 객체 속성 클래스에 대한 신뢰도를 추정하고 이를 가지고 이미지에서 객체를 찾아내게 됩니다.
Bounding Box는 중심좌표인 X, Y, 가로, 세로 크기 정보와 신뢰도(Confidence Score)수치를 가지고 있습니다. Score는 Bounding Box가 물체를 영역으로 제대로 잡고 있는지와 객체의 속성 클래스를 잘 예측하였는지를 나타냅니다. 본 논문에서는 Score를 간단하게 Pr(Object) ∗ IoU로 정의하고 있는데, Pr(Object)는 Bounding Box 안에 물체가 존재할 확률을 나타냅니다.
여기서 IoU는 Bounding Box에 감지된 객체가 실제 Ground Truth와 얼마나 일치하는지를 나타내는데 유용하게 사용되는 방식입니다. Ground Truth와 Bounding Box에 대해 자세히 알고싶으신 분은 아래의 자료를 참고해주시길 바랍니다.
다음으로 YOLO의 신경망 구조에 대해 알아보도록 하겠습니다. YOLO 논문에서 소개하는 신경망의 구조는 다음과 같습니다.
총 24개의 CNN 레이어 계층으로 구성되어 있으며, 기존 신경망인 GoogLeNet을 사용하여 이미지 분류에 사용하였습니다. 위 구조의 신경망을 좀 더 간단하게 표현하면 아래와 같은 단계로 구성되어 있습니다.
위의 예제 그림에 따르면 7 x 7의 그리드셀 기반의 텐서가 결과값으로 나오며 각 그리드셀은 길이 30의 벡터로 이루어진 텐서임을 알 수 있습니다.
텐서 내 각 그리드셀의 벡터 내의 30개의 값을 살펴보면 처음 5개와 그 다음 5개의 값은 Bounding Box의 중앙 x,y값과 Bounding Box의 높이h 와 너비 w, 해당 객체에 대한 신뢰도(Bounding Box 내에 객체가 있을 확률)인 c로 구성되어 있습니다. 즉 각 그리드셀 하나당 2개의 Bounding Box를 예측하고 있음을 알 수 있습니다.
그 이후 20개의 값은 학습된 20개의 객체 클래스 종류 중 해당 객체일 확률을 나타냅니다. 즉, Bounding Box의 객체가 '개'일 확률이 높다면 '개'에 해당되는 객체 클래스 인덱스의 값이 높고, 나머지는 0에 가깝게 낮을 것으로 기대할 수 있습니다.
그런데 각 그리드셀이 2개의 Bounding Box를 찾는 과정에서 다음과 같이 하나의 객체에 대해 과도한 양의 Bounding Box가 감지되는 경우가 발생합니다.
YOLO에서는 이러한 문제점을 해결하기 위해 Non-max suppresion을 사용합니다. 위의 이미지에서 보시듯이 각 그리드셀이 2개의 Bounding Box들 중에서 겹치는 내용은 모두 제거한 다음 확률이 가장 높은 Bounding Box를 남김으로서 해당 객체에 대해 Bounding Box를 올바르게 표시할 수 있도록 해즙니다.
다음으로, 학습 결과로 나타나는 Loss에 대한 식을 살펴보겠습니다.
YOLO의 Loss는 크게 3가지로 분류할 수 있으며 각 내용은 다음과 같습니다.
- 인공신경망이 예측한 Bounding Box가 Ground Truth와 얼마나 일치하는지에 대한 오차를 나타냅니다. 각 셀별로 객체가 감지된 Bounding Box를 Ground Truth와 비교하여 이를 Loss로 나타냅니다.
- Bounding Box에 객체가 있는지에 대한 여부를 나타냅니다. 해당 Bounding Box에 객체가 존재하지 않을 경우 \
(\lambda_{noobj}\)로 가중치를 부여하여 Loss를 나타냅니다. - Bounding Box와 상관 없이 해당 셀에서 객체 클래스의 신뢰도를 계산하여 Loss를 나타냅니다. 해당 셀에서 올바른 객체를 찾아냈거나 객체가 없는 등의 확률이 정확한지의 여부를 판단합니다.
위와 같은 방법으로 YOLO의 Loss를 통해 신경망이 학습을 하여 객체를 찾아내게 됩니다.
YOLO에 대해 좀 더 자세히 알고자 하시는 분께서는 아래의 자료를 참조해주세요!
YOLOv2: 9000개의 클래스를 더 좋게, 더 빠르게 더 강력하게!
2017년 7월 25일, 하외이에서 개최된 CVPR2017에서 레드몬은 YOLO의 두 번째 버전인 YOLO9000을 발표합니다. 기존의 20개의 객체를 감지해내던 YOLO에서 무려 9000개의 객체를 감지해낼 수 있다 하니 많은 발전이 이루어졌음을 직감할 수 있겠습니다.
그의 논문을 보면 기존의 논문의 틀을 완전히 벗어나 파격적인 구성을 갖추고 있는데, 무려 부제인 Better, Faster, Stronger를 문단 제목으로 만들 정도로 그의 과감함을 느낄 수 있습니다.
Better
YOLO9000은 Batch Normalization 도입 및 이미지 입력 해상도를 높임으로서 mAP(Mean Average Precision)를 향상시켰습니다. 또한 Anchor Box 개념을 도입하여 여러 크기의 Bunding Box를 만듦으로서 셀당 2개의 Bounding Box만 만들던 YOLO의 한계를 극복하였습니다.
Anchor Box 방식을 사용하게 되면 상당히 많은 Bounding Box들을 선별해야 하는데 K-means 알고리즘을 사용하여 가장 적합한 Bounding Box의 후보군을 찾습니다.
또한 Bounding Box의 중간 좌표 x,y값의 예측이 불안한 경우가 발생하였는데 YOLO 저자는 이를 그리드셀의 상대 좌표를 활용하여 Bounding Box의 정확도를 높혔습니다.
Faster
이미지 객체 감지 알고리즘의 궁극적인 목표로 로보틱스 혹은 자율주행 분야에서 정확도와 속도가 중요함을 강조하며 YOLO9000의 성능 향상을 위해 저자는 GoogLeNet 신경망을 개조하여 속도를 향상 시켰으며, 분류 및 감지 학습에 특화된 알고리즘으로 만들었습니다.
Stronger
YOLO9000은 분류 데이터(Classification data)와 감지 데이터(Detection data)를 결합하여 학습하는 방식을 사용합니다. 감지된 객체의 종류를 잘 감지해내는지, 감지된 객체의 위치를 정확히 찾아내는지, 이 두 가지를 동시에 학습할 수 있는 데이터를 별도로 구하는 것은 어려운 일입니다.
저자는 많은 양의 Label의 속성들을 WordTree 방식을 사용하여 Label을 마치 Tree 방식으로 세부 구분이 되도록 구성하였습니다. 이로서 대분류의 카테고리를 파악할 수 있어 Multi-label을 학습할 수 있게 하였습니다.
아래의 영상을 통해 YOLO9000에 대해 더 자세히 알아보실 수 있습니다.
YOLOv3
YOLO9000이 발표된지 1년만인 2019년, 레드몬은 YOLOv3 논문을 아카이브에 공개합니다. 공개된 그의 논문은 보편적인 논문에서는 결코 볼 수 없는 물음표를 쓴다던가 독특한 소제목을 사용한다던가의 특징을 나타내고 있지만 2021년 기중 9000회 이상의 피인용수를 자랑할 정도로 Object Detection 분야에서 막대한 영향력을 보여주고 있습니다.
YOLOv3는 지금까지 공개되었던 YOLO 알고리즘에 몇가지 사항들이 추가되었습니다. 이를 통해 빠른 속도로 더 정확하게 물체를 찾아낼 수 있다고 합니다.
레드몬은 YOLOv3를 끝으로 더이상 YOLO를 개발하지 않겠다고 선언하게 됩니다. 자신의 기술이 악용될 것이 우려되어 그는 개발을 중단하였지만, 다른 사람들에 의해 그의 YOLO는 지금까지도 지속적으로 발전하고 있습니다.
YOLOv4
YOLOv4는 레드몬이 아닌 다른 사람들이 최신 딥러닝 기술들을 적용하여 YOLO의 기능들을 발전시킨 내용들을 다루고 있습니다.
YOLOv4는 YOLOv3보다 성능이 10%~12% 향상되었음을 보여줍니다. 그만큼 객체 감지 관련 기술들이 상당한 발전을 이루었음을 확인할 수 있습니다. YOLOv4는 다음과 같은 부분에 대한 기여를 하였습니다.
- 단일 GPU만으로도 빠르고 정확한 객체 감지 모델을 학습시킬 수 있음.
- Bag-of-Freebian과 Bag-of-Specials 방법과 같은 최신 객체 감지 학습 방법들을 도입.
- CBN(Cross-iteration batch normalization), PAN(Path aggregation Network), SAM(Spatial Attention Module)등과 같은 알고리즘을 활용하여 인공신경망의 학습 향상에 효율적이고 적합하게 구성
YOLOv4의 전체적인 구조는 다음과 같이 되어 있습니다. 아래의 이미지는 일반적인 객체 감지 알고리즘들의 전반적인 모습들을 나타낸 자료입니다.
Backbone: 딥러닝 모델의 입력값에 대하여 학습하고자 하는 특성을 추출하는 역할을 합니다. YOLOv4에서는 CSPDarknet53을 채택하였습니다.
Neck: 다양한 크기의 feature map을 수집하기 위해 block을 추가하거나, bottom-up path와 top-down path를 집계하는 방법을 사용합니다. YOLOv4에서는 SPP와 PAN을 사용합니다.
Head: 딥러닝 알고리즘의 전반적인 구조를 구분하는 방법으로 One-Stage Detector와 Two-Stage Detector가 있습니다. 각 방식은 객체 감지 과정에서 모든 과정을 단 한번에 수행시 One-Stage Detector로, 전체 과정을 두 단계로 진행하는 경우 Two-Stage Detector로 언급합니다. YOLOv4의 경우 YOLOv3와 같이 One-Stage Detector로 구성되어 있습니다.
Bag of freebies(전처리)
Data augmentation, Loss function, Regularization등 학습에 관여하는 요소로, training cost를 증가시켜서 정확도를 높이는 방법입니다.
Bag of Specials(후처리)
학습된 모델에 대해 적은 비용으로 Inference cost를 증가시켜 Object Detection의 정확도를 향상시킵니다.
그밖의 방법들
YOLOv4에서는 최신 딥러닝 객체 인식 방법들을 최대한 동원하였습니다. 그 중 하나로 단 하나의 GPU에서 학습될 수 있도록 다음과 같은 기능들을 적용 하였습니다.
Mosaic 방법을 사용하여 4개의 이미지가 학습될 수 있도록 하여 batch-size를 줄여 많은 이미지들을 학습할 수 있게 하였습니다. 마치 한 장의 이미지에 4가지의 사진을 학습시켜 단조로운 한 장의 사진만으로 학습하는 것보다 더 많은 정보들을 다양한 위치에서 학습할 수 있게 하였습니다.
그밖에 Genetic알고리즘을 적용하여 최적의 하이퍼 파라미터 선정하였고, SAM수정, PAN수정, CmBN(Cross mini-batch Normalization)도입하여 기존의 method를 효율적으로 사용할 수 있게 수정하여 성능을 높였습니다.
그 외의 자세한 내용에 대해서는 아래의 링크를 참조 바랍니다.
YOLOv5
YOLOv5는 YOLOv4가 공개된지 얼마 되지 않아서 공개된 Pytorch로 개발된 YOLO 소스코드 입니다. 논문은 공개되지 않았으나 실사용한 사례들을 보았을 때, 기존 YOLO의 신속도와 정확도에 버금가는 역량을 보여주고 있습니다.
특히 YOLOv5의 경우 지금 이 순간 까지도 오픈소스로서 많은 사람들이 약간의 수정등을 기여하고 있으며 새로운 기능들이 추가되는 등 기존의 오픈소스들 처럼 공개 후 유지보수가 되지 않던 모습들을 보면 사용자들에게 친화적이고 최신 기능들을 활용할 수 있는 장이 될 것으로 보입니다.
여러분들도 컴퓨터의 성능이 허락된다면 YOLOv5를 사용해보실 수 있습니다. 공개된 Tutorial들을 경험해보면서 YOLO의 개발에 빠져보는 것은 어떨까요?
https://github.com/ultralytics/yolov5