관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

합성곱 신경망 11 - 객체 탐지 3 : YOLO 객체 탐지 2 <나만의 YOLO 모델 생성> 본문

인공지능/딥러닝

합성곱 신경망 11 - 객체 탐지 3 : YOLO 객체 탐지 2 <나만의 YOLO 모델 생성>

huenuri 2024. 10. 31. 08:03

 

나만의 YOLO 모델을 만드는 부분의 내용이 길어서 포스트를 나누어서 작성하기로 했다. 이 내용은 수업에서도 다루지 않던 내용이고 처음 해보는 거라 많이 어려웠다.


 

 

나만의 YOLO 모델 생성하기

Darknet 수준의 YOLO 모델을 개인이 학습하기에는 컴퓨터 리소스가 너무 많이 필요하고, 시간이 많이 걸린다는 문제가 있다. 대신 검은색 바탕에 간단한 도형 3개만 탐지하는 YOLO 모델을 만들어보고, YOLO 모델을 더 쉽게 이해하자.

 

앞의 그림을 보면 YOLO 논문에서는 이미지를 가로, 세로 각각 7개의 셀로 나누어 총 49 셀을 기본으로 하지만, 우리는 가로, 세로 3개의 세로로 나누는 방식으로 문제를 단순화한다. 또한 논문에서는 한 셀 당 2개의 박스를 그리지만, 우리는 한 셀당 1개의 박스를 그리는 방식으로 수정한다. 마지막으로 탐지할 객체의 종류인 Class도 3개로 줄여서 구현한다.

 

 

 

 

 

실습을 위해 자료실에서 제공하는 3개의 이미지 파일을 사용한다. 자료실에 있는 0, 1, 2 png 파일을 다운 받아서 내 작업 디렉터리 공간에 넣어주었다. 

 

 

코드를 실행할 때마다 모양이 조금씩 달라진다.

 

 

 

 

 

실습을 위해 앞에서 생성한 이미지와 클래스(또는 예측값)를 입력해 주면, 탐지한 이미지에 박스를 그려주는 함수를 정의한다. 함수를 실행하면 경계 박스를 찾아서 표시해 준다.

 

 

 

 

모델이 어느 정도 성능을 갖기 위해서는 복잡한 구조로 구현되어야 한다. 전이 학습 방법을 적용하여 이미지 특징을 추출하는데 좋은 성능을 갖는 모델을 기본으로 활용하는 것이 좋다.

다음 코드에서는 VGG16 모델을 베이스로 사용하고, Conv2D 층과 Dense 레이어를 마지막 객체 탐지 분류기로 설정해 준다. 모델 구조를 요약해서 확인한다.

 

 

이미지를 총 9개(3 * 3)의 셀로 나누고, 셀마다 학습을 진행한다. 객체가 있는 셀의 경우 확률/ 박스 위치 및 크기/ 클래스 종류 모두 학습을 진행하고, 객체가 없는 셀은 객체가 없는 확률만 학습한다. 각 Loss는 미리 정한 비중을 곱하고 전체를 더해 최종 Loss를 만들어 모델을 학습한다.

 

 

 

 

에포크를 1만 5천 번까지 실행시켰지만 도저히 끝날 것 같지 않아 30분이 넘었을 때 중단했다. 그리고 에포크를 1000으로 줄여보았다.


 

 

 

코드 다시 실행하기

 

 

 

 

학습 과정은 동영상 파일로 저장된다. 코랩 폴더에서 동영상 파일을 로컬 PC로 다운로드한다. 

 

 

 

 

조금 길게 에포크를 잡았으면 학습이 더 잘 되는 것이 보일 텐데 이 정도로 만족하기로 했다.

 

 

 

 

 

 

코드를 끝까지 실행한 후 영상이 어떻게 달라지는지 궁금하여 또 다시 40분 이상 투자하여 돌려보았다. GPU를 다 쓴 게 아까울 정도로 정말 허접한 영상이 출력되었다. 1천번으로 한정했을 때와 별 다른 차이는 없었다.


 

 

학습을 마치고

사실 책에 나온 이 부분은 3년 전 코드라 과연 실행이 될지 의문이었지만 몇 가지 코드를 수정하며 잘해볼 수 있었다. 이처럼 코드를 이해하고 실습할 수 있다는 것이 신기할 따름이다. 나의 개발 실력이 1년 전에 비해 일취월장했음을 가늠해 볼 수 있는 시간이었다.

사실 코드를 실행하는 시간이 너무 길어서 학습일지도 늦게 써본다. 오늘은 블로그 일지를 별로 많이 못 올릴 것 같다. 어제부터 AICON 행사가 있는데 거기 참석해보고 싶어서 내일까지는 무척 바쁠 것 같다.

 

딥러닝 공부는 많이 하지 못하겠지만 현장에 가보면 정말 많은 것들을 느끼고 배울 수 있다.