# 軌跡計算設計架構與方法說明書與效能評估 ## 方法說明 ### Class - Point: 用來表示軌跡點的 class,通常是一個 list ```python= class Point(): def __init__(self, fid=-1, timestamp=-1, visibility=0, x=0, y=0, z=0, event=0, speed=0.0, color='white'): self.fid = int(fid) # 代表是影片中的第幾個 frame self.timestamp = float(timestamp) # 紀錄時間戳記 self.visibility = int(visibility) # 紀錄該 frame 是否看得到球 self.x = float(x) # 紀錄點的 x 座標 self.y = float(y) # 紀錄點的 y 座標 self.z = float(z) # 紀錄點的 z 座標 self.event = int(event) # 紀錄羽球事件 self.speed = float(speed) # 紀錄球速 self.color = color # 視覺化呈現時的顏色 ``` ### function - denoise: 去雜訊 - 由於羽球軌跡定位容易受環境影響,將閃光點(如球場風扇)視為羽球,因此需要除雜訊方法移除誤判點。 - 由於使用情境是單段羽球軌跡,所以先移除重複出現的位置的球。再根據移除完的新軌跡,對 XY 方向(水平)做 2 次式 polyfit,及對 YZ 方向(垂直)做 8 次式 polyfit,最後將與擬合曲線較遠的點移除。 - 函式的輸入是 list of <Point>,輸出也是 list of <Point> - 參數 `deg` 可以選擇要用幾次式去擬合,通常是 8 次為佳 ```python= def denoise(points, deg=8): ... return points ``` - interpolate_points: 補點 - 由於羽球軌跡定位並非 100% 能抓到羽球,因此需要將缺失點補上,以利視覺化呈現。(通常在除雜訊後才使用) - 先對 XY 方向用單純的直線內插進行補點,得到所有 X 與 Y 值。然後對 YZ 方向(垂直)做 8 次式 polyfit,找出最佳擬合曲線。根據新 Y 值去計算 Z 值為多少。 - 函式的輸入是 list of <Point>,輸出也是 list of <Point> ```python= def interpolate_points(points): ... return points ``` - fit_3d: 3D 軌跡平滑化 - 為了避免羽球震動或計算誤差導致軌跡出現鋸齒,需要將軌跡平滑化以利視覺化呈現。 - 針對可視的點,對 XY 方向(水平)做 4 次式 polyfit,及對 YZ 方向(垂直)做 4 次式 polyfit。並對所有點的 Y 值進行位移量的平滑化,藉由平滑化後的 Y 值與擬合曲線去回推平滑化後的 X 與 Z 值。 - 函式的輸入是 list of <Point>,輸出也是 list of <Point> - 參數 `deg` 可以選擇要用幾次式去擬合,4 次的視覺效果最佳 ```python= def fit_3d(points, deg=4): ... return points ``` - fit_vertical_2D_plane: 軌跡平面投影 - 根據 3D 軌跡找出垂直於地面的最適平面,並將軌跡投影至該平面。 - 由於將該平面視為垂直地面,因此只討論 XY 方向之投影,Z 值保值不變。利用點之間的距離作為 sample weight,透過線性回歸模型找出最適斜率,即可將點投影至該平面,得到軌跡的平面投影。 - 函式的輸入是 list of <Point>,輸出也是 list of <Point>,輸出的 Point.Z 值都等於 0 ```python= def fit_vertical_2D_plane(points): ... return points ``` - fit_2d: 2D 軌跡平滑化 - 同 3D 軌跡平滑化,為了避免羽球震動或計算誤差導致軌跡出現鋸齒,需要將軌跡平滑化以利視覺化呈現。 - 藉由 8 次式 polyfit 找出最適曲線。並對 Y 方向進行位移量的平滑化,得到新的 Y 值後,回推出平滑後的 2D 曲線。 - 函式的輸入是 list of <Point>,輸出也是 list of <Point> - 參數 `deg` 可以選擇要用幾次式去擬合,通常是 8 次為佳 - 參數 `smooth_2d_x_accel` 可以選擇要不要平滑位移量 ```python= def fit_2d(points, deg=8, smooth_2d_x_accel=True): ... return points ``` ## 效能評估 - 測試情境為使用人工增加 noise 的方法,對收集來的資料進行修改,並比較前後之差異 - origin 欄位的值表示: noise 的資料與原資料的平均距離差距 - after smooth 欄位的值表示: 將同筆 noise 資料進行去雜訊、補點平滑化後的結果與原資料的平均距離差異 - 使用三種 error 範圍的測試資料 - noise001: 平均是 0, sigma 是 0.01 的常態分佈 - noise: 平均是 0, sigma 是 0.5 的常態分佈 - noise01: 平均是 0, sigma 是 0.1 的常態分佈 > | dataset | origin | after smooth | | ---- | ---- | ---- | | Model3D_noise001.csv | 0.055 | 0.0057 | | Model3D_noise.csv | 0.099 | 0.029 | | Model3D_noise01.csv | 0.171 | 0.0565 | - ![](https://i.imgur.com/0N49yI8.png)