일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- TRANSFORMER
- 서보모터
- 티스토리챌린지
- 아두이노
- LLM
- 오블완
- 가상환경
- 확산 모델
- tts
- OpenAI
- 생성형 AI
- ControlNet
- AI 기술
- 딥마인드
- 트랜스포머
- LORA
- 뉴럴링크
- 일론 머스크
- ChatGPT
- 멀티모달
- javascript
- AI
- 우분투
- 이미지 편집
- PYTHON
- 시간적 일관성
- 오픈AI
- 메타
- ubuntu
- 인공지능
- Today
- Total
AI 탐구노트
[Roboflow] Soccer AI 실행 테스트 본문
스포츠 경기 영상을 보면서 경기를 분석하는 영상들을 가끔씩 보게 됩니다. 얼마 전까지만해도 이런 것들을 다 전반이 끝나고 혹은 경기 중 하이라이트 부분을 추출해서 그 부분만 나중에 분석해서 경기 중 중간중간 보여주는 방식으로, 죄다 사람들의 수작업 혹은 전문화된 프로그램에 의해 진행되었습니다. 그러다 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는 아래 예전 글에서 언급했던 것처럼 영상을 슬라이싱해서 감지 성능을 높이는 방식이라 작은 물체도 잘 감지하는 대신, 처리해야 추론 수량이 늘어 느릴 수 밖에 없어집니다.
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 수준에서도 실시간은 지원되지 않아 아쉽긴 했습니다. 다만, 전체 코드가 실행최적화는 안 되어 있는 것 같아 개선의 여지는 있다고 판단됩니다. 물론 누군가 해 주지 않으면 사용할 수는 없겠지만요. 이번에 공개된 코드를 이용해서 제공된 데모만 실행해 본 건 뿐이지만 그래도 아하~ 이런 식으로 할 수 있는 것이면 이걸 응용해서 이런 쪽에 활용하면 되겠다 싶은 아이디어를 얻는데는 충분했던 것 같습니다. 꼭 스포츠 쪽에만 적용할 필요도 없어 보이구요...
아무쪼록 다양한 응용 사례가 나와서 그 내용도 공유되었으면 좋겠습니다.
'DIY 테스트' 카테고리의 다른 글
차량 번호판 인식 (6) | 2024.10.28 |
---|---|
To-Do 리스트 만들어보기 (2) | 2024.10.25 |
Whisper Turbo 로컬 설치 및 테스트 (4) | 2024.10.22 |
Whisper를 이용한 실시간 음성인식 (6) | 2024.10.18 |
ComfyUI에서 CivitAI LoRA 사용해 보기 (6) | 2024.10.16 |