AI 탐구노트

[Roboflow] Soccer AI 실행 테스트 본문

DIY 테스트

[Roboflow] Soccer AI 실행 테스트

42morrow 2024. 10. 23. 22:13

 

 

스포츠 경기 영상을 보면서 경기를 분석하는 영상들을 가끔씩 보게 됩니다. 얼마 전까지만해도 이런 것들을 다 전반이 끝나고 혹은 경기 중 하이라이트 부분을 추출해서 그 부분만 나중에 분석해서 경기 중 중간중간 보여주는 방식으로, 죄다 사람들의 수작업 혹은 전문화된 프로그램에 의해 진행되었습니다. 그러다 AI가 등장하면서 이런 과정들을 AI가 처리해서 실시간 혹은 준 실시간으로 분석 결과를 영상에 입혀서 보여주는 사례들이 나오고 있습니다. (최근 올림픽에서 본 AI에 의한 업사이드 판정 수준이 아니죠) 해외의 경우, 프로축구팀들 가운데 일부는 이런 분석 시스템을 갖추고 있는 곳도 있다고 알고 있습니다. 

 

훌라~ Roboflow

 

그런데, 이런 서비스를 이제 개인이 자체로 꾸려볼 수 있게 되었습니다. Roboflow에서 sports 라는 프로젝트로 진행하고 있는 것에 Soccer AI라고 축구 경기에 적용한 사례를 공개했기 때문입니다. 축구경기 영상을 보면서 그런 생각을 했던 적이 있었죠. 개별개별로 보면 영상을 분석해서 보여줄 수 있는 기술들은 다 공개되어 있는데 결합해서 하나쯤 나와야 할 것 같은데 왜 없을까 하고 말이죠. 그렇다 하더라도 대부분 상용 제품으로 내놓을 것으로 생각했는데, 그냥 MIT 라이선스로 공개를 해 버렸습니다. 구현체 내에 사용한 모델은 Yolo 시리즈라 Ultralytics의 라이선스 부분은 빼고 말이죠... 여튼 고마운 일입니다. 

 

그래서, 이번에는 공개되어 있는 Soccer AI의 환경 구성과 설치, 그리고 실행 테스트를 해 볼 생각입니다. 물론 코드 분석을 할 계획은 없구요... 어느 정도 속도이고, 어느 정도의 리소스를 필요로 하는지 파악하는 정도까지만 해 보겠습니다. 

 

환경 구성

sports를 돌려보기 위한 환경 구성을 해 봅니다. 우선 기본 코드를 다운받고 관련된 패키지를 설치합니다.

# 가상환경 생성
$ conda create -n roboflow python=3.12
$ conda activate roboflow

# github repo clone 및 필요 패키지 설치
$ pip install git+https://github.com/roboflow/sports.git

 

이제 영상으로 본 축구경기 영상분석 데모에서 필요로 하는 패키지를 설치하고 필요 영상 데이터 등의 파일을 다운 받습니다.

# 축구영상 분석 예제 환경 구성
$ cd examples/soccer
$ pip install -r requirements.txt

# 사전학습모델 weight 및 영상 데이터 다운로드  (soccer/data 폴더 하부에 저장됨)
$ ./setup.sh

 

 

여기까지 완료되면 파일 및 폴더 구조가 아래와 같이 됩니다. weight  파일들과 테스트할 때 사용할 영상 파일, 그리고 학습 시 사용할 수 있는 jupyter notebook이 있습니다. 

soccer
├── data
│   ├── 08fd33_0.mp4
│   ├── 0bfacc_0.mp4
│   ├── 121364_0.mp4
│   ├── 2e57b9_0.mp4
│   ├── 573e61_0.mp4
│   ├── football-ball-detection.pt
│   ├── football-pitch-detection.pt
│   └── football-player-detection.pt
├── main.py
├── notebooks
│   ├── train_ball_detector.ipynb
│   ├── train_pitch_keypoint_detector.ipynb
│   └── train_player_detector.ipynb
├── README.md
├── requirements.txt
└── setup.sh

 

 

 

시나리오 별 테스트 

 

1.경기장 키포인트 감지 (soccer pitch keypoint detection)

축구 경기장 레이아웃을 감지하도록 학습된 모델의 감지 결과를 화면 상에 매칭해서 보여줍니다. 제 경우, GPU를 사용하게 되므로 device 인자값을 'cuda'로 변경해 줍니다. (기본은 cpu, Apple 실리콘 칩에서는 mps를 사용하게 될 겁니다)

$ python main.py --source_video_path data/2e57b9_0.mp4 \
    --target_video_path data/2e57b9_0-pitch-detection.mp4 \
    --device cuda --mode PITCH_DETECTION

 

 

2.선수 감지(soccer player detection)

선수만 감지할 줄 알았는데 축구공 감지가 함께 이뤄집니다. 흠... mode가 ball detection인 녀석은 왜 따로 있는건지... -_-;

$ python main.py --source_video_path data/2e57b9_0.mp4 \
    --target_video_path data/2e57b9_0-player-detection.mp4 \
    --device cuda --mode PLAYER_DETECTION

 

 

 

