본격적으로 YOLO로 이미지 분류를 하기 전에!
저번에 동아리에서 발표했던 YOLO리뷰를 보고 들어가겠습니다.
작성했던 스크립트와 함께 봐주시면 되겠습니다.
우선 YOLO를 알아보기 전에! 이미지 검출 모델들부터 살펴보겠습니다. 분류 모델은 하나의 이미지를 보고 이게 개인지, 고양이인지 판단하는 모델입니다. 또한 객체검출 모델은 하나의 이미지를 보고 개는 어디있는지! 판단하는 모델이 되겠습니다. |
YOLO가 등장하기 전의 방식인 DPM과 R-CNN은 다음과 같이 작동합니다. DPM방식은 이미지를 슬라이딩 윈도 방식으로 쭈루룩 훑어보며 객체를 검출하는 방식입니다. 그리고 R-CNN은 이미지안에서 bounding box를 생성하고, 분류를 통해 bounding box를 조정하며 중복을 검출하여 제거합니다. 이후 후처리를 통해 모델을 개선하는 방식이죠. 욜로는 다릅니다. 욜로는 bounding박스를 생성하고, 이 위치에 클래스 확률을 대입하여 이미지를 검출해냅니다. |
YOLO는 빠릅니다. 45fps로 객체를 구분해낼 수 있습니다. 또한 전방위적입니다. 주변 정보까지 구역을 나눠 인식하기 때문이죠. 또한 새로운 이미지에 대한 정확도도 높습니다. 여담이지만, 이러한 장점이 너무나 커서 군사적으로 사용될수도 있다는 것이 우려되어 욜로의 개발자 조셉은 연구를 중단했다고 합니다. |
욜로가 이미지를 학습하는 방법을 보겠습니다. 이미지를 입력받으면, 욜로는 우선 입력 이미지를 S 곱하기 S그리드로 나눕니다. 이후 객체의 중심에 해당하는 그리드 셀에서, B개의 bounding box에 대한 confidence score을 예측하는데요, 이는 bounding box를 그린 영역에 대하여 실제로 물체가 있는지 없는지를 판단한다고 이해하시면 되겠습니다. 이후 Class-specific confidence score를 수행합니다. 바운딩 박스에 특정 클래스 객체가 나타날 확률과 바운딩 박스가 그 클래스 객체를 포함하고 있을 확률을 더하는 과정입니다. 이렇게 되면, 최종 output 텐서는 SXSX(BX5 + C)의 크기를 갖게 됩니다. 이 예제에서, 그리드는 7X7로 나누고, 한 그리드당 2개의 Bounding box를, 객체 검출 가능한 Class는 20개라고 가정하면 아웃풋은 7X7X(2*5 + 20) 즉 1470이 되겠습니다. |
바운딩 박스에 대해 더 살펴볼까요? 바운딩 박스는 X, Y, W, H 정보와 Confidence score정보를 가지고 있습니다. XY는 박스의 중심 좌표입니다. WH는 너비와 높이에요! 확실히 이 4가지 정보를 가지고 있으면, 네모를 잘 칠수 있겠네요. Confidence score는 물체를 영역으로 잘 잡고 있는지, 클래스를 잘 예측하였는지를 나타냅니다. 이 점수는 물체가 존재할 확률 X IOU로 정하는데요, 물체가 존재할 확률 pr(object)는 왜 그자리에 있어야 하는지 이해가 가지만, IOU는 조금 생소했는데요, 왼쪽 사진을 보시면 이해가 편하시겠습니다. IOU는 겹쳐진 바운딩 박스 전체 분의 리얼 겹친 부분입니다. 그러니까 합집합분의 교집합이다! 라고 이해하시면 오히려 이해가 편하실 수 있겠네요. |
네트워크 디자인도 살펴보겠습니다. 조셉은 구글넷에서 영감을 받아 네트워크를 디자인하게 되었다고 합니다. 사진에서 보실 수 있는 주황색 박스 부분은 선행 학습 과정입니다. 미리 1000개의 클래스를 이미지넷을 활용하여 훈련했다고 합니다. 20개의 컨벌루션 계층과 1주일 동안 진행했고, 88%의 정확도를 가지게 되었다고 합니다. 원래는 224*224*3의 이미지로 학습하려 했으나, 왠지 흐릿한 이미지가 더 학습이 잘된다는 이유로 448*448*3의 크기로 확장하여 학습하였다고 합니다. 여기 노란 박스 부분은 reduction layer부분입니다. 이 부분에서는 레이어의 수를 줄이는 역할을 맡고 있습니다. 마지막으로 파란 박스 부분은 실제로 학습하는 부분입니다. 이곳에서는 전달받은 피쳐를 이용하여 class probability와 바운딩 박스를 학습하고 예측하게 됩니다. 이제 Classification용 데이터 셋을 object detection 모델로 변형한다고 보면 되겠죠! 리키드 렐루, loss함수 등을 활용하여 최종 결과로 클래스 확률과 bounding box의 위치 정보를 뽑아냅니다. |
그러면 loss 함수에 대해서 살펴보겠습니다. 손실함수의 설계 원칙은 세개입니다. 첫번째, 이미지를 분류하는 문제를 바운딩 박스로 만드는 문제로 생각한다. 이 과정에서 sum square Error를 사용합니다. 두번째, 바운딩 박스를 잘 그렸는지 판단하는 문제인 localization error와 바운딩 박스 안의 물체를 잘 분류했는지 평가하는 분류 문제인 Classification Error의 패널티를 다르게 평가합니다. 특히 박스 안의 물체가 없는 경우는 확실히 배제해야겠죠! 따라서 이러한 경우를 0으로 만들기 위해 localization error에 더 큰 패널티를 줍니다. 세번째, IOU수치가 높은 것이 학습에 많이 참여하도록 독려합니다. 이는 바운딩 박스를 잘 만든 셀에 높은 Confidence score를 주고 나머지 셀에는 나중에 Non-max suppression을 통한 최적화를 적용시키기 위함입니다. 그러면 식을 살펴보겠습니다. |
위 세줄은 localization error에 관한 부분입니다. 이 부분부터 살펴보겠습니다. 대원칙에서 localization error에 더 큰 패널티를 준다고 했죠?? 그래서 여기 이 λ_coord부분은 5가 주어집니다. 이렇게 하면 5배나 진심으로 본다는 얘기니까, 확실히 패널티가 늘어나겠네요! 다음 이 기호는 if문으로 읽으시면 되겠습니다. 그러니까 이 초록색 박스의 기호를 읽어보자면 만약 i,j에 물체가 있다면! SSD거리를 더하라는 의미가 되겠습니다. 이는 아까 말씀드린 대원칙 2번, 로컬라이제이션 에러에 더 큰 패널티를 부과한다!는 규칙이 적용된 결과라고 보실 수 있겠네요. 자세히 보시면, 입력된 x,y,w,h와 라벨링 된 x,y,w,h의 거리를 구하는 모습을 보실 수 있습니다. 아래 남색 박스는 클래스를 얼마나 구별 잘했는지 거리를 구하고 있네요. 아래 세줄은 Classification error를 판단하는 부분입니다. 파란 박스 3번 기호는 해당 셀에 객체가 없는 경우, 그러니까 배경인 경우에 0.5를 곱해주어 패널티를 낮춰줍니다. 이렇게 하면 학습에 영향이 적어지겠죠! 이제 만약 물체가 I,j그리드에 없다면 클래스 분류 문제와의 거리를 구하는 모습을 보실 수 있어요. 이렇게 하면 바운딩 박스를 잘 못만들어도, 나중에 NMS를 통해 최적화하기가 쉬워집니다. 마지막 남색 6번 기호는 바운딩 박스화는 관계없이 각 셀마나 클래스를 분류하기 위한 오차를 나타내는 부분입니다. |
YOLO는 객체의 크기가 크거나 객체가 그리드 셀 경계에 있는 경우, 그 객체에 대한 바운딩 박스가 여러 개 생기는 다중검출 문제가 있습니다. 이러한 경우, NMS 즉, non- maximal suppression이라는 방법을 통해 개선하게 됩니다. NMS방법을 사용하면 먼 셀의 Bounding Box는 Confidence score가 낮게 나와 제거되고, 최종적으로 여러 개의 Bounding Box를 합치는 과정을 통해 객체만을 탐지하는 Bounding Box만 남게 됩니다. |
YOLO도 문제가 있습니다. 만약 하나의 그리드 안에 새떼가 군집해있다면, 이를 잘 검출해내지 못하게 됩니다. 또한 큰 바운딩 박스와 작은 바운딩 박스의 Loss에 대해 동일한 가중치를 두기 때문에 부정확한 localization문제도 가지고 있습니다. |
오늘의 결론. 욜로는 아주 빠르다. 정확한거는 조금 부족하다. 새로운 이미지에서도 강하다입니다. |
'머신러닝 > JetsonNANO와 YOLO!' 카테고리의 다른 글
(중) Colab과 Darknet으로 YOLO를 학습시켜보자! (1) | 2021.11.17 |
---|---|
(상) Colab과 Darknet으로 YOLO를 학습시켜보자! (8) | 2021.10.05 |
YOLO Darknet을 학습해야 하는데 XML이나 Json으로 라벨을 붙인 나를 위한 Roboflow! (9) | 2021.10.04 |
이미지 라벨링 쉽게하기! Labelme (0) | 2021.10.03 |
Jetson NANO야, 반갑다~ (0) | 2021.10.02 |