电竞比分网-中国电竞赛事及体育赛事平台

分享

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

 黃元章3355 2019-03-24

作者——Zahar Chikishev

利用較小的訓(xùn)練數(shù)據(jù)集檢測圖像的關(guān)鍵點(diǎn)位置。

要訓(xùn)練一個可以準(zhǔn)確預(yù)測手指和手掌線條位置的網(wǎng)絡(luò),需要多少張貼有標(biāo)簽的圖像?我的靈感來自于這篇博客(https:///fun-with-small-image-data-sets-part-2-54d683ca8c96)。在這篇博客中,作者談及,從每次訓(xùn)練的135張圖片中區(qū)分出某一人是否帶眼鏡的準(zhǔn)確率高達(dá)97.5%。那么回到正文,從15個不同人的60幅貼有標(biāo)簽的圖像中,我的任務(wù)能得到什么樣的準(zhǔn)確性?

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

12個檢測點(diǎn)

其目的是準(zhǔn)確估計(jì)一個手部圖像12個點(diǎn)的x和y坐標(biāo)。4個點(diǎn)在指尖,4個點(diǎn)在指根,另外4個點(diǎn)沿著掌心線等距,第一個點(diǎn)和最后一個點(diǎn)正好在這條線的起點(diǎn)和終點(diǎn)。

這些訓(xùn)練所需的照片是我朋友的照片。每人6張,左手3張,右手3張。這些照片是用不同的智能手機(jī)在不同白色背景和不同燈光條件下拍攝的。60張圖片都是我手工標(biāo)注的。

對于神經(jīng)網(wǎng)絡(luò)的處理,我使用基于PyTorch的fastai library v1.0.42(https://www./2018/10/02/fastai-ai/)。作為IDE的Jupyter筆記本,和我筆記本的NVidia GTX 960M 4Gb VRAM進(jìn)行訓(xùn)練。我所得結(jié)果的總訓(xùn)練時間是25小時,考慮到這個GPU遠(yuǎn)遠(yuǎn)不是目前市場上最好的硬件,所以25個小時也還不錯。

這個項(xiàng)目的主題是數(shù)據(jù)擴(kuò)充,幸運(yùn)的是Fast AI提供了高效的圖像轉(zhuǎn)換算法,并提供了干凈的API來定義它們。讓我們深入討論細(xì)節(jié)。

數(shù)據(jù)和模型

將標(biāo)記后的數(shù)據(jù)分為51幅訓(xùn)練圖像和9幅驗(yàn)證圖像。驗(yàn)證圖像包括3張人的照片,以及6張既不出現(xiàn)在訓(xùn)練集上也不與訓(xùn)練中上的任何人共用背景或相機(jī)的照片。所有右手的圖像在預(yù)處理中我們都進(jìn)行了水平翻轉(zhuǎn)(如下圖所示)。

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

所有進(jìn)行過標(biāo)記的訓(xùn)練圖片

在如此小的數(shù)據(jù)集上進(jìn)行數(shù)據(jù)增強(qiáng)是必要的,我對進(jìn)入神經(jīng)網(wǎng)絡(luò)的每個圖像采取了隨機(jī)縮放、旋轉(zhuǎn)、亮度和對比度轉(zhuǎn)換等等。Fast AI庫允許我們?nèi)菀椎囟x它。在底層,同樣的仿射變換也應(yīng)用于標(biāo)簽點(diǎn)。圖像按照樣本均值和序列集的方差進(jìn)行歸一化,其中每個RGB通道單獨(dú)進(jìn)行歸一化,并按4:3的比例調(diào)整大小,更具體地說,是384×288像素。聽起來有很多東西需要我們定義。但令人驚訝的是,整個數(shù)據(jù)定義可以歸結(jié)為以下代碼片段:

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

這個模型是標(biāo)準(zhǔn)的resnet34。從resnet34中刪除最后兩個分類層,然后加上1x1卷積來減少通道數(shù),并與兩個完全連接的層相連。第二個全連通層輸出24個激活,經(jīng)過雙曲正切激活函數(shù)后表示為12個關(guān)鍵點(diǎn)的x、y坐標(biāo)。

但有時用代碼說話更好:

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

代碼頭部的定義使用了常規(guī)的PyTorch語法和模塊,除了我寫的重塑模塊之外,它還重構(gòu)了張量。這個重塑是必要的,因?yàn)槲业臉?biāo)簽坐標(biāo)在內(nèi)部由Fast AI表示為12×2張量,它需要匹配。另外,標(biāo)簽被Fast AI重定位到[-1;1]范圍,所以這里使用雙曲正切激活函數(shù)比較合適。

