[Deep Learning] Yolov5를 이용한 선수, 공 추적 프로젝트

김서현·2022년 11월 25일
1

📌 Object Detection - 축구공 감지하기

초기 세팅

로컬에서 실행을 시도하였으나 GPU 성능으로 인해, 학습 시간이 너무 오래걸려서 Google colab에서 학습시키기로 결정했다.

1. Google Colab에서 런타임 유형 "GPU"로 변경하기

상단의 런타임 - 런타임 유형 변경에 들어가서 하드웨어 가속기를 GPU로 변경한다.


2. content 디렉토리로 이동 후 yolov5 깃허브 소스 클론 받기

%cd /content
!git clone https://github.com/ultralytics/yolov5

3. yolov5 디렉토리로 이동 후 필요한 라이브러리 설치

%cd /content/yolov5/
!pip install -r requirements.txt

데이터셋 학습시키기

4. 데이터셋 다운로드 하기

나는 roboflow에서 축구공 데이터셋을 하나 선택하여 소스 코드를 다운로드 받았다.

!pip install roboflow

from roboflow import Roboflow
rf = Roboflow(api_key="FhfkvOwLXnAMUM10Fsw9")
project = rf.workspace("mftest").project("footballs-1trlz")
dataset = project.version(5).download("yolov5")

그리고 다운로드 받은 소스 코드를 실행 !

그럼 이렇게 데이터들이 다운로드 받아진다.

편의를 위해 별도로 ball_dataset 디렉토리를 만들어 📁train📁test만을 이용하여 학습시키기 위해 train, test, data.yaml을 옮겨 주었다.


5. data.yaml

학습시킬 정보가 담겨 있는 data.yaml을 열어서 내용을 수정했다.


6. 데이터셋 학습시키기

놀랍게도 모든 준비가 끝났고 이제 학습만 시켜주면 된다!

%cd /content/yolov5/

!python  train.py --img 416 --batch 16 --epochs 10 --data /content/dataset/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name ball_yolov5s_result

--img : input image 사이즈
--batch : 배치 사이즈
--epochs : 반복 횟수
--data : data.yaml 경로
--cfg : yolov5s 모델 초기 설정 yaml 파일
--weights : 학습 모델 (나는 가장 작은 yolov5s 모델을 이용해보았다.)
--name : 학습 결과가 저장될 이름

시간 관계상 우선은 epoch 수를 10번으로 설정하였고 데이터셋 크기가 커서, 학습하는데 대략 50분-1시간 정도 걸린 것 같다.

이번 학습 모델로는 가장 작은 모델인 yolov5s를 이용했는데, 이후에 weights로 어떤 모델을 사용하는 것이 가장 적합할 지 검증해보는 단계가 필요할 것 같다.


7. 학습 결과

학습이 완료되면 다음과 같이 어떤 경로에 저장되었는지 나온다.

그리고 다음 명령어를 치면 tensorboard를 통해 학습 결과에 대한 그래프를 확인할 수 있다.

%load_ext tensorboard
%tensorboard --logdir /content/yolov5/runs/

precision : 검출 결과들 중 옳게 검출한 비율
recall : 실제 옳게 검출된 결과물 중에서 옳다고 예측한 것의 비율


학습 결과가 어떤지 볼 수 있는 대표적인 지표로 mAP(Mean Average Precision)을 보는데, mAP이 클수록 정확도가 높고 작을수록 정확도가 낮다.

반복을 거듭할수록 정확도가 높아져야 한다는 점에서, mAP의 그래프가 전체적으로 부드러운 우상향의 곡선이 나와야하는데.. 아주 난리가 난 우상향이다... 예상은 했지만 다시 학습시켜야한다는 것이 아주 명백해지는 그래프인 것 같다..


그래도 train의 loss 그래프는 우하향 곡선이 잘 나온 것 같다..! val의 loss 그래프도 어느정도 우하향..이라고 할 수 있겠다.

반복을 거듭할수록 mAP는 높아지고, loss는 낮아지는 경향이어야 하는데 학습이 불충분하게 된 것이 아닌가 싶다.


최종 테스트 결과

테스트로는 유튜브에서 다음 영상을 사용하였다.
https://www.youtube.com/watch?v=Ie7fF72JiGY

!python detect.py --weights runs/train/ball_yolov5s_result2/weights/best.pt --source "https://www.youtube.com/watch?v=Ie7fF72JiGY" --conf 0.7

--weights 사용할 모델
--source 인식 대상
--conf 정확도 0.7이상만 검출!

epoch 수를 10으로 해서 저조한 정확도가 나올 것이라고 생각했는데, 기대한 것보다 공을 잘 찾아내서 아주 신기했다. 다시 한 번 학습 시킬 때 약 20번으로 epoch 수를 조정해서 다시 한번 정확도를 높이고 테스트 할 예정이다.


📌 Object Detection - 특정 팀 선수들, 축구공 감지하기

데이터셋 만들기

우리 프로젝트는 선수를 팀 별로 구별하고 공을 인식해야 하므로, 노란색 옷을 입은 선수를 학습시켜 그 선수들만을 구분할 수 있는지 테스트 해보았다.

먼저 위에서 사용한 테스트 동영상 20초 가량을 ffmpeg를 이용하여 1초당 4프레임으로 나눠 저장하였다.

ffmpeg -i train_video.mp4 -vf fps=4 test-%d.jpg

84개의 이미지가 나왔고, 그 다음은 labelImg를 이용하여 노란색 옷을 입은 선수와 공의 클래스를 각각 yello_teamball로 나누어 라벨링 작업을 하였다. (이 작업은 다른 팀원이 해주었다!!😂🥺)


그리고 train_datasettrain, valid 디렉토리를 만들어 84개의 이미지와 라벨을 train:valid=4:1로 각각 나누어 넣어주었고, data.yaml을 만들어 해당 데이터셋에 대한 정보를 써주었다. (roboflow에서 다운받은 파일처럼)

위 사진은 파일 구조에만 참고할 것.

이번 학습은 이미지 수가 적은 만큼 epoch 수를 50로 높여서 학습시켰다. 데이터셋 수가 적은 것에 비해서 높은 epoch 수는 아니지만 우선 시도해보자는 마음으로!! 약 7-10분 정도 걸린 것 같다..

학습시키는 과정은 위에서 공 detection을 했을 때와 같아서 따로 설명하지 않겠다.


최종 테스트 결과

이번 역시 데이터셋이 작다고 생각해서 사실 기대하지 않고 테스트를 했는데..!! 생각보다 detection이 너무 잘 되어서 놀랐다..

yello_team 선수보다 ball 데이터셋이 더 적었던 만큼 아무래도 ball의 정확도가 좀 떨어지지만, 여러 사람중 노란 조끼를 입고 있는 사람만 감지해낸다는 것에서 큰 의미를 얻었다고 생각한다.


결론

아직 앞으로 해내야 할 구현이 너무나도 많지만, 우리 프로젝트에 yolov5를 쓰는 것이 적합하다는 것과 또 팀 별로 사람을 인식을 할 수 있다는 것을 확인함으로써 서비스의 방향이나 세부사항이 좀 더 구체화될 수 있었다.

위에서 시도했던 학습들은 데이터셋을 늘리고 반복 수를 높여 더 정확도를 높인 학습 모델로 얻어낼 것이고, 각 객체의 좌표와 정보들을 통해 경기 분석을 구현하는 데에 힘쓸 예정이다.

1개의 댓글

comment-user-thumbnail
2022년 12월 22일

잘 읽었어요~

답글 달기