[Intel] 9주차 회고록

LHW·2023년 9월 8일
0

Intel교육과정

목록 보기
9/15
post-thumbnail

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

프로젝트를 진행한 과정은 아래와 같다.

  1. 데이터 수집
  • 구글에서 크롤링한 이미지와 직접 버블건으로 비눗방울을 만들어서 찍은 사진 총 100여장 준비. 7:2:1 비율로 train, validation, test셋으로 분할
  1. 이미지 Annotation
  • labelimg를 이용해서 이미지 어노테이션을 진행했으며, 아래와 같은 기준으로 어노테이션을 진행했다.
    • 화질이 흐리더라도 어노테이션을 진행하나, 동그란 형상이 뚜렷하지 않은 비눗방울들은 하지 않는다.
    • 너무 타이트하지 않게 어노테이션을 진행하되, 배경이 과하게 포함되지 않게끔 진행한다.
  1. 1차 학습 및 객체 탐지
  • 1차로 학습을 진행했고, 사용한 파라미터는 아래와 같다.
    • batch_size : 2
    • epochs : 50
    • weights : yolov5m
    • cfg : yolov5m
  1. 문제 정의
  • 1차 학습 이후 작은 비눗방울에 대해서는 탐지를 잘 해내지 못하는 모습을 확인했고, 이를 해결하기 위해 아래와 같은 방법들을 적용했다.
    • 데이터 수정 : 어노테이션이 잘못 적용된 부분이 있는지 점검하고, 좀 더 타이트하게 어노테이션을 수정했다.
    • 추가 어노테이션 : 작은 비눗방울에 대한 데이터가 부족하다고 판단하여, 너무 작아서 하지 않았던 비눗방울들까지 어노테이션을 추가로 진행했다
    • 데이터 추가 수집 : 픽사베이에서 별도의 크롤링을 추가로 진행하여 총 174장의 이미지를 추가로 수집하되, 연관성이 떨어지거나 너무 흐린 사진들의 경우 삭제하여 총 34장의 이미지를 추가했다.
  1. 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부분만 해도 실행이 오래 걸리는 편이며, 이러한 부분이 객체 탐지 반복문 안에 들어가게 되면 더 문제가 될 것이다.

🙂마무리

아직까지 영어 원문으로 된 문서들을 보는 데에 익숙하지 않다보니 수집할 수 있는 정보들이 제한적이다. 이번 프로젝트를 통해서 원문을 보는데 조금은 익숙해진 느낌이 들긴 하지만 몇 개 읽다보면 진이 빠지는 느낌이라 영어공부도 좀 틈틈히 하면서 해야겠다..!

profile
하루가 다르게 성장하기

0개의 댓글