오류 발생. Supervision 패키지의 함수 인자 변경

TypeError: InferenceSlicer.__init__() got an unexpected keyword argument 'overlap_filter_strategy'

 

$ python main.py --source_video_path data/2e57b9_0.mp4 \
--target_video_path data/2e57b9_0-ball-detection.mp4 \
--device cuda --mode BALL_DETECTION
Traceback (most recent call last):
  File "/hdd/git/sports/examples/soccer/main.py", line 429, in <module>
    main(
  File "/hdd/git/sports/examples/soccer/main.py", line 413, in main
    for frame in frame_generator:
                 ^^^^^^^^^^^^^^^
  File "/hdd/git/sports/examples/soccer/main.py", line 227, in run_ball_detection
    slicer = sv.InferenceSlicer(
             ^^^^^^^^^^^^^^^^^^^
TypeError: InferenceSlicer.__init__() got an unexpected keyword argument 'overlap_filter_strategy'

 

 

Roboflow의 Supervision 패키지 버전 업그레이드가 되면서 매개변수 이름이 'overlap_filter_strategy' 에서 'overlap_filter'로 변경되었습니다. main.py 코드의 해당 부분을 아래와 같이 변경해 줍니다. 

 

 

3.축구공 감지 (soccer ball detection)

$ python main.py --source_video_path data/2e57b9_0.mp4 \
	--target_video_path data/2e57b9_0-ball-detection.mp4 \
	--device cuda --mode BALL_DETECTION

 

실행해 보면 어마어마하게 느립니다. 하지만, 저 작은 축구공을 어떻게 감지를 했을까 할 정도로 잘 잡아냅니다. ^^; 앞서 Player detection 예제에서도 공이 잡혔는데 왜 따로 뒀을까 생각했었는데, 이 영상에서의 공은 상대적으로 훨~씬 작아 보입니다. 그럴 수 밖에 없었을 것 같습니다. 

 

원래 이렇게 작은 축구공는 쉽지가 않은데 용케도 해 냈습니다. InferenceSlicer 객체를 통해 SAHI를 적용했기 때문인데, SAHI는 아래 예전 글에서 언급했던 것처럼 영상을 슬라이싱해서 감지 성능을 높이는 방식이라 작은 물체도 잘 감지하는 대신, 처리해야 추론 수량이 늘어 느릴 수 밖에 없어집니다. 

 

SAHI : 다양한 스케일 객체를 효과적으로 감지하기 위한 기법

다양한 크기의 물체를  효과적으로 감지하기 위해 이미지를 슬라이스로 나누어 처리한 후 합치는 기법 객체감지 모델을 통해 작은 물체를 감지하는 것은 주로 항공, 드론, 위성 사진 등에서 찍

42morrow.tistory.com

 

4.선수 트래킹

$ python main.py --source_video_path data/2e57b9_0.mp4 \
    --target_video_path data/2e57b9_0-player-tracking.mp4 \
    --device cuda --mode PLAYER_TRACKING

 

 

 

6.팀 구분

$ python main.py --source_video_path data/2e57b9_0.mp4 \
	--target_video_path data/2e57b9_0-team-classification.mp4 \
	--device cuda --mode TEAM_CLASSIFICATION

 

 

 

6.RADAR

운동장의 키포인트와 팀 구분, 선수 감지 및 트래킹 기술이 적용된 통합 버전인 듯 합니다. 공 감지까지는 포함되어 있지 않네요. 하긴 그것까지 넣으면 너무 느려져서 동작이 어려웠을 겁니다. RADAR의 경우, 약 1.6GB 가량의 GPU 메모리를 차지합니다. GPU 사용율 자체도 추론시에만 잠시 20~50% 대로 높아졌다가 다시 빠지구요. 사용률이 지속적이지 않고 들쭉날쭉하는 것으로 봐선 아무래도 최적화 부분은 크게 고려치 않은 것 같습니다. 하지만 멋집니다. 이런 결과물을 내놓다니요... ^^ 다시 한번 Roboflow 훌라~

$ python main.py --source_video_path data/2e57b9_0.mp4 \
	--target_video_path data/2e57b9_0-radar.mp4 \
	--device cuda --mode RADAR

 

 

 

소감

 

이번 글에서는 Roboflow의 Sport 그것도 Soccer AI를 테스트 해 봤습니다. RTX3090 수준에서도 실시간은 지원되지 않아 아쉽긴 했습니다. 다만, 전체 코드가 실행최적화는 안 되어 있는 것 같아 개선의 여지는 있다고 판단됩니다. 물론 누군가 해 주지 않으면 사용할 수는 없겠지만요. 이번에 공개된 코드를 이용해서 제공된 데모만 실행해 본 건 뿐이지만 그래도 아하~ 이런 식으로 할 수 있는 것이면 이걸 응용해서 이런 쪽에 활용하면 되겠다 싶은 아이디어를 얻는데는 충분했던 것 같습니다. 꼭 스포츠 쪽에만 적용할 필요도 없어 보이구요... 

 

아무쪼록 다양한 응용 사례가 나와서 그 내용도 공유되었으면 좋겠습니다.