網球影片私人教練 是做什麼的?
將業餘球員的練習影片轉化為可執行的檢討:揮拍的哪個環節出了問題、哪些擊球證明了這一點、以及下次該練習什麼。專為初級到中級球員設計,適用於對牆、發球機、教練餵球或搭檔對練。
需求:能執行 Python 3 與 ffmpeg,並安裝 pip 套件(ultralytics, opencv-python, numpy, scipy, Pillow)的環境。有 GPU 更好,但非必要。
0. 事先提問(僅限你尚不清楚的部分)
- 畫面中哪個人是球員:衣服顏色、頭髮、位置。教練、搭檔及隔壁場地的人常會入鏡。
- 慣用手,以及反手拍是單手還是雙手(或正在學習兩者)。
- 程度與目標:他們打了多久,以及想達到什麼目標(例如:「年底前能來回對打並打一盤比賽」)。
- 場地設定:練習牆 / 發球機 / 教練餵球 / 對練;室內或室外。
- 攝影機:後方、側面或正面;手機高度;幀率。
- 傷勢:近期膝蓋、肩膀、手肘或背部有無痠痛。若有,需特別關注腳步與落地。
- 他們最想解決的一個問題(例如:「很多球飛太遠」或「我的擊球點不穩定」)。報告必須在最前面回答這個問題。
- 先前的報告(如有),以便比較。
1. 報告必須達成的目標
- 開門見山列出結論。 用一句話說明最大的問題與最大的進步,接著提供細節。批評必須具體且有證據支持;避免只稱讚。若先前的評論有誤,應明確指出。
- 每項主張都要有影片佐證。 每個案例都需附上附註解的慢動作片段,並繪製在球員的真實影片上,而非火柴人動畫。
- 預設為 4 類別 × 3 擊球:最佳正手拍、最差正手拍、最佳反手拍、最差反手拍(共 12 個片段)。每個類別需有一個三欄比較表格,以及一句說明這三球共通點的話。若某類別可用擊球少於 3 球,則應說明找到了幾球。
- 將單手反拍和雙手反拍分開處理。 若球員兩種都練,單手反拍應有獨立章節,且不納入雙手反拍的統計。
- 指出崩壞的階段:引拍 / 拍頭下放 / 擊球點 / 隨揮方向 / 腳步 / 準備時機 / 處理高球 / 正反拍決策。
- 務必檢查膝蓋與腳步:空中擊球、單腳落地、在鎖死的直腿上旋轉。
- 說明資料的限制:樣本數、多少擊球無法判讀、攝影角度偏差。若某事物無法看見,應直接說明,而非猜測數字。
- 以可遵循的計畫作結:提供 2–4 項練習(包含次數或分鐘數),以及進入下一階段的條件。
2. 流程
2.1 轉檔並提取音訊
- 4K HEVC 手機影片檔案龐大。製作一個 960 寬的 H.264 分析用副本:
ffmpeg -i IN.MOV -vf scale=960:-2 -r 30 -an -c:v libx264 -preset veryfast -crf 24 p.mp4(有些手機錄影為 29.97 fps;強制設為 30 可簡化時間計算。) - 另外提取音訊以定位觸球點:
ffmpeg -i IN.MOV -vn -ac 1 -ar 22050 a.wav - 將長影片切成 4–5 分鐘的段落處理,避免超時。若有多個短片段,先從每個片段抓取一幀製作概覽表,判斷哪些是可用(球員背後角度),哪些太遠(僅用於觀察技術)。
- 針對練習牆的練習,也剪裁出球網線附近的放大「牆面」副本,用於判斷觸網 / 出界。
2.2 姿勢估計
- 使用 Ultralytics YOLO 姿勢模型(
yolo11n-pose.pt;更高精度可用yolo11m-pose.pt)。室內環境,每 4 幀取樣一次,imgsz 640,conf 0.3 已足夠。室外人物較小且較多時,應每 2 幀取樣,imgsz 960,conf 0.25。 - 追蹤正確的人物。 畫面中只有一人時,取最大邊界框。若有教練或其他人在場,則根據衣物特徵對每個偵測結果評分:軀幹多邊形(肩膀 + 臀部)內的中位數 HSV 亮度與飽和度,以及臀部到膝蓋區域的褲子顏色。對偏離前一幀較遠的偵測結果增加懲罰,以避免人物切換。
- 根據影像 x 座標判斷左右,而非模型標記的左右。從背後看,球員的右側即是影像的右側。
2.3 找出每次揮拍
- 揮拍是手腕速度的峰值:移動較多的那隻手腕的逐幀位移量,除以邊界框高度,經 2 個樣本平滑後,門檻值約為 0.16(適用於每 4 幀取樣;取樣密度更高時需按比例縮小)。
- 峰值間隔需至少 1.6 秒。 1.0 秒的間隔會將隨揮後的恢復動作誤判為第二次揮拍。正常節奏約每 3–4 秒一次揮拍。
- 正手拍或反手拍:在峰值前 1.1 秒到 0.25 秒的時間區間內,雙手的中點位於臀部中線的哪一側。位於慣用手側即為正手拍。部分判斷可能出錯;對於你要特別呈現的擊球,應逐幀確認。
- 將以下所有指標錨定在手腕速度峰值(稱為 tp),以便各次練習能相互比較。
2.4 從聲音定位觸球
- 高通濾波 1500 Hz;計算 110 個樣本視窗的能量包絡;找出比周圍 401 個視窗中位數高至少 10 dB 且間隔至少 50 個視窗的峰值。
- 轉換為秒數:
視窗索引 × 110 / 22050。使用乘以 0.005作為快捷方式,每 4 分鐘會漂移約半秒,破壞長影片後半部的準確性。 - 練習牆:在 [tp−0.1, tp+0.55] 秒範圍內,取比背景噪音高至少 15 dB 的最大峰值,通常在 tp 後 0.2–0.35 秒。球撞擊牆壁的聲音(約觸球後 0.45 秒)也很大;不要選它。
- 室外:教練的擊球或其他場地的噪音會造成干擾。搜尋 [tp−0.45, tp+0.25] 秒範圍;若無符合條件的,則使用 tp。
- 對於最終會放入片段的每個擊球,務必透過觀察影格來確認真實的觸球影格。
2.5 偵測單手反手拍(若球員正在學習)
- 在反手拍中,取 tp 後 0.7 秒內兩手腕之間的最大距離(除以軀幹長度)。雙手反拍在完成動作時雙手會保持在一起(通常小於 1.5);單手反拍的非持拍手會向後打開(通常為 2.0–2.5)。差距很明顯;門檻值設為 1.95 左右即可。
- 近距離攝影角度會產生誤報;務必目視確認每個候選者。
- 針對每個單手反拍,記錄:引拍時持拍手是否高過頭、引拍是否過晚(像準備打雙手反拍,最後一刻才拉起)、擊球時手臂是否伸直、隨揮高度以及結果。
- 單手反拍檢查清單(每項包含:正確狀態 / 本次練習 / 判定):非持拍手放在拍頸上的轉身、引拍高度在胸部與肩膀之間且拍頭指向後方、拍頭降低後由低向高揮擊、擊球點在前方且手臂伸直、非持拍手向後打開、完成動作且胸部不要過早轉正、膝蓋彎曲並跨步。握拍從背後無法看清;建議球員向教練確認。
2.6 觸網 / 出界計數(僅在球可見時)
- 練習牆:在放大的牆面影片中標記球網線。針對每次擊球,製作一張圖塊:觸球後 30 幀內的移動黃色區塊(依時間從紅到綠繪製),以及球網線上方遮擋物(窗簾等)的運動(用另一種顏色)。目視判斷每個圖塊:遮擋物移動或球擊中高於球網線的位置 = 界內;球擊中板子且遮擋物不動 = 觸網;被球員擋住 = 無法判讀。全自動判斷與人類的吻合度僅約 60%,因此僅作為提示使用。
- 取樣:均勻地從整場練習中選取 100 次擊球進行判斷,排除無法判讀的球,並分別回報正手拍 / 雙手反拍 / 單手反拍的數據。然後檢視剩餘中最可疑的 20 球,確認錯誤是否集中在某個時段(通常在疲勞出現後)。
- 室外:背景有樹木搖動或多人走動時,基於顏色與運動的球體偵測大多會失敗。請不要回報百分比。在報告中說明原因,改以技術好壞來挑選最佳 / 最差擊球,並提供能讓計數得以實現的攝影建議。
2.7 技術指標(對每次揮拍測量)
| 指標 | 計算方式 | 意義 |
|---|---|---|
| 正手拍手高於鼻尖 | 在 [tp−1.1, tp−0.25] 區間內,持拍手腕高於鼻尖的影格比例 | 引拍過高、揮拍軌跡過大 |
| 雙手高於肩膀 | 相同區間內,雙手腕高於肩部中心的影格比例 | 反手拍持拍位置過高 |
| 最大膝蓋彎曲角度 | 在 [tp−0.6, tp+0.3] 區間內,前側腿的髖-膝-踝最小角度(所有揮拍的中位數) | 腿部過直(從後方拍攝會低估前彎角度;僅與自己比較) |
| 站位寬度 | 在 tp 時刻,腳踝水平距離 ÷ 軀幹長度 | 窄站位常伴隨跳躍 |
| 著地並伸直 | tp 後 0.7 秒內,一個腳踝移動少於 0.4 個軀幹長度,且該膝蓋角度大於 155° | 膝蓋的扭轉負荷(常見於反手拍轉體時) |
| 擊球高度 | 在 tp 前 0.07–0.2 秒,持拍手位置介於臀部 (0) 與肩膀 (1) 之間 | 了解有多少球是高的,以及球員是否調整位置 |
| 跳躍 / 單腳落地 | 在你逐幀檢視的擊球中目視計算 | 目前尚無可靠的自動化指標 |
- 對於長時間練習,應分別回報前半段與後半段的數據,以觀察疲勞帶來的影響。
- 若攝影機、場地或方法有所改變,應重新以新方法測量舊影片,或明確說明數字無法比較。
2.8 選出 3 個最佳與 3 個最差擊球
- 最佳:結果好(順利過網且落地深)且揮拍完整(引拍到位、拍頭低於球、完整收拍、雙腳著地)。應平均分佈於整場練習中。
- 最差:觸網、打高射砲或明顯失誤;若不夠多,則選擇技術缺陷最明顯的擊球。優先選擇能顯示不同成因,或共同證明一個共同成因的擊球。
- 先從結果圖塊中篩選,再透過逐幀的球員圖表(觸球前 0.9 秒到觸球後 0.5 秒)確認成因。挑選最差反手拍時,務必排除單手反拍。
2.9 生成附註解的慢動作片段
- 從原始影片中剪取約 3 秒(從觸球前 1.1–1.5 秒開始),將畫面裁切至大約 16:10 比例且球員約占畫框高度 60%,縮放至 1280 寬。
- 對每一幀執行姿勢估計。手動選擇四個影格:引拍頂點、擊球點、以及繪製路徑的起點與終點(排除準備姿勢與恢復動作)。自動偵測的擊球影格常出錯;務必目視檢查。
- 片段結構:
- 以原速播放一次。
- 以四分之一速度播放,逐幀繪製持拍手路徑(正手拍 = 持拍手腕;雙手反拍 = 雙手腕中點;單手反拍 = 觸球前為中點,觸球後為持拍手腕),顏色從橘色漸變至青色,並在底部顯示每個階段的說明文字。
- 在引拍頂點處定格約 3 秒,圈選該點(綠色 = 正確,紅色 = 問題)並附上一句短標題。
- 在擊球點處定格約 3 秒:在擊球點(自動位置常錯過球,請手動設定)標記白色圓圈,在前側膝蓋處標記黃色圓圈及其角度(單手反拍因側面鏡頭腿部重疊,可略過)。
- 在完整路徑上定格。 在最差的片段中,疊加同一類型的最佳擊球路徑(從路徑起點到擊球點),按軀幹長度縮放並在肩部中心對齊,以帶黑色外框的綠色虛線動畫呈現,並附上一句修正建議。
- 編碼為 H.264,yuv420p,faststart,960 寬,每個片段約 1–2.5 MB。從每個片段中提取 4 幀製作接觸圖表,以確認說明文字未遮擋任何東西,且圓圈落在正確位置。
- 避免在說明文字中使用 ✓ 和 ✗;許多東亞字體缺少這些符號,會顯示為方框。
3. 報告結構
產出一個 HTML 頁面(或使用者要求的格式),依序包含以下內容:
- 評語:直接回答球員的問題;最大的進步、最大的問題、關鍵數據;對先前評審的回饋。其下方為數據條(按擊球類型區分的揮拍數、取樣的觸網 / 出界率或「未計數」並附原因、一或兩項關鍵指標)。
- 成因分析:將問題歸納為 2–3 個成因,每個成因附上一個帶時間戳的範例。
- 最佳 vs 最差:4 個分組,每組 3 個片段、一個三欄比較表(包含引拍、下放、擊球、收拍、腳步、膝蓋角度)以及一句關於共通模式的說明。
- 與上次比較:以表格及並排片段說明最佳與最差擊球的變化。
- 單手反手拍(若有練習):統計數據、檢查清單、3 個好與 3 個差的片段、逐球列表,以及是否建議繼續訓練此技術。
- 膝蓋與腳步:指標表與風險分類,分為「優先處理 / 觀察 / 改善中」,每項附修正建議。並明確說明這並非醫療建議,若出現腫脹、卡住、無力或持續一週以上的痠痛,建議諮詢運動醫學醫師。
- 下次練習內容:見第 5 節。
- 攝影建議(若影片內容有缺漏)。
- 頁尾:資料來源、樣本數、測量定義、攝影機限制。
可選設計方向:網球色系,以硬地球場藍色為主色,僅關鍵數據與重點使用網球黃色,「好」用草地綠色,「問題」用紅土紅色。使用壓縮數字字型以營造記分板風格。確保在淺色與深色模式下都可閱讀,且在手機上無需水平滾動。
4. 常見問題與修正
先用以下表格對你所見進行分類,再用具體擊球證明。
| 症狀 | 常見成因 | 在影片中的表現 | 修正方法 |
|---|---|---|---|
| 正手拍掛網,向下刷 | 引拍高過頭,揮拍軌跡過大,拍頭來不及下放 | 持拍手高於鼻尖 |
…(原文截斷,翻譯基於提供內容)