優(yōu)化目標(biāo)是使訓(xùn)練中的L1損失最小化。

有兩個額外的準(zhǔn)確性指標(biāo)來判斷網(wǎng)絡(luò)的性能和進(jìn)度。第一個和第二個指標(biāo)分別為0.1和0.01。即,在驗(yàn)證集上計(jì)算實(shí)際標(biāo)簽與預(yù)測坐標(biāo)誤差在0.1和0.01之間的比例。這里標(biāo)簽的范圍也是[-1;1],給定圖像大小為384×288像素。我們可以很容易地計(jì)算出第二個度量允許高度和寬度的最大誤差分別為1.92和1.44像素。

神經(jīng)網(wǎng)絡(luò)訓(xùn)練

神經(jīng)網(wǎng)絡(luò)訓(xùn)練是通過運(yùn)行這行代碼40次來完成的:

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

除了使用Adam optimizer定期進(jìn)行100個迭代次數(shù)的訓(xùn)練外,F(xiàn)ast AI方法還具較好的學(xué)習(xí)率和動量策略,這是Fast AI在廣泛的應(yīng)用中使用的一種更快收斂的方法。更多細(xì)節(jié)見Sylvain Gugger的博客(https://sgugger./the-1cycle-policy.html)。我發(fā)現(xiàn)它很適合我的模型。對于每100個訓(xùn)練周期而言,在50個訓(xùn)練周期之后,錯誤率比開始時要高,但是在周期結(jié)束時,錯誤總是會得到改善。如果你還是不明白,請看下面這張圖片。

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

學(xué)習(xí)速率(左)和動量(右)在100個epoch變化。

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

迭代次數(shù)損失為2500到2600,每回迭代次數(shù)有8批。我們在迭代次數(shù) 2500中添加了更多的數(shù)據(jù)。

這個學(xué)習(xí)速率和動量的過程稱為1cycle策略。據(jù)說,它還有助于對抗過度擬合,而且它似乎比我嘗試過的其他選項(xiàng)收斂得更快。

我將訓(xùn)練分為5個步驟,以幫助大家理解不同變化的影響:

  1. 1500個迭代次數(shù), resnet34個骨干層'凍結(jié)'在ImageNet的預(yù)訓(xùn)練值上,只訓(xùn)練自定義頭層,并且僅使用35個訓(xùn)練圖像集。
  2. 300個迭代次數(shù)后,'解凍'骨干層。
  3. 700個迭代次數(shù)后,增加了更多的數(shù)據(jù)擴(kuò)充。具體來說,max_zoom 5%到10%,max_warp 5%到20%,max_rotate 5到10度。
  4. 500個迭代次數(shù)后,從另外4個人那里向訓(xùn)練集添加了16個圖像。使訓(xùn)練集的總大小達(dá)到51。
  5. 1000個迭代次數(shù)后,每個cycle減少20%的學(xué)習(xí)率,最后一個cycle達(dá)到1e-5左右的學(xué)習(xí)率。記住,每個周期是100個迭代次數(shù)。

以下圖表總結(jié)了進(jìn)展情況:

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

在4000個迭代次數(shù)后的訓(xùn)練中損失和準(zhǔn)確性度量。

這5個步驟中的每一個都對模型進(jìn)行了額外的改進(jìn)。數(shù)據(jù)擴(kuò)充中的轉(zhuǎn)換尤其重要,它對驗(yàn)證集錯誤的改進(jìn)有重要貢獻(xiàn)。'解凍'和更多的數(shù)據(jù)也為驗(yàn)證集提供了很好的改善。另一方面,雖然降低學(xué)習(xí)率顯著改善了訓(xùn)練集的錯誤,但并沒有較大的突破。過度擬合在這里是一個真正的問題,使用較小的學(xué)習(xí)率會使情況變得更糟。

總的來說,在訓(xùn)練過程中,網(wǎng)絡(luò)共看到14.7萬張不同的變換圖像,訓(xùn)練時間為25.5時。

討論的結(jié)果

訓(xùn)練集的最終平均L1誤差為0.46像素,而驗(yàn)證集的平均L1誤差為1.90像素。此外,訓(xùn)練集的這個分?jǐn)?shù)是針對轉(zhuǎn)換后的圖像,而驗(yàn)證圖像則沒有轉(zhuǎn)換。這是明顯的過擬合。

