상태: 초안 (2026-10-26), 실측 반영. 「논문」이라고 적은 숫자는 원 논문·공식 저장소를 열어 확인한 값이고, 그 밖의 숫자는 우리가 공개 영상과 합성 그림으로 직접 잰 값입니다. 휴대폰 현장 영상의 정확도는 미실측입니다. 논문 서지 중 원문을 끝까지 확인하지 못한 것은 참고문헌에 그렇게 적었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.
목차
- 1. 지도: 어떤 모델이 어디서 도나
- 2. 공: 좌표를 맞히지 말고 지도를 그린다
- 3. 탁구대: 찾기, 확인하기, 따라가기
- 4. 우리가 학습한 셋
- 5. 자세와 소리: 넣지 않은 신호
- 6. 정리
- 참고문헌
- 함께 읽기
1. 지도: 어떤 모델이 어디서 도나
자동 판정의 인식 부분은 모델 몇 개와 고전 알고리즘 몇 개의 조합입니다.
| 자리 | 쓰는 것 | 종류 | 학습 |
|---|---|---|---|
| 공 찾기 | BlurBall | 신경망(149만 파라미터) | 저자 가중치 그대로 |
| 탁구대 찾기 | EfficientTAM S → 색 기반 | 분할 모델 + 후처리 | 저자 가중치 그대로 |
| 탁구대 꼭짓점 | 얼린 EfficientTAM 인코더 + 작은 머리 | 신경망(머리 약 64만) | 우리가 학습(2026-10-25) |
| 탁구대 따라가기 | 피라미드 Lucas–Kanade + RANSAC | 고전 알고리즘 | 없음 |
| 화면 → 탁구대 평면 | 호모그래피 | 기하 | 없음 |
| 가짜 바운드 거르기 | 1D CNN | 신경망(1.8만) | 우리가 학습(2026-10-13) |
| 「확인 필요」 | 로지스틱 회귀 | 19특징 선형 | 우리가 학습(2026-10-14·16) |
| 이벤트·심판 | 손으로 쓴 규칙 | 규칙 | 없음(3편) |
| 자세 | RTMPose | 신경망 | 코칭에만, 점수에는 안 씀 |
| 소리 | — | — | 엔진에 안 넣음 |
이 글은 위에서부터 차례로 원리를 설명하고, 논문의 생각과 우리 쓰임을 나란히 적습니다. 공·탁구대 모델의 계보는 앞 시리즈 2편·3편에 더 자세히 있으니, 여기서는 요점을 다시 적고 그 뒤에 달라진 것과 우리가 학습한 것에 무게를 둡니다.
2. 공: 좌표를 맞히지 말고 지도를 그린다
왜 어려운가
탁구공은 지름 40mm 입니다. 512×288 로 줄인 화면에서는 몇 화소이고, 빠른 공은 한 프레임 노출 동안 길게 번져 흐린 줄무늬가 됩니다. 라켓과 몸에 자주 가리고, 흰 공은 흰 옷·조명·벽 무늬와 헷갈립니다.
계보: TrackNet → WASB → BlurBall
TrackNet(2019)[3]은 두 가지 생각을 보였습니다. 첫째, 공의 (x, y) 를 숫자 두 개로 바로 맞히지 말고, 공이 있을 법한 곳에 언덕이 솟은 열지도(heatmap)를 그리게 합니다. 합성곱 신경망은 위치마다 같은 판단을 하는 구조라 공간 지도를 내는 일이 구조에 맞고, 부드러운 정답 덕에 학습이 안정됩니다. 둘째, 연속 3프레임을 함께 넣습니다. 한 장에서는 흰 점이 공인지 먼지인지 모르지만, 세 장을 보면 움직이는 것이 공입니다.
WASB(2023)[2]는 여러 종목에 통하는 기준선을 목표로 세 가지를 묶었습니다. 해상도를 끝까지 지키는 작은 HRNet 계열 백본[16], 거리에 따라 줄어드는 실수 열지도와 quality focal loss, 그리고 등가속도 운동 모델로 다음 위치를 예측해 먼 후보를 버리는 추론입니다.
BlurBall(2025–2026)[1]은 우리 공 모델입니다. 핵심은 라벨을 다는 자리입니다. 기존 데이터셋은 번진 공의 앞끝을 공 위치로 찍었는데, 논문은 이것이 비대칭이고 번짐에 담긴 속도 정보를 버린다고 지적합니다. 그래서 공 위치를 번짐의 가운데에 찍고, 번짐의 방향(θ)과 반길이(l)를 함께 라벨로 답니다. 정답 열지도도 점 하나가 아니라 번짐 양끝을 잇는 줄무늬 전체를 덮습니다. 구조는 WASB 의 HRNet 백본에 채널 주의(Squeeze-and-Excitation)를 더한 것입니다.
출력 열지도를 문턱(논문 0.7)으로 잘라 덩어리를 만들고, 그 화소들에 주성분 분석(PCA)을 하면 주축 방향이 번짐 각도, 주축 위 투영 범위의 절반이 번짐 길이가 됩니다. 신뢰도는 덩어리 값의 평균입니다. 합을 쓰면 긴 번짐이 유리해지기 때문입니다(논문). 번짐 벡터는 노출 시간 동안의 속도 단서라, 논문은 첫 3프레임에 2차 다항식을 맞출 때 그것을 함께 넣어 궤적 예측 평균 오차를 84.4px 에서 53.0px 로 줄였다고 보고합니다(논문). 우리는 아직 번짐 방향을 판정에 쓰지 않습니다. 번짐을 속도로 바꾸려면 카메라 노출 시간을 알아야 하는데, 휴대폰은 노출이 프레임마다 바뀔 수 있기 때문입니다.
우리 쓰임
- 가중치 5.8MB, 입력은 512×288 프레임 3장의 창입니다. 실시간 경로는 창의 마지막 프레임 열지도만 씁니다(미래 프레임을 기다리지 않으려고).
- 저자 가중치를 미세조정 없이 그대로 씁니다. 읽을 때 sha256 을 대조하고
weights_only=True로만 읽습니다(1편). - 후보가 여럿이면 직전 공 위치에서 512 화면 기준 80px 안의 후보 중 점수가 가장 높은 것을 고릅니다. WASB 의 「예측에서 먼 후보 버리기」를 아주 단순하게 줄인 것입니다.
- 공 찾기 직전에 프레임마다 밝기의 0.5%·99.5% 분위를 0·255 로 늘립니다(
TTSCORE_BRIGHTEN, 학습 없음). 합성 「어두움」 조건(밝기 ×0.25 + 잡음)에서 실시간 경로 그대로 시험 7경기 맞음이 34 에서 51 로 올랐고(McNemar p=0.0001), 깨끗한 영상에서는 53 대 54 로 손해가 유의하지 않았습니다(2026-10-14, 원장 E18). 계산은 노트북 CPU 에서 중앙 1.6ms 입니다. 실제 어두운 탁구장 휴대폰 영상의 이득은 미실측입니다.
실측
| 측정 | 조건 | 값 |
|---|---|---|
| 정밀도 / 재현율 | 공개 시험 7경기, 60fps, 표식 3,483프레임, 512×288 반경 5px, 서버 GPU(24GB급)(2026-10-11) | 0.9817 / 0.9785, 위치 RMSE 0.594px |
| 속도 | 같은 GPU, fp32, 창 하나 | 3.42ms/프레임 |
| 다른 연구실 영상 | 연구실 3경기, 옆면 / 비스듬히 | 0.929 / 0.860, 0.894 / 0.820 |
| 국제 중계 | 정답이 사람 라벨이 아니라 자동 추적 결과(그래서 「일치도」) | 0.815 / 0.722 |
공개 시험 경기에서 거의 완벽한 이유 하나는 조심해서 읽어야 합니다. BlurBall 학습 영상 목록이 공개되지 않아, 우리가 시험에 쓰는 공개 경기와 겹치는지 모릅니다. 그래서 이 숫자를 일반화 성능으로 읽지 않고, 다른 연구실·중계 영상의 숫자를 함께 적습니다.
미세조정해 본 판: 꺼 둔 이유
복잡한 배경과 어두운 조건에 강하게 만들려고 운영 가중치를 선생으로 한 자기 증류 미세조정판(clutter-v1)을 만들었습니다(원장 E31). 깨끗한 영상 20%·복잡한 배경 40%·어두움·저해상도·번짐·JPEG·손떨림·30fps 를 섞어 노트북 GPU(8GB급) 1회용 파드에서 69분, 8,934걸음 학습했고, 합성 열화에서 공 재현율이 강한 열화 0.752 → 0.949, 어두움 0.685 → 0.924 로 올랐습니다. 그러나 실제 경로 시험에서 켜는 조건 하나(「놓친 오답이 운영보다 많지 않을 것」, 10 대 8)를 채우지 못해 꺼 두었습니다.
3. 탁구대: 찾기, 확인하기, 따라가기
공이 「어느 쪽에 떨어졌나」를 알려면 탁구대의 네 꼭짓점이 필요합니다. 탁구대 일은 세 단계입니다. 경기 시작 전에 한 번 찾고, 찾은 사각형이 정말 탁구대인지 확인하고, 그 뒤에는 매 프레임 따라갑니다.
찾기 사슬
찾기는 모델 여러 개를 순서대로 시도하고, 실패하면 다음으로 내려가는 사슬입니다(live/tablemodels.py). 실시간 작업자 설정은 sam3 → efficienttam → color 이지만, 첫 칸의 SAM 3 는 아래 이유로 실제로는 불러지지 않아 EfficientTAM S → 색 기반 으로 돕니다(2026-10-25 운영 작업자 상태 확인, 원장 E44). 녹화본 작업자는 efficienttam → sam2 → color 입니다.
SAM 2[4]는 영상을 한 프레임씩 흘려보내며 분할하는 모델입니다. 프레임마다 이미지 인코더가 한 번 돌고, 현재 프레임 특징이 메모리 뱅크(최근 프레임들과 사용자가 점·상자를 준 프레임들의 특징)에 교차 주의를 걸어 과거에 분할했던 물체를 기억하며 현재 프레임을 봅니다. 물체가 이 프레임에 보이는지를 따로 예측하는 가림 머리도 있습니다. 우리 쓰임에서는 「탁구대 자리에 점 몇 개를 찍어 주면 그 물체의 마스크를 낸다」는 프롬프트 분할이 핵심입니다.
EfficientTAM[5]은 SAM 2 를 가볍게 만든 모델입니다. 논문은 SAM 2 가 무거운 이유를 계층형 이미지 인코더와 메모리 모듈로 보고, 인코더를 계층 없는 평범한 ViT(Tiny/Small)로 바꾸고, 메모리 속 공간 토큰이 이웃끼리 거의 같다는 성질을 이용해 키·값을 2×2 로 평균 풀링해 토큰 수를 1/4 로 줄였습니다. 논문은 SAM 2(HieraB+)와 비슷한 정확도에 A100 에서 약 2배 빠르고 파라미터가 약 2.4배 적다고 보고합니다(논문). 크기는 Ti 1,800만, S 3,400만입니다. 휴대폰 속도는 논문의 초록과 본문 표의 숫자가 서로 맞지 않아 여기 옮기지 않습니다.
SAM 3[6]는 「table tennis table」 같은 짧은 글자로 그 개념에 해당하는 물체를 모두 찾습니다. 「그 개념이 이 그림에 있나」를 따로 판단하는 presence token 으로 「있나?」와 「어디?」를 떼어 놓은 것이 특징입니다. 사람이 점을 찍지 않아도 되니 첫 프레임 자동 초기화에 가장 잘 맞는 원리입니다. 그런데 우리는 아직 못 씁니다.
- 가중치가 접근 승인을 받아야 받을 수 있는 방식(게이트)이고, 승인 전에는 받을 수 없습니다.
- 작업자 이미지가 파이썬 3.11 인데 SAM 3 는 3.12 이상을 요구해, 불러오는 단계에서 실패하고 다음 칸으로 내려갑니다. 1편의 「이미지를 굽지 않고 코드를 얹는」 배포 방식이 치르는 값입니다.
- 8억 4,800만 파라미터로 무겁습니다. 실시간 루프보다 초기화나 라벨링 보조에 어울립니다.
- 라이선스(SAM License)는 조문상 상업 사용을 막지 않지만, Apache·MIT 와 달리 약관 일방 변경, 소송 시 종료, 역공학 금지, 수출 통제 조건이 붙습니다. 상업 서비스에서 쓰려면 법률 검토가 먼저입니다.
색 기반은 GPU 가 없을 때의 대체 경로입니다. 탁구대 윗면 색과 흰 선으로 사각형을 찾습니다. 서버 쪽은 ttscore/tablefind.py, 브라우저 쪽에도 같은 생각의 사본이 있습니다.
| 모델 | 짚기 없이 꼭짓점 넷이 모두 20px 안 |
|---|---|
| EfficientTAM S | 57% |
| EfficientTAM Ti | 53% |
| SAM 2.1 tiny | 45% |
| 색 기반 | 9% |
조건: 공개 묶음의 찾기 조건 일곱 × 103장 = 721장, 같은 후처리, 2026-10-13(docs/tt/PERFORMANCE.md 2.12). 그래서 운영 첫 칸이 EfficientTAM S 입니다.
찾은 사각형 다시 보기
분할 모델이 「뭔가」를 찾았다고 그게 탁구대라는 보장은 없습니다. 찾은 사각형을 일곱 가지 검사로 다시 봅니다(ttscore/tablecheck.py, 검사 이름 color·facing·tall·flat·uneven·spill·noline). 윗면 색이 탁구대다운가, 사각형의 방향과 높이·납작함이 탁구대다운가, 변 길이가 고르나, 탁구대 밖으로 넘치나, 흰 선이 보이나 같은 것들입니다. 하나라도 걸리면 신뢰도를 「확실」 문턱 0.55 아래로 내리고, 화면은 사람에게 「톡 짚어 주세요」(탁구대를 한 번 톡) 또는 「직접 짚어 주세요」(네 꼭짓점을 직접)를 청합니다.
따라가기: 피라미드 Lucas–Kanade 와 RANSAC
찾기는 1–2초 걸리는 무거운 일이라 매 프레임 할 수 없습니다. 휴대폰이 흔들리거나 중계 카메라가 움직여도 꼭짓점을 놓치지 않게, 찾은 뒤에는 광류로 따라갑니다(live/tablecv.py).
- Lucas–Kanade[9]: 「작은 창 안의 밝기는 움직여도 그대로」라고 가정하고, 영상의 공간 기울기로 두 영상의 어긋남을 반복해 구합니다. 창 하나에 대한 작은 최소제곱 문제라 빠릅니다.
- 피라미드[10]: 큰 움직임은 작은 창으로 못 잡으므로, 영상을 여러 단계로 줄인 피라미드의 맨 위에서 대략의 이동을 구해 아래 단계로 넘기며 다듬습니다. 우리 설정은 창 21×21, 피라미드는 원본 위로 세 층까지입니다.
- 좋은 특징점[11]: 기울기 행렬의 작은 고유값이 큰 점(모서리)이 잘 따라가집니다. 탁구대 사각형을 12% 넓힌 자리(흰 선·네트·모서리·다리)에서 먼저 고르고, 무늬 없는 윗면이라 점이 모자라면 화면 전체에서 채웁니다. 손떨림은 화면 전체가 같이 돌기 때문입니다.
- 앞뒤 왕복 검사와 RANSAC[14]: 선수와 공처럼 따로 움직이는 점은 버려야 합니다. 기준 → 지금으로 옮긴 점을 다시 지금 → 기준으로 옮겨 1.5px 넘게 어긋나면 버리고, 남은 점으로 RANSAC 호모그래피(3px 문턱)를 구합니다.
- 누적 오차 막기: 프레임끼리 이어 붙이면 오차가 쌓이므로, 늘 기준 화면에서 바로 지금 프레임으로 옮깁니다. 직전 프레임의 결과는 첫 추정으로만 줍니다.
- 컷과 되찾기: 64×36 으로 줄인 화면의 차이로 화면 전환(컷)을 알아채고, 컷 뒤 같은 카메라 화면으로 돌아오면 저장해 둔 기준 화면(최대 4장)의 ORB 특징으로 모델 없이 바로 맞춥니다.
조밀 광류인 Farnebäck[12]은 화면 전체의 움직임 양을 재는 실험에만 썼고, 탁구대 따라가기에는 희소한 Lucas–Kanade 가 맞았습니다. 움직이는 것은 사각형 하나뿐이고 매 프레임 싸야 하기 때문입니다.
왜 따라가기가 그렇게 중요한지는 합성 실험이 보여 줍니다(2026-10-13, 원장 E12). 공 좌표를 화면 그대로 쓰면 카메라가 팬·줌하는 영상에서 시험 경기 맞음이 50 에서 24–40 으로 무너졌고, 정답 호모그래피로 평면에 되돌리면 완전히 돌아왔습니다. 더 흥미로운 발견은 정확도보다 떨림이 판정을 깬다는 것입니다. 프레임마다 따로 추정한 호모그래피는 2px 떨림만으로 5–10랠리를 잃었지만, 오차가 시간적으로 이어지는(전파형) 추정은 5px 오차에서도 상한과 같았습니다. 바운드 판정은 화면 y 의 V 모양을 보는데, 프레임 사이 떨림이 가짜 V 를 만들기 때문입니다. 그래서 운영은 매 프레임 광류(60Hz)로 매끄럽게 따라갑니다.
네 꼭짓점에서 탁구대 평면으로: 호모그래피
평면 위의 점은 카메라 영상에서 3×3 행렬 H 하나로 옮겨집니다[13]. H 는 배율을 빼면 8자유도이고, 대응점 한 쌍이 식 두 개를 주므로 4쌍이면 정해집니다(넷 중 셋이 한 직선 위에 있으면 안 됨). 화면의 네 꼭짓점 ↔ 실제 탁구대 네 꼭짓점(2.74m × 1.525m)으로 H 를 만들면, 바운드 순간의 공을 미터 단위의 탁구대 좌표로 옮길 수 있습니다(ttscore/table.py).
두 가지 함정이 있습니다.
- 평면 위의 점에만 맞습니다. 공중의 공은 평면에 있지 않으므로, 공이 탁구대에 닿는 순간에만 씁니다. 바운드 순간 공 중심도 닿은 점보다 반지름 20mm 위라 그만큼 보정합니다.
- 네 점만으로는 어느 변이 긴 변인지 모릅니다. 어떤 사각형도 두 가지로 직사각형에 옮길 수 있습니다. 코드는 사람이나 데이터가 끝 변을 알려 주면 그것을, 아니면 탁구대 두 반에 하나씩 찍은 점을, 그것도 없으면 두 소실점의 직교 조건으로 초점거리를 구해 실제 길이 비를 계산해 정합니다.
4. 우리가 학습한 셋
여기부터는 저자 가중치가 아니라 우리가 직접 학습한 모델입니다. 셋 다 작고, 셋 다 「규칙이나 큰 모델이 이미 한 일을 거르거나 확인하는」 자리에 있습니다.
① 가짜 바운드 거르기: 1.8만 파라미터 1D CNN
문제. 3편의 심판은 바운드 하나가 틀리면 순서가 통째로 어긋납니다. 규칙이 낸 바운드에는 타구를 바운드로 읽은 것, 네트를 넘는 공이 흔들린 것 같은 가짜가 섞입니다.
모델. 공 궤적의 짧은 창을 보는 작은 1D 합성곱 신경망입니다(ttscore/bounceveto.py). 입력은 판단 프레임과 그 앞 16프레임의 특징 9개(공이 보이나, 검출 신뢰도, 네트 기준 x·y, 속도, 탁구대 윗면 위인가, 네트 띠 안인가, 끝 밖인가)이고, 합성곱 세 층 뒤 작은 MLP 가 바운드·타구·네트 통과의 확률을 냅니다. 파라미터는 18,179개입니다.
쓰는 법: 거르기만. 이 모델로 바운드를 새로 만들지 않고, 규칙이 낸 바운드 중 ±2프레임 확률이 모두 0.3 아래인 것만 버립니다. 이 결정은 실험에서 나왔습니다. 모델만으로 바운드를 찍게 하면 앞보기 없이(미래 프레임 0) 쓸 때 무너졌고(바운드 직후를 못 봐 확률이 앞으로 퍼짐), 거르기는 규칙이 이미 자리를 잡아 주므로 앞보기 0 으로 충분했습니다(원장 E01). 그래서 지연 추가가 0 이고, 계산은 노트북 CPU 에서 프레임당 약 0.1ms 입니다.
학습. 공 궤적과 바운드·네트·타구 표식으로, 60fps 짝수 프레임 + 30fps 사본 + 좌표를 15%·30% 가린 사본을 섞어 배웠습니다. 노트북 CPU 로 학습했습니다(2026-10-13, 원장 E01·E05). 30fps 사본을 섞은 이유는 처음 판이 30fps 입력에서 오히려 6–11%p 무너졌기 때문입니다(분포 밖). 섞은 판은 30fps 에서 손해가 없어졌습니다. 이후 학습형 모듈은 늘 30fps 사본을 섞는다는 규칙(원장 Ruling R2)이 여기서 생겼습니다.
실측(실시간 경로 그대로, 공개 시험 7경기 × 열화 11조건, 랠리×조건 627, 2026-10-13, 원장 E08):
| 맞음 | 확인 없이 틀림 | 확인 필요 | |
|---|---|---|---|
| 규칙만 | 496 | 50 | 353 |
| 규칙 + 거르기 | 527 | 34 | 302 |
| 대조: 검출 신뢰도 0.7 로 거르기(학습 없음) | 446 | 66 | — |
짝 비교에서 +4.9%p 였습니다(같은 57랠리를 11조건에서 다시 세므로 독립이 아니라 구간은 낙관적). 대조군이 중요합니다. 깨끗한 개발 경기에서는 「검출 신뢰도가 낮은 바운드 버리기」가 학습 거르기와 같은 점수를 냈지만, 실제 열화 조건에서는 정반대로 무너졌습니다. 검출 신뢰도는 어두워지면 진짜 바운드에서도 함께 떨어지기 때문입니다. 학습 거르기의 이득은 「신뢰도 낮은 바운드 버리기」가 아니라 궤적 모양을 보는 데서 옵니다.
한계도 하나 찾았습니다. 바운드 근처가 가려 V 자가 지워지면, 메우기로 보간한 궤적에서 확률이 낮게 나와 진짜 바운드를 버렸습니다(원장 E11 의 가림 부분집합 41 → 38). 그래서 바운드 근처에 공이 안 보인 표본이 있으면 거르기를 쉬게 했습니다(원장 E17).
② 「확인 필요」 보정: 19특징 로지스틱 회귀
3편에서 봤듯 「신뢰도 < 0.6」은 틀림을 가르지 못했습니다(AUC 0.51). 판정 순간에 엔진이 이미 아는 19개 값으로 판정이 틀렸을 확률을 내는 로지스틱 회귀를 배웠습니다(ttscore/reviewcal.py).
로지스틱 회귀의 좋은 점은 둘입니다. 학습 자료(여러 열화 조건으로 돌린 판정)가 크지 않아도 되고, 결과를 사람에게 설명할 수 있습니다. 선형 모델은 각 특징이 「틀림 쪽으로 얼마나 밀었나」를 그대로 읽을 수 있어서, 칩의 사유(「공을 놓쳤어요」, 「긴 랠리예요」)를 그 기여에서 바로 만듭니다. 계산은 판정마다 내적 하나입니다.
학습 재료는 실시간 경로 그대로 돌린 판정과 그 랠리의 승자 정답입니다. v2 는 같은 특징에 라벨 고침을 넣었습니다. 정답 라벨이 랠리 여럿을 하나로 묶은 곳에서 엔진의 맞는 판정이 「틀림」으로 배워지고 있었기 때문입니다(원장 R7·R8, E25). 문턱은 학습 경기 단위 5겹 교차 검증으로 골랐고, v2 문턱은 0.0442 입니다. 결과는 3편 5절 표에 있습니다. 확인 없이 틀림(유령 포함)이 20 에서 8 로 줄고, 확인 필요가 450 에서 497 로 늘었습니다.
주의할 점 하나. 보정은 공 모델이 낸 판정 분포로 배운 것이라, 공 모델을 바꾸면 보정도 바꿔야 합니다. 미세조정 공 가중치 위에 v2 를 그대로 두자 확인 없이 틀림이 14 에서 28 로 늘었습니다(원장 E31). 그래서 그 짝으로 v3 를 따로 배웠습니다.
③ 탁구대 꼭짓점 모델: 얼린 인코더와 작은 열지도 머리
문제. 2026-10-25 에 운영 찾기 사슬이 어디서 실패하는지 새 그림 35장(리그 중계 26장, 4K 동호회 옆면 4장, 1934년 옛 필름 2장, 실험실 대각 3장, 모두 상업 사용 가능한 공개 영상)으로 쟀더니, 짚기 없이 확실&맞음 0/35 였습니다(원장 E42). 원인을 가르니 옆면·대각에서는 네트가 윗면을 갈라 분할 마스크가 거의 언제나 반쪽이었고, 고르기 점수가 큰 바닥·벽 마스크를 위로 올렸습니다. 후처리 손질 일곱 가지(격자 프롬프트, 넓히기 하한, 흰 선 문턱, 반쪽 합치기, 반쪽 검사 등)를 모두 시험했지만 어느 것도 「어디서도 나빠지지 않고 새 묶음에서 좋아짐」을 채우지 못했습니다. 마스크에서 사각형을 짜 맞추는 방식의 한계였습니다.
생각. 마스크를 거치지 말고 꼭짓점을 직접 내게 하자. 사람 자세 추정이 관절마다 열지도를 그리듯[15][16][17][18], 탁구대 꼭짓점 넷과 네트 두 끝을 열지도로 냅니다.
구조. 운영 찾기 사슬이 이미 쓰는 EfficientTAM S 의 이미지 인코더(같은 가중치, Apache-2.0)를 얼리고, 그 64×64×256 특징 위에 합성곱 몇 층의 작은 머리(약 64만 파라미터)를 얹어 128×128 열지도 두 장을 냅니다. 한 장은 꼭짓점 넷, 한 장은 네트 두 끝입니다. 탁구대는 대칭이라 꼭짓점에 이름(왼쪽 위 등)을 붙이지 않고, 봉우리 넷을 둘레 순서로 읽습니다. 손실은 σ 4px 가우시안 정답에 대한 가중 MSE 입니다.
왜 얼렸나. 실제 학습 그림이 12장뿐이었습니다. 사전학습 특징이 좋고 학습 조건과 쓰는 조건이 다를 때, 머리가 엉터리인 초기에 몸통까지 함께 학습하면 사전학습 특징이 뒤틀려 분포 밖 성능이 나빠질 수 있다는 분석이 있습니다[19]. 그 논문은 주로 분류 과제의 선형 머리를 다루므로 우리는 원리 수준의 근거로만 씁니다. 실용적인 이유도 있었습니다. 운영이 이미 같은 인코더 가중치를 갖고 있어 새로 받을 가중치나 패키지가 없었습니다. 인코더를 풀어 보는 실험은 아직 하지 않았습니다.
학습 자료: 합성 80%, 실제 20%. 상업 사용 가능한 자료만 썼습니다.
- 합성: 우리 코드로 그린 탁구대(규격 2.74 × 1.525 × 0.76m, 네트 15.25cm)를 무작위 카메라(거리 2.4–15m, 화각 35–100°, 높이·기울기), 조명, 흐림, 잡음, JPEG, 흑백, 바닥, 뒷막, 옆 탁구대, 사람 판과 함께 그렸습니다. 외부 그림은 쓰지 않았습니다. 렌더러가 꼭짓점 좌표를 정확히 알기 때문에 라벨을 손으로 찍을 필요가 없습니다. 네트 끝 라벨은 네트가 긴 변과 만나는 탁구대 높이의 점(긴 변의 가운데)으로 정의했습니다.
- 실제: 2015년 슬로베니아 리그 중계(Wikimedia Commons, CC BY 3.0)에서 시험 구간과 겹치지 않는 12장. 확대·이동·회전·색·좌우 뒤집기로 늘렸습니다.
- 뺀 것: 시험에 쓰는 동호회 영상과 같은 체육관의 다른 영상, 시험의 실험실 영상과 같은 실험실·카메라의 다른 영상. 라벨까지 만들었지만 학습에 넣지 않았습니다. 넣으면 시험이 낙관적이 됩니다. 비상업 데이터셋은 시험에만 썼습니다.
이 설계는 도메인 무작위화[20][21]의 생각을 따릅니다. 렌더링을 일부러 비현실적일 만큼 마구 바꿔 학습하면, 실제 영상은 모델이 본 수많은 변형 중 「또 하나의 변형」이 된다는 생각입니다. 합성만으로 학습한 뒤 소량의 실제로 보태는 흐름도 [21]이 보인 방향입니다. 탁구에서는 공·탁구대 2D 검출은 실제 라벨로, 2D → 3D 궤적은 물리적으로 맞는 합성으로만 학습한 연구가 있습니다[22].
학습은 2,500반복 × 배치 12(= 3만 장), AdamW, 시드 셋이고, 노트북 GPU(8GB급)에서 1회용 파드 셋이 각각 약 20분 걸렸습니다(5편). 고르기 없이 마지막 가중치를 썼습니다.
해독: 봉우리 크기를 믿지 말고 기하를 믿어라. 처음 해독(사전 등록: 꼭짓점 봉우리 넷의 최소 ≥ 0.5 이면 확실)은 기각됐습니다. 합성으로 배운 봉우리 크기는 실제 그림에서 거의 언제나 0.5 를 넘었습니다. 과신입니다. 꼭짓점 셋은 맞고 하나가 점수판이나 네트 기둥에 붙은 사례가 많았습니다.
그래서 둘째 해독(d2)을 만들었습니다(ttscore/tablekp.py). 꼭짓점 열지도의 봉우리 상위 여섯 중 넷을 골라 볼록 사각형을 만들고, 그 사각형만으로 네트 끝이 있어야 할 자리를 계산해 네트 열지도의 봉우리와 맞춰 봅니다.
- 사각형의 두 대각선이 만나는 점은 원근에서도 실제 탁구대의 가운데입니다(사영 가운데).
- 두 끝 변을 늘여 만나는 소실점과 그 가운데를 잇는 선은, 원근에서 「네트가 놓인 선」입니다.
- 그 선이 두 긴 변과 만나는 점이 네트 끝이 있어야 할 자리입니다.
네트와 꼭짓점은 따로 낸 열지도라, 둘이 기하로 맞는다는 것은 봉우리 크기와 독립된 근거입니다. 확실의 조건은 「봉우리 최소 ≥ 0.5 그리고 네트 끝 거리 ≤ 12px」입니다. 12px 는 시험이 아니라 검증 묶음(합성 300장 + 학습에서 뺀 실제 4장)에서 8·12·16·24 중 골랐습니다. 검증 합성의 확실&틀림이 54–68 에서 5–9 로 줄었습니다.
이 계산은 탁구대 평면 위의 점만 씁니다. 네트 꼭대기는 평면에서 15.25cm 위라 호모그래피에 넣으면 안 되지만, 우리 네트 끝 라벨은 탁구대 높이의 점이고, 그나마 호모그래피 계산에는 넣지 않고 검사와 「어느 변이 끝 변인가」를 정하는 데만 씁니다. 호모그래피는 꼭짓점 넷으로만 만듭니다.
합치기: 정책 D. 꼭짓점 모델은 기존 찾기를 대신하지 않고 함께 봅니다.
| 기존 찾기 | 꼭짓점 모델 | 결과 |
|---|---|---|
| 확실 | 확실 | 꼭짓점이 20px 안이면 확실(꼭짓점 모델 좌표), 엇갈리면 사람에게 「톡 짚어 주세요」 |
| 아님 | 확실 | 꼭짓점 모델 결과로 확실 |
| 확실 | 아님 | 기존 그대로 |
| 아님 | 아님 | 기존 결과(불확실) 그대로 |
채택 조건은 결과를 보기 전에 정해 원장에 적었습니다(사전 등록). 새 35장에서 확실&맞음이 늘고, 어떤 묶음에서도 확실&틀림이 늘지 않을 것(시드 셋의 중앙값).
실측: 연구 시험(시험 204장, 확실&맞음 / 확실&틀림, 2026-10-25, 원장 E43, docs/tt/PERFORMANCE.md 2.19):
| 묶음 | 장 | 운영 그대로 | 꼭짓점 모델 + 정책 D(시드 셋 중앙값) |
|---|---|---|---|
| 공개 묶음(비상업, 평가만) | 142 | 67 / 15 | 79 / 15 |
| 촬영 조건별 27클립 | 27 | 4 / 3 | 7 / 3 |
| 리그 중계(학습 구간과 같은 중계의 다른 구간) | 26 | 0 / 1 | 4 / 1 |
| 4K 동호회 · 옛 필름 · 실험실 대각 | 9 | 0 / 3 | 0 / 3 |
| 합 | 204 | 71 / 22 | 89 / 23 |
합성만으로 학습한 판(같은 해독)은 공개 묶음 확실&맞음이 더 많았지만(+24) 확실&틀림도 늘어 조건을 채우지 못했습니다. 실제 12장이 과신을 누른 셈입니다. 운영 코드 그대로 다시 돌린 결과(시드 2 가중치, 머리만 2.5MB)는 89 / 22 였고, 찾기 한 번에 노트북 GPU 에서 40ms 가 더 들었습니다.
정직하게 적을 한계가 셋입니다.
- 시험을 두 번 봤습니다. d2 해독은 첫 해독의 시험 결과를 본 뒤 설계했습니다. 문턱은 검증으로 골랐지만, 설계 자체가 시험의 영향을 받았습니다.
- 이득이 한쪽에 몰렸습니다. 새 35장의 이득 넷은 모두 학습 구간과 같은 중계의 다른 구간이고, 공개 묶음의 이득은 옆면 화면에서 났습니다. 4K 동호회·옛 필름·실험실 대각은 0 그대로입니다. 다른 체육관·다른 중계로의 일반화는 이번 자료로 보이지 않았습니다.
- 라벨이 사람 것이 아닙니다. 실제 학습 12장과 새 시험 35장의 꼭짓점은 AI 작업자가 2배 확대 격자로 읽고, 가려진 먼 꼭짓점은 소실점으로 계산해 찍었습니다(대략 ±5px).
실측: 운영에서 켠 뒤(2026-10-25 밤 – 10-26 새벽, 원장 E44). 2026-10-25 에 운영 실시간 작업자에서 꼭짓점 모델을 켰습니다. 켠 뒤 운영 작업자에 시험 그림 212장을 카메라 점수판과 같은 JPEG 품질 70 으로 보냈고, 응답 212건 모두에 꼭짓점 모델이 돌았다는 기록이 있었습니다. 화면 흐름(짚기 없이 확실이면 끝, 아니면 톡 한 번, 그래도 아니면 손으로 네 꼭짓점)을 그대로 흉내 내, 정답 있는 세 묶음 204장으로 셌습니다. 짝 기준선(꼭짓점 모델 끔)은 운영을 끌 수 없어 같은 코드를 노트북 GPU 의 1회용 파드에서 같은 JPEG 로 돌렸습니다.
| 지표(204장) | 끔 | 켬 |
|---|---|---|
| 짚기 없이 확실&맞음 | 61 | 84 |
| 짚기 없이 확실&틀림 | 26 | 23 |
| 「톡 짚어 주세요」를 띄운 수 | 117 | 97(−17%) |
| 「직접 짚어 주세요」까지 간 수 | 88 | 73 |
| 꼭짓점 모델이 더한 시간(서버 GPU, 예열 뒤 211회) | — | 중앙 25ms |
| 찾기 한 번 전체(같은 조건, 측정용 연결 포함) | — | 중앙 1.73초, p95 2.14초 |
이득만 있지는 않았습니다. 꼭짓점 모델이 새로 만든 틀린 확실이 5건 있었고(최대 114px — 학습 구간과 같은 중계의 다른 구간), 없앤 것이 8건이라 합이 26 에서 23 이 되었습니다. 촬영 조건별 27클립 묶음만 보면 확실&틀림이 3 에서 4 로 하나 늘었습니다. 끄는 조건(확실&틀림이 기준선보다 늘거나 오류)에는 걸리지 않아 켠 채 유지하기로 했습니다.
이 비교에는 흔들림이 섞여 있습니다. 기준선은 다른 GPU 에서 돌렸는데, 기존 찾기의 확신이 204장 중 14장에서 운영과 달랐습니다(GPU 차이). 또 JPEG 70 에서는 기존 찾기가 무손실 그림보다 약해(71/22 → 61/26), 연구 시험의 숫자와 바로 견주면 안 됩니다. 실제 브라우저로 화면을 끝까지 누르는 시험은 하지 않았고, 위 표는 화면 흐름 규칙을 흉내 낸 것입니다.
5. 자세와 소리: 넣지 않은 신호
자세(RTMPose): 코칭에만
RTMPose[7]는 사람 상자를 먼저 찾고(RTMDet) 사람마다 잘라 자세를 추정하는 톱다운 방식입니다. 머리는 SimCC[8]로, 키포인트 위치를 열지도 대신 x 좌표 분류와 y 좌표 분류 두 문제로 바꿉니다. 한 화소를 여러 칸으로 쪼개 저해상도에서도 서브화소 정밀도를 얻는 생각입니다.
TT Lab 은 이 모델을 코칭 화면의 정밀 분석(ttcoach/pose.py)에만 씁니다. 점수 엔진에 넣는 실험은 두 번 했고 두 번 다 기각했습니다.
- 자세로 바운드를 지우면 공개 경기 12편 랠리 승자가 93.1% 에서 87.6–92.0% 로 떨어졌습니다(PERFORMANCE 2.9.5).
- 자세를 가짜 바운드 거르기에 결합하면 가림 구간에서 조금 나았지만 규칙만 쓴 것을 넘지 못했고, 무엇보다 자세 추정이 GPU 로 프레임당 24.6–25.0ms 라 새 모듈 예산 5ms 를 넘었습니다(원장 E11). 「실시간 불가」입니다.
소리: 엔진에 넣지 않음
공이 면에 닿는 시간은 1.3–1.8ms 로 아주 짧아, 소리는 「언제」를 영상 프레임 간격(30fps 면 33ms)보다 훨씬 정밀하게 알려 줄 수 있습니다[23]. 깨끗한 녹음 데이터셋에서 우리 분류기도 탁구대·라켓 소리를 99.3% 갈랐습니다. 그러나 실제 훈련장 녹음에서는 점수에 대한 효과를 확인하지 못했습니다(PERFORMANCE 2.7·2.9.6, 앞 시리즈 6편). 깨끗한 녹음에서의 성능이 잡음과 옆 탁구대 소리 앞에서 크게 떨어졌습니다.
그래서 실시간 경로는 소리를 받지 않습니다. 카메라 점수판은 카메라를 열 때 오디오를 요청하지 않고(getUserMedia({audio:false})), 녹화본 분석은 소리를 버립니다. 영상·소리·자세를 합친 탁구 득점 판정 논문은 이번 조사 범위에서 찾지 못했습니다(검색 범위가 좁았다는 단서를 붙입니다)[24][25].
6. 정리
- 공은 「열지도 + 여러 프레임 + 번짐의 가운데」라는 계보의 끝인 BlurBall 을 저자 가중치 그대로 씁니다. 학습 데이터가 공개되지 않아 공개 시험 숫자를 일반화로 읽지 않습니다.
- 탁구대는 분할 모델로 한 번 찾고, 일곱 가지로 다시 보고, 피라미드 Lucas–Kanade 와 RANSAC 으로 매 프레임 따라갑니다. 판정을 깨는 것은 꼭짓점 오차보다 프레임 사이 떨림이었습니다.
- 우리가 학습한 셋은 모두 작고, 규칙과 큰 모델의 결과를 거르거나 확인하는 자리에 있습니다. 1.8만 파라미터 거르기, 19특징 회귀, 64만 파라미터 머리입니다.
- 꼭짓점 모델은 운영에서 「톡 짚어 주세요」를 17% 줄였지만, 다른 체육관으로의 일반화는 아직 보이지 않았습니다. 다른 체육관의 상업 가능 실제 자료가 다음 과제입니다.
티티 한마디. 꼭짓점 모델은 처음에 자기가 다 맞다고 우겼어요. 그래서 「네트 끝이 있어야 할 자리에 진짜 네트 끝이 있나」 한 번 더 물어보게 했더니 훨씬 겸손해졌어요.
참고문헌
- T. Gossard, F. Radovic, A. Ziegler, A. Zell. "BlurBall: Joint Ball and Motion Blur Estimation for Table Tennis Ball Tracking." CVPR Workshops (CVsports), 2026. arXiv:2509.18387. 코드 MIT.
- S. Tarashima, M. A. Haq, Y. Wang, N. Tagawa. "Widely Applicable Strong Baseline for Sports Ball Detection and Tracking." BMVC, 2023. arXiv:2311.05237.
- Y.-C. Huang, I.-N. Liao, C.-H. Chen, T.-U. İk, W.-C. Peng. "TrackNet: A Deep Learning Network for Tracking High-speed and Tiny Objects in Sports Applications." arXiv:1907.03698, 2019.
- N. Ravi 외. "SAM 2: Segment Anything in Images and Videos." ICLR, 2025. arXiv:2408.00714. 코드·체크포인트 Apache-2.0.
- Y. Xiong 외. "Efficient Track Anything." ICCV, 2025. arXiv:2411.18933. 코드·체크포인트 Apache-2.0. (학회 게재는 다른 논문의 참고문헌 표기로 확인, 학회 원 페이지는 못 봄)
- N. Carion, L. Gustafson, Y.-T. Hu 외. "SAM 3: Segment Anything with Concepts." ICLR, 2026. arXiv:2511.16719. SAM License(2025-11-19).
- T. Jiang, P. Lu, L. Zhang, N. Ma, R. Han, C. Lyu, Y. Li, K. Chen. "RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose." arXiv:2303.07399, 2023.
- Y. Li, S. Yang, P. Liu, S. Zhang, Y. Wang, Z. Wang, W. Yang, S.-T. Xia. "SimCC: A Simple Coordinate Classification Perspective for Human Pose Estimation." ECCV, 2022. arXiv:2107.03332.
- B. D. Lucas, T. Kanade. "An Iterative Image Registration Technique with an Application to Stereo Vision." IJCAI, 1981, pp. 674–679.
- J.-Y. Bouguet. "Pyramidal Implementation of the Lucas Kanade Feature Tracker: Description of the Algorithm." Intel Corporation, Microprocessor Research Labs, 2000. (본문은 열지 못하고 서지와 OpenCV 의 인용까지 확인)
- J. Shi, C. Tomasi. "Good Features to Track." CVPR, 1994, pp. 593–600.
- G. Farnebäck. "Two-Frame Motion Estimation Based on Polynomial Expansion." SCIA, 2003, LNCS 2749, pp. 363–370.
- R. Hartley, A. Zisserman. Multiple View Geometry in Computer Vision, 2nd ed. Cambridge University Press, 2004. 2장·4장.
- M. A. Fischler, R. C. Bolles. "Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography." Communications of the ACM 24(6):381–395, 1981.
- A. Newell, K. Yang, J. Deng. "Stacked Hourglass Networks for Human Pose Estimation." ECCV, 2016. arXiv:1603.06937.
- K. Sun, B. Xiao, D. Liu, J. Wang. "Deep High-Resolution Representation Learning for Human Pose Estimation." CVPR, 2019. arXiv:1902.09212.
- X. Zhou, D. Wang, P. Krähenbühl. "Objects as Points." arXiv:1904.07850, 2019.
- J. Tompson, A. Jain, Y. LeCun, C. Bregler. "Joint Training of a Convolutional Network and a Graphical Model for Human Pose Estimation." arXiv:1406.2984, 2014.
- A. Kumar, A. Raghunathan, R. Jones, T. Ma, P. Liang. "Fine-Tuning can Distort Pretrained Features and Underperform Out-of-Distribution." ICLR, 2022. arXiv:2202.10054. 원리 수준으로만 인용.
- J. Tobin, R. Fong, A. Ray, J. Schneider, W. Zaremba, P. Abbeel. "Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World." IROS, 2017. arXiv:1703.06907.
- J. Tremblay 외. "Training Deep Networks with Synthetic Data: Bridging the Reality Gap by Domain Randomization." CVPR Workshops, 2018. arXiv:1804.06516.
- D. Kienzle, K. Ludwig, J. Lorenz, S. Satoh, R. Lienhart. "Uplifting Table Tennis: A Robust, Real-World Application for 3D Trajectory and Spin Estimation." arXiv:2511.20250, 2025.
- T. Gossard, J. Schmalzl, A. Ziegler, A. Zell. "Sound-Based Spin Estimation in Table Tennis: Dataset and Real-Time Classification Pipeline." IEEE STAR, 2025. arXiv:2409.11760.
- S. Tsuji 외. "Audio-Visual Self-Supervision for Frame-Level Player-wise Offensive Shot Detection in Table Tennis Matches." MMSports '24, 2024. doi:10.1145/3689061.3689064. (서지는 검색 요약으로만 확인)
- X. Zhou, Q. Huang, L. Xie, S. Cox. "Detection of Ball Hits in a Tennis Game using Audio and Visual Information." APSIPA ASC, 2012.
- 우리 측정: 저장소
docs/tt/PERFORMANCE.md2.1·2.8·2.12·2.19, 연구 원장 E01·E05·E08·E11·E12·E17·E18·E25·E31·E42·E43·E44. 코드live/blurball.py·tablecv.py·tablemodels.py,ttscore/table.py·tablekp.py·bounceveto.py·reviewcal.py.
함께 읽기
- 앞 시리즈 TT Score 모델 해부 2편: 공 찾기, 3편: 탁구대 찾기.
- 비전 모델 읽기 1, 3편: U-Net 과 HRNet, 10편: SAM 2 와 EfficientTAM, 11편: SAM 3.
- 비전 모델 읽기 2, 5편: 광류, 7편: 자세 열지도, 9편: 공 추적.
- 이 시리즈 5편: 데이터·라이선스·학습 과정: 학습이 어디서 어떻게 도는지, 상업 서비스에 맞춘 학습 자료의 원칙.