--- title: 總審文件 tags: 短腿土撥鼠的長高計畫之瘋狂跳跳跳繩 --- <!-- OU< --> # 緒論 > 全國各縣市小學每年都會舉辦一次至二次的跳繩競賽,但在科技發達的 台灣,跳繩比賽的次數計算方式卻仍是以人工來進行,因此,很容易發生跳繩總 次數計算錯誤。本研究使用 KNN 及 MediaPipe 來達成自動計算跳繩次數,以減 少人工計算次數的錯誤及成本。第一、每一位裁判使用平板或手機將每一位學生 跳繩的過程錄製成影片,然後透過平板或手機上的瀏覽器將學生代號及錄完的影 片上傳至我們建置的跳繩伺服器。第二、跳繩伺服器先利用 OpenCV 取出影片中 的每一張圖片,然後再使用人體姿勢追蹤模型(MediaPipe)及 KNN 演算法分析每 一張圖片,以計算學生跳繩的成功次數。第三、計算完每一位學生的跳繩成功次 數後,我們使用 Python+Django+MySQL 將學生成績自動排名並存入資料庫。 在台灣,跳繩是小學生一個健康且有趣的課後消遣,同時也被列為專業運動項目,每年都會定期舉辦一次或兩次跳繩競賽。然而,由於科技的發達,人工統計跳繩次數的方式仍然存在,很容易導致統計錯誤。 >在台灣,跳繩競賽是小學生的樂趣,並且每年都會定期舉辦一次或兩次。然而,由於科技的發達,人工統計跳繩次數的方式仍然存在,很容易導致統計錯誤。為了減少人工統計的錯誤和成本,本研究利用 KNN 及 MediaPipe 進行自動跳繩次數統計。首先,每位裁判使用平板或手機錄製每位學生跳繩的過程,然後透過瀏覽器將學生代號及錄製的影片上傳至我們建立的跳繩伺服器。接著,跳繩伺服器先利用 OpenCV 取出影片中的圖片,然後使用人體姿勢追蹤模型(MediaPipe)及 KNN 演算法分析每張圖片,以統計學生跳繩的成功次數。最後,我們後端採用 Python 的 FastAPI ,前端則是使用 Vue 將學生的成績自動排名並存入資料庫。透過這個系統,我們可以有效地減少人工計算跳繩次數的錯誤,並且節省大量時間和成本。 ## 研究背景與動機 > 在跳繩比賽時常常會使用人工來計算跳繩的次數,如此不但會因為人工計數時眼睛上的疲勞,準確度也不高。 本專題使用 Google MediaPipe 及 KNN 來建立一個可自動計算跳繩次數的模型。 >全國各縣市小學每年都會定期舉辦一次至二次的跳繩競賽,但在科技發達的 台灣,跳繩比賽的次數計算方式卻仍是以人工來進行,如此不但容易發生計算次 數的錯誤,且需花費大量的人力資源來從事重複性高且單一的動作,成本很高。 市面上的跳繩計數器,無論是機械式或是電子式,都存在有跳繩計算次數精 準度的問題。由於這兩種都是使用硬體結構去計數跳繩次數,因此都無法有效辨 別跳繩失敗或意外的狀況,導致計算跳繩總次數時會發生錯誤。 為了解決硬體上計算次數的缺點,我們經過不斷的評估與分析後,決定用 KNN 及 MediaPipe 來達成自動計算跳繩次數的工作,以減少人工計算次數所 造成的錯誤及減少人工的成本。 ## 研究目的 > 1 # 文獻探討 > 1 # 研究方法(篇幅增加) >各縣市小學跳繩比賽的規則是每一位學生跳 30 秒,然後計算 30 秒內跳的成 功次數。為了能自動計算跳繩次數,我們在 4.1 ~ 4.3 節詳細說明如何實作跳繩 自動計數的方法。 4.1 上傳學生跳繩的錄製影片 每一位裁判使用平板或手機將每一位學生跳繩的過程錄製成影片,然後透過 平板或手機上的瀏覽器將學生代號及錄完的影片上傳至我們建置的跳繩伺服 器。 4.2 跳繩次數自動計數 跳繩伺服器先利用 OpenCV 取出影片中的每一張圖片,然後將每張圖片輸入 人體姿勢追蹤模型(MediaPipe)。如圖 4.1 所示,MediaPipe 上粉色點為人體關節 點,很明顯的,每張圖共可取得人體 33 個關節點的座標。 我們將圖 4.1 中人體座標第 23 點(左臀部)與第 24 點(右臀部)的平均值作為我 們人體的中心點,然後以此中心點的 Y 座標變化來分析跳繩影片。圖 4.2 顯示學 3 生在跳繩的過程中,其人體中心點的 Y 座標會有明顯的規律變化,因此本研究 便以此規律變化來自動計算跳繩的次數。 4.2.1 指數移動平均法(Exponential moving average, EMA) 在 MeidaPipe 分析每一張圖片的過程中,其產生的波形可能因人體骨架中心點 座標的特徵提取不穩定而導致整個波形的起伏過大而可能破壞其規律性。因此本 研究使用指數移動平均法來讓整個波形變為更平滑,以降低在多張連續跳繩圖片 中,單張圖片對整個波形的影響程度。EMA 公式如下: EMA1 = EMA2+α*(X- EMA2) EMA1 為目前圖片人體中心點 Y 值的移動平均值,EMA2 為前一張圖片人體中心 點 Y 值的移動平均值,α 為平滑系數,X 為目前圖片人體中心點的 Y 值。 4.2.2 跳繩週期判斷及跳繩次數的計算 當人起跳時,人體中心點的高度會從低點移動至最高點,而當跳繩越過腳後, 人體會下墜至地面;當再次起跳時,人體中心點是處於最低點向上移動的狀態, 我們定義此為一個跳繩週期,T。 假設跳繩影片共有 N 個週期,每個週期 T 由 𝑌𝑖 張跳繩圖片所構成,因此,我 們可由上面對週期的定義歸納出以下方程式: {𝑓= 0 , 𝑖𝑓 𝑌𝑖 ≥ 𝑌𝑖−1, 𝑖 ∈ 𝑁∗ 𝑓 = 1 , 𝑖𝑓 𝑌𝑖 < 𝑌𝑖−1, 𝑖 ∈ 𝑁∗ f 表示中心點目前的狀態,f=0 時表示中心點正在上升,f=1 時則反之。當跳繩成 功的跳一次時,即會產生一個週期 T,等同於 f 的狀態從 01 0,此時表示跳 繩成功,因此將跳繩的總次數加一。當跳繩失敗時會產生多種異常狀況,可能會 導致在計算次數會有誤差,以下我們分析這些異常現象。 4.2.3 異常分析 當跳繩失敗時,我們需要將動作與跳繩校正回預備姿勢,由於校正回預備姿 勢時會導致人體骨架 Y 座標的浮動,因此會使跳繩計數產生誤差。為解決此問 題,我們使用 KNN 來將跳繩圖片分類為跳繩狀態及其它狀態。 我們會預先準備資料集圖片,並將這些圖片分為兩類:{跳繩狀態,其它狀態}, 每一類各包含 500 張圖片。接著我們會使用 MediaPipe 取得每一張圖片的 33 個 關節點座標,然後在關節點座標之間提取共 23 個特徵向量(如表 3.1 所列),此時, 我們便可以計算資料集中所有圖片的特徵向量,並將向量數值儲存至 CSV 檔。 要判斷跳繩的圖片為跳繩狀態或其它狀態時,我們會先將跳繩圖片與資料集 的 CSV 檔進行特徵向量比對,以下分兩個步驟來說明 KNN 的實作方法: 步驟一、過濾離群資料 將跳繩的圖片與資料集的 CSV 做比對,其主要目的是要找到跳繩的圖片與資 料集中的 CSV 那個資料最靠近(差距較少)。差距較大的特徵向量的資料是不會 與跳繩的圖片為同一個狀態,因此我們第一個步驟為過濾在資料集中單一特徵向 量差異較大的資料。 步驟二、聚類分析 完成第一個步驟後,我們會計算跳繩的圖片與剩餘資料的 23 個特徵向量彼此 之間差異,然後取這些差異的平均值。 跳繩圖片經過 KNN 分類後,可得到一個如下所列的預測結果: {跳繩狀態:p,非跳繩狀態:1-p} 當預測結果 p 大於 1-p 時,判斷此跳繩圖片為跳繩狀態;反之,則判斷為其它狀 態。若圖片分類為其它狀態則捨棄目前週期 T,然後重新計算週期。 4.2.4 異常週期分析 KNN 解決了因異常姿勢所導致的計數誤差,但還是會有骨架追蹤所帶來的異 常週期的問題出現。 為解決此問題,我們使用標準常態分布來計算週期 T 的近似面積,然後將累 計機率 5% 以下的週期 T 面積標示為異常數值,最後我們再將這些異常數值過 濾掉。 6 我們使用 𝑌0 及 𝑌𝑛 兩點加上最高點 max(𝑌𝑖) = 𝑌𝑚𝑎𝑥 三點來計算週期 T 的面 積。由歐幾里得距離計算出三點之間的距離: 𝑥 = (𝑥1, 𝑥2), 𝑦 = (𝑦1, 𝑦2) 𝑑(𝑥, 𝑦) = √(𝑥1 − 𝑦1)2 + (𝑥2 − 𝑦2)2 接著使用海龍公式計算面積: 𝐴 = √𝑠(𝑠 − 𝑎)(𝑠 − 𝑏)(𝑠 − 𝑐) ,其中 𝑠 = 𝑎 + 𝑏 + 𝑐 2 計算出所有週期面積 𝐴𝑡0~𝐴𝑡𝑛 後,再使用 Z-score 進行標準化: 𝓏 = 𝑥 − 𝜇 𝜎 ,𝑥 ∈ {𝐴𝑡0~𝐴𝑡𝑛} Z-score 的累計機率值在 5%以下我們就定義為異常數值。 4.3 成績排序及儲存 計算完每一位學生的跳繩成功次數後,我們使用 Python+Django+MySQL 將學 生成績自動排名並存入資料庫。 跳繩伺服器的管理者必須預先建立好每一位參賽學生的資料並將這些資料儲 存在後端資料庫。圖 4.4 為管理者在後端資料庫所建立學生資訊的示意圖,當裁判錄完學生跳繩的過程後,即可上傳該名同學的代號及跳繩影片。跳繩 伺服器會使用 4.2 節的技術對影片進行自動計數,然後對所有參賽學生進行自動 名次排序。 # 研究結果 > 1 # 結論 > 1 # 參考資料 > [1]https://towardsdatascience.com/machine-learning-basics-with-the-k-nearest-neighbors-algorithm-6a6e71d01761 [2] https://google.github.io/mediapipe/ [3]https://www.bilibili.com/video/BV1x54y1y7eo/?spm_id_from=333.788.videocard. [4]https://patentimages.storage.googleapis.com/e1/33/45/3f40e9e7f63700/CN202005973U.pdf --- # 專刊 > 跳繩運動是小學生畢業前的必備技能,在跳繩比賽時常常會使用人工來計算跳繩的次數,如此不但會因為人工計數時眼睛上的疲勞,準確度也不高。 本專題使用 Google MediaPipe 及 KNN 來建立一個可自動計算跳繩次數的模型。首先,裁判錄製學生跳繩比賽時的影片,然後如圖一所示使用我們所建立的網頁前端將影片上傳至由 Django 所架設的後端。然後後端取得影片後會使用OpenCV 將影片讀入並進行切割轉成圖片,再將每張圖片透過 MediaPipe 進行姿勢檢測以取得人體關節點的座標位置如圖二所示。每張圖片的關節點數據經過組合並丟棄部分無用數據以降低複雜度,再投入我們所建立的 KNN 模型判斷跳繩次數。最後如圖三所示將跳繩次數儲存在後端 MongoDB 資料庫中。除此之外,我們也在後端對所有學生的跳繩次數做排名,以方便學校的作業。 --- # 海報 >本專題使用 Google MediaPipe 及 KNN 來建立一個可自動計算跳繩次數的模型。首先使用我們所建立的網頁介面上傳跳繩比賽所錄製的影片,並傳至後端Django 所架設資料庫;然後使用 OpenCV 將影片讀入並使用 MediaPipe 以取得每張照片人體關節點的座標位置;最後使用所建立的 KNN 模型來判斷跳繩的總次數。除此之外,我們也將所有學生的跳繩總次數做排名,並存於後端 的 Mongo 資料庫。