盡管如此,結(jié)果還是相當(dāng)不錯的,驗(yàn)證集推斷如下圖所示。注意,綠色的點(diǎn)是實(shí)際的標(biāo)簽,紅色的點(diǎn)是最終模型的預(yù)測。從結(jié)果上看,該模型似乎使其預(yù)測更具有全局性和相互依賴性,而不是給局部邊緣更多的權(quán)重。

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

最終結(jié)果:圖1、圖2和圖3是訓(xùn)練集中不同人的手。圖4到6和圖7到9是沒有出現(xiàn)在訓(xùn)練集合中兩個人的手。綠色的點(diǎn)是實(shí)際的標(biāo)簽,紅色的點(diǎn)是預(yù)測的結(jié)果。

模型改進(jìn)的明確方向是更多的數(shù)據(jù)和更智能的數(shù)據(jù)擴(kuò)充。平均誤差仍然需要小4-5倍才可以。

是哪里出現(xiàn)了問題?

在不同的地方添加dropout層等是沒有用的。這可能是因?yàn)槭褂?cycle策略的高學(xué)習(xí)率本身就是一種正則化的形式,不需要更多的正則化。為不同的層組選擇不同的學(xué)習(xí)率也是一個死胡同。

如果一開始就刪除BatchNorm層,模型就會停止訓(xùn)練,即使學(xué)習(xí)率更低(1e-5)。

我嘗試了另外兩種骨干模型架構(gòu),Darknet(https://docs./vision.models.html)和U-Net(https://docs./vision.models.unet.html#vision.models.unet),它們具有不同的自定義頭部,但是在我的實(shí)驗(yàn)中,它不如簡單的resnet34工作得好。

最后,F(xiàn)ast AI庫在這一點(diǎn)上只有仿射變換(平行線映射到平行線)和透視變換(直線映射到直線)??紤]到數(shù)據(jù)增強(qiáng)在這個項(xiàng)目中的重要性,我進(jìn)行了一個額外的轉(zhuǎn)換,如圖所示。然而,由于某些原因,它并沒有帶來改善。

人工智能看“手相”?這回不是玄學(xué),而是Fast AI的經(jīng)典案例!

結(jié)論

該模型僅用51幅訓(xùn)練圖像就達(dá)到了較好的預(yù)測精度。越來越多的數(shù)據(jù)被證明可以提高精度,并在一定程度上成功地對抗過度擬合。

Fast AI庫是這個項(xiàng)目的一個合適工具,它有以下優(yōu)越性:

  1. 簡潔但靈活的數(shù)據(jù)和模型定義
  2. 用于數(shù)據(jù)擴(kuò)充的一系列內(nèi)置仿射和透視圖轉(zhuǎn)換,它們可以自動轉(zhuǎn)換標(biāo)簽點(diǎn)
  3. 智能學(xué)習(xí)率和動量策略似乎能更快地收斂并減少過擬合

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多