Intel AI For Future Workforce 9주차 회고록
Yolo 프로젝트
이번 세 번째 프로젝트의 키워드는 Yolo이다. 우리는 YoloV5기반으로 비눗방울 객체를 탐지하는 프로젝트를 진행했다
😥 결과
많은 개체들에 대해서도 잘 탐지하는 부분을 확인했다. 하지만 바닥에 근접할 때는 거의 탐지하지 못하는 부분을 확인했다. 예상하는 원인으로는 아래와 같다.
- Yolo의 구성은 Feature를 구성하는 Backbone, 추출된 Feature를 융합하여 성능을 높이는 Neck, Feature를 Bounding Box Parameter로 변환하는 Head로 구성되어 있다곤 하지만 결국에 본질은 CNN이기 때문에 다양한 배경 패턴이 없으면 인식을 잘 못할 것이다.
- YoloV5 공식 github 문서에서 권장하는 한 클래스당 이미지의 최소 개수는 1500장이다. 3일간에 진행해야 하는 프로젝트였기에 하나의 클래스로 진행했음에도 훈련용 데이터로 100장 가량밖에 준비하지 못했다.
상세 프로젝트 진행 내역
☝️ Project Flow
프로젝트를 진행한 과정은 아래와 같다.
- 데이터 수집
- 구글에서 크롤링한 이미지와 직접 버블건으로 비눗방울을 만들어서 찍은 사진 총 100여장 준비. 7:2:1 비율로 train, validation, test셋으로 분할
- 이미지 Annotation
- labelimg를 이용해서 이미지 어노테이션을 진행했으며, 아래와 같은 기준으로 어노테이션을 진행했다.
- 화질이 흐리더라도 어노테이션을 진행하나, 동그란 형상이 뚜렷하지 않은 비눗방울들은 하지 않는다.
- 너무 타이트하지 않게 어노테이션을 진행하되, 배경이 과하게 포함되지 않게끔 진행한다.
- 1차 학습 및 객체 탐지
- 1차로 학습을 진행했고, 사용한 파라미터는 아래와 같다.
- batch_size : 2
- epochs : 50
- weights : yolov5m
- cfg : yolov5m
- 문제 정의
- 1차 학습 이후 작은 비눗방울에 대해서는 탐지를 잘 해내지 못하는 모습을 확인했고, 이를 해결하기 위해 아래와 같은 방법들을 적용했다.
- 데이터 수정 : 어노테이션이 잘못 적용된 부분이 있는지 점검하고, 좀 더 타이트하게 어노테이션을 수정했다.
- 추가 어노테이션 : 작은 비눗방울에 대한 데이터가 부족하다고 판단하여, 너무 작아서 하지 않았던 비눗방울들까지 어노테이션을 추가로 진행했다
- 데이터 추가 수집 : 픽사베이에서 별도의 크롤링을 추가로 진행하여 총 174장의 이미지를 추가로 수집하되, 연관성이 떨어지거나 너무 흐린 사진들의 경우 삭제하여 총 34장의 이미지를 추가했다.
- 2차 학습
Yolov5 공식 Github문서에서 발견한 팁들을 이용해서 추가 학습을 진행했다.
- 34장의 이미지를 28장, 6장으로 분할하여 각각 훈련셋, 검증셋에 추가했으며 동일한 결과를 얻기 위해서 테스트셋에는 별도로 추가하지 않았다.
- Github문서에 따르면 batch_size는 hard ware가 허용하는 범위 내에서 가장 큰 값을 사용하라고 되어 있어 8로 바꾸고, epochs도 최소 권장 횟수인 300회로 늘려서 학습을 진행했다.
- Github문서에 따라 혼동행렬의
FP(False Positive)
에 해당하는(객체가 없지만, 탐지하는 부분)부분을 줄이기 위해서 권장량인 전체 데이터(102장)의 0~10%(6%에 해당하는 6장 가량을 추가했다.) background라는 class를 추가하여 데이터를 재구조화했다.
- 이러한 수정 결과를 바탕으로 작은 비눗방울까지 잘 잡아내는 모습을 확인할 수 있었고, 기존에 인식하던 비눗방울들에 대한 확률도 소폭 상승한 모습을 확인할 수 있었다.
✌️ Troubles
화면 내에 잡히고 있는 객체를 카운팅해보고 싶었다. 초기 아이디어는 아래와 같다.
- 객체 탐지 화면의 절반 이하로 객체들이 떨어질 때, 화면을 10장 가량 캡쳐하여 pytesseract를 활용해 ocr을 진행하여 string형태로 추출하고 해당 문자열을 가공하여 “bubble”이라는 글자의 개수를 카운팅
- 각 이미지에 대해 카운팅한 결과를 list에 담아 max함수를 통해 정답과 비교적 유사한 카운트 넘버를 추출
우선 결과만 놓고 얘기하자면 객체의 수가 적을때는 OCR이 잘 진행되었으나, 많아질수록 정확하게 되지 않았다.
구현이 되더라도 문제가 되는 부분은 객체가 많아짐에 따라 OCR부분만 해도 실행이 오래 걸리는 편이며, 이러한 부분이 객체 탐지 반복문 안에 들어가게 되면 더 문제가 될 것이다.
🙂마무리
아직까지 영어 원문으로 된 문서들을 보는 데에 익숙하지 않다보니 수집할 수 있는 정보들이 제한적이다. 이번 프로젝트를 통해서 원문을 보는데 조금은 익숙해진 느낌이 들긴 하지만 몇 개 읽다보면 진이 빠지는 느낌이라 영어공부도 좀 틈틈히 하면서 해야겠다..!