在 2021 年的 3 月,AIdea 平台 上結束為期三個月的「動態足壓影像辨識」機器學習競賽。我在這場賽事裡達到第 18 名的成績(Top 5%),這是我首次參加影像辨識類型的競賽,成績雖然不到頂尖、也在過程中累積了不少經驗。
在這篇競賽心得筆記裡,我將簡述這場比賽的內容、介紹我使用的深度學習模型、並且分享我實驗後發現對提升預測準確度很有用(以及沒什麼用)的幾項數據分析技巧。
目錄
競賽簡介
「動態足壓影像辨識」是阿瘦皮鞋在 AIdea 平台舉辦的機器學習競賽,提供了多組足壓資料,每一組足壓資料包含左、右腳的圖片,以及各有 2 個足部標註點。
足壓圖片是足部壓力等壓線的分層設色圖。而每張圖的 2 個足部標註點,就是兩組 [x, y]
座標,分別標出:
- 足跟:整個足型在行進長軸上的最低點
- 足前:足掌前端,整個腳掌 (扣除趾頭) 在行進長軸上的最高點
在此競賽,參賽者設計的模型要以足壓圖片作為輸入,並且輸出預測 2 個足部標註點。
以歐式距離為計分標準,預測結果離實際座標點越近、得分就越高。

深度學習模型概述
我在此競賽使用的深度學習模型是常見的卷積神經網路架構:ResNet Feature Extraction + Fully-Connected Layers
。
- 圖片特徵擷取:使用未經過預訓練的 ResNet 34 層
- 分類器:三層的全連接層
- 輸出:四個 Sigmoid 神經元(四個座標數值)

上述的深度學習模型主要是用 PyTorch (Python3) 實現,同時也是我首次使用 PyTorch Lightning 框架,這項框架能讓 PyTorch 程式碼更有架構、也有針對深度學習設計的 Debug 功能,讓開發更有效率!有興趣的讀者歡迎參考筆者好豪的 PyTorch Lightning 競賽程式碼。如果你正想入門 PyTorch,也推薦你閱讀我以前學習 Udacity 免費 PyTorch 線上課程 的心得。
實際上,我在競賽過程,調整深度學習模型架構並沒有造成太大的成效差異,主要對預測有幫助的是以下要介紹的幾項技巧。
觀察與裁切:模型只需要看圖片重要的部分
透過探索性資料分析,我從座標點與圖片的關係觀察到:
- 無效率圖片:最上緣以及最下緣存在空白處
- 足部標註點位置:只分佈在特定範圍內
這些觀察讓我產生了假設:
模型不需要看整張圖片、而只需要看圖片的特定部分。

此外,我一開始訓練深度學習模型時,發現足跟座標的預測精準度很高;相較之下,足前座標的預測精準度遜色很多。或許是因為足前的足壓影像涉及了五根腳趾頭、所以複雜得多。也因此我開始嘗試,模型可以分開,只獨立預測足前、或者只預測足跟。
足前、足跟,分開訓練
綜合以上的觀察,我使用的方法如下:
- 訓練一個深度學習模型,只讓它看足跟的影像,只預測足跟的座標
- 訓練另外一個深度學習模型,只讓它看足前的影像、並且把前一個模型預測的足跟座標結果也當作輸入,讓此模型輸出足前的座標
為什麼想這麼做呢?
首先,卷積神經網路的模型大小(總參數量),取決於輸入圖片大小,圖片越小,模型也越小,訓練更快收斂。把圖片裁切到只看足前或足跟的小部分之後,當我想嘗試不同網路架構、或者想使用 Data Augmentation、Ensemble 等技巧時,更快的訓練速度讓我有的實驗流程更敏捷、在有限的競賽時間內能夠嘗試更多改進方案。

這裡有個 Teacher Forcing 的小小細節。Teacher Forcing 概念原本來自 RNN 模型,意思是:如果模型的輸出是來自前一個模型的預測結果,Teacher Forcing 要求輸入(有一定的機率)要使用真實標籤、而不是前個模型的預測。
在我的模型架構中,足跟預測結果會納入足前模型的輸入,因此,我讓足前模型的輸入有時候使用足跟模型預測的座標、有時候使用原始資料的真實足跟座標(Teacher Forcing)。但是,使用這個技巧對模型精準度並沒有太大提升,我認為是足跟座標分佈變異程度較低的緣故,而以下要提的 Pseudo Labeling 同樣是操作模型輸入內容、對精準度提升幫助則更大。
Pseudo Labeling:處理原始資料的錯誤
不論任何監督式學習的機器學習任務,我們身為資料科學家,都必須對標籤資料(Label)保持懷疑。
關於這份足壓標注資料的來源為何,在 競賽官方頁面 寫著:「結合工研院專利技術與物理治療師的專業判讀」,機器自動化判讀有可能會出錯、物理治療師也有可能標註到想睡覺而畫錯座標。實際檢查這份競賽資料集後就會發現:資料內有不少肉眼就能看出的座標標註錯誤。
我們讓模型學習的是標準答案?還是學到標註者的誤差?

