WFU

2023年2月9日 星期四

2023 AI 運動專題實作營:黑客松第二名!





這次要和大家介紹的是一個四天的寒假營隊,由 AI4kids 主辦和陽明交通大學合作的 AI 運動營隊。這個營隊主打的是 AI 和運動的結合,讓學生透過實作的方式了解人工智慧和深度學習,也會利用 Python 程式去分析影片中球的路線。




營隊有 60 個人,共分成六個組別,而我是第三組的隊長。營隊前兩天是由 AI4kids 的老師介紹 AI 人工智慧,分別介紹機器學習和深度學習。第三天是由陽明交通大學的教授和研究生來介紹他們做的羽球和網球相關專題。最後一天則是黑客松,每一小組要在有限的時間內完成任務並在結束後上台報告成果。


第一天:認識 AI 人工智慧和機器學習





第一天介紹的是機器學習,電腦會利用人類挑選的特徵去訓練。可以分成監督式學習和非監督式學習,而監督式學習當中又可以分成回歸和分類,指的是用來解決問題的類別。

回歸問題是最終輸出為一個數值的問題,舉例來說,「明天下雨機率會是幾 %?」就是一種回歸問題。回歸(regression)是利用過去已知的資料去預測未來的數值,最常見的類型是線性回歸,利用一條和所有過去的點誤差值最小的線來預測下一個點的位置。

分類問題是最終輸出會是「是」或「否」的問題,像是「照片中的是不是胖丁?」就是一個分類問題。常見的分類(classification)有決策樹和 KNN,決策樹就像是很多層的 if/else 判斷式,經過多層的判斷後到達的就是輸出,KNN(K-近鄰演算法)是利用取附近 K 個資料去判斷何者比較多來決定結果。

實作的部分回歸和分類都有,回歸的部分預測的是病人在一年後糖尿病的惡化程度,分類的部分則是判斷病人有沒有可能得乳癌。回歸實作的資料共有 400 多筆,我們將其分為 80% 的訓練資料和 20% 的測試資料。接著讓我們看著熱力圖當中顯示的,特徵之間的關係指數,並去挑選需要用到的特徵,最後看哪幾個特徵能夠讓最終判斷的誤差最小。分類實作當中則是做 KNN,透過調整 K 的數值,去看看最終的準確度為多少。

透過看程式碼能夠更了解機器學習,不過因為實作的部分只包括觀察更改數值的變化,所以其實沒有什麼挑戰性。較有趣的是我有寫一段程式可以一個一個去嘗試 K 的值並找出最準確的。


第二天:認識深度學習、卷積神經網路





第二天主要在介紹的是深度學習,尤其是卷積神經網路(CNN Convolutional Neural Network)的介紹,還有介紹關於數位圖片的知識。

卷積神經網路是由三大層組成的,輸入層、隱藏層和輸出層。最複雜的部份是隱藏層,是由卷積層和池化層不斷反覆,最後再由全連接層組成一個判斷過程。卷積層是利用卷積核心去找出圖片當中的特徵,而池化層則是將卷積層完成的特徵圖取重要的特徵壓縮圖片。

數位圖片是由很多數字組成的,每一個數字在電腦當中表示的是一個像素的顏色,數字越大越亮。比較特別的是座標系統,相較於平常數學課本中從左下角開始的座標,數位圖片的 (0, 0) 是從左上角開始,而且 y 座標在 x 座標前面。

實作的部分主要專注在 CNN 和卷積核心的部分,CNN 的實作中使用的資料是辨別手寫數字,我們可以調整隱藏層的層數和每次進行訓練的數量,最終會看到準確度。卷積核心的實作則是製作自己的卷積核心並去提取人臉的特徵,像是眉毛、眼睛、鼻子等等。


第三天:用程式進行球賽分析





這一天是由教授和研究生來講課,主要都是環繞在實作的部分,有學到關於電腦視覺的知識和如何利用程式去分析一場球賽、分析數據等等,最後我們還有去球場看判斷正確殺球的程式。

令我印象深刻的是棋盤格法,電腦可以利用偵測焦點並連成直線去校正圖片,可以解除廣角的效果,確認圖片的直線沒有彎曲可以幫助電腦在判斷物件時不會有偏差。




實作的部分有追蹤影片中的球、更換影片中球的圖案和分析數據。我們可以透過追蹤球賽中的球,並顯示出其前幾幀的球位置,就可以看出球的路徑,在實作當中可以更換球的圖片,並更改大小讓其較明顯。我們也有分析資料,可以去判斷一場比賽當中球速最快的、某一拍的飛行距離,擊球的座標點等等,這個部分相當有趣,因為有一個部分是需要自己寫程式計算平均球速最快的一拍。


第四天:黑客松小組競賽


最後一天的黑客松競賽中總共有三個題目可以做選擇,我們選擇的是火球英雄榜。簡單來說就是要從現有的數據當中計算出每一拍得出球速、出球角、擊球座標、飛行時間和距離等等。進階的任務是要去判斷出每一拍的球種和最終的輸贏。

透過這樣的分析可能可以幫助比賽選手了解選手的球風,或自己常犯錯的球種和位置,只要有影片和數據就能夠分析。這樣一來在面對對手之前就可以先擬定出針對對手球風的訓練,增加訓練的效率和品質。





在我們的組別當中,我是負責寫程式的人,也有上台報告。我和我左邊的同學一起擬定了一個判斷球種的判斷式,最後透過不斷的和影片當中的球種去比對,成功寫出判斷球種的程式。另外我們還有去判斷雙方選手最常使用的球種、平均出球速和最快出球速。

在球種判斷的程式當中,最難判斷的有三種球,分別是高遠球、平球和吊球。其中判斷高遠球和平球的方式是發球到接球的 Z 軸(高度)變化,而判斷高遠球和吊球的方法是接球者和網子的距離,因為我們發現並不是每一次高遠球都是從後場發球,常常會和吊球搞混,最後決定用接球位置判斷。


心得與結論


在這四天當中其實非常充實,因為學習到的知識都是之前沒有接觸過的,比較可惜的地方是實作部分並沒有挑戰性,不過可以透過已經寫好的程式觀察撰寫的方式也不錯。最後一天是最有趣的,因為可以自己撰寫程式去達成目標,尤其有很想趕快完成的感覺,不斷地除錯也可以讓程式更加完整。

除了這個 AI 運動營隊以外,還有音樂和醫學的營隊,不過我應該不會想要再參加,因為前兩天的教學應該都是一樣的,此外我對於另外兩個主題也沒有那麼有興趣。




這次在黑客松競賽當中拿到第二名,其實我對這個結果相當意外,因為在看完大家的報告後,我認為應該是有拿到冠軍的機會,不知道自己輸在哪裡。還有一個獎項是學霸獎,是頒發給整體成績最高的組別,我原本也以為會是我們組的,因為我可以說是唯一在課堂上回答老師問題的人類,也許回答問題價值較廉價,最終我們沒有拿到這個獎項。