要處理標註錯誤的問題,我 過去參加機器學習競賽 曾經從高手身上學到一個好用的技巧:Pseudo Labeling。
Pseudo Labeling:把模型預測結果,當作真實資料標籤,作為模型輸入再次訓練。
在深度學習模型訓練過程,如果驗證集(Validation Set)的準確度沒有繼續提升,我們就會 Early Stopping 停止訓練。但是,驗證集裡也包含了原資料的錯誤標註,準確度低可能是來自於錯誤標註、而不是模型不準確。
因此,我採用 Pseudo Labeling,深度學習模型先訓練到收斂之後,我將資料內所有預測結果與資料標記相差太多的資料點,都用模型預測的結果替換,替換後,模型可以再訓練幾個 Epoch、才再次收斂。
在這個比賽裡使用 Pseudo Labeling 之後,我的深度學習模型精確度確實又向上提升了。然而,Pseudo Labeling 並不是任何場合都有用。在直覺上的解釋,Pseudo Labeling 是讓機器學習模型更加相信它原本就相信的判斷標準,也就是心理學所說的 確認偏誤(Confirmation Bias)。通常,在資料標籤不完善或者不足的時候,Pseudo Labeling 會值得一試,但還是要依據實驗成效決定是否採用、而不是必需為之的動作。
Data Augmentation:減低過擬合
既然是跟影像有關的分析,不得不提起 Data Augmentation(資料增強)技巧。

相較於影像分析最單純的圖像分類問題,在這個比賽,我認為有兩項挑戰:
- 足部標註點必須與圖片同時資料增強。例如:如果圖片旋轉了、標註座標也需要旋轉相同角度,才能維持相對位置不變
- PyTorch 這類套件內建一堆影像資料增強方法(例如 RandomAffine),但是,沒有調整好參數的話,足部標註點可能會在變形後超出圖片範圍、根本無法預測,所以使用每個資料增強都要非常注意參數選擇
詳細的資料增強技巧,我寫在另一篇 比賽心得筆記,文章內將教學資料增強的好用 Python 套件:Albumentations。
Ensemble:小動作、大提升
Ensemble 是個概念相當簡單的動作:
多次抽樣訓練資料、訓練多個架構相同的模型,將這些模型的預測結果取平均值,當作最終預測結果。
我曾從 NLP 競賽 的冠軍身上學到,深度學習模型準確度高、同時也非常容易過擬合。多次抽樣資料訓練多個模型、然後簡單平均預測結果的 Ensemble,雖然聽起來既單純又基本,在深度學習卻是非做不可的技巧,將大大提升模型的泛化能力。
以這次比賽而言,我只是多做了 Ensemble 而已,在 Public Leaderboard 的名次就進步了 10 名!

結語
事實上,我在使用文中這些「花招」以前,光是把深度學習模型正確地訓練好,就達到了前 10% 的名次。在實驗過程中,Pseudo Labeling、Data Augmentation、或是 Ensemble 等技巧,各自對預測精準度都不是大幅改進,但是,擠在最前面名次的高手們,都是在競爭一點點的準度差異,所以一旦想到任何技巧,能試就盡力試、絲毫不能馬虎。
寫這篇文章,除了要記錄自己的心得、也想拋磚引玉,希望在這場比賽的其他參賽者,願意公開分享不同的做法、交流學習。
2021 年 6 月更新:AIdea 平台推出了「動態足壓辨識」的練習場,現在每個人都可以取得影像資料、自己練習分析、並且上傳評分驗證成效。喜歡這個議題的話,趕快上去練練手吧!
看到這裡的你,對影像辨識以及 PyTorch 有興趣嗎?我推薦你從以下兩篇筆記開始閱讀:
也推薦你參考 PyTorch 核心開發者撰寫的課本《PyTorch 深度學習攻略》、以及入門機器學習競賽的好用教材《Kaggle 競賽攻頂秘笈 – 掌握 Grandmaster 制勝的關鍵技術》。
如果你喜歡這篇文章,歡迎點選下方按鈕加入書籤或分享,也歡迎追蹤 好豪的 Facebook 粉絲專頁,我會持續分享更多資料科學的知識與工作心得。