p1.png

輸入圖片來源:https://www.pixiv.net/artworks/69390707

object detection & classification by CNN (下) 優化

簡介:

  這篇文章是延續 【研究筆記】object detection & classification by CNN (上) 實作 的研究,上一篇著重在初次嘗試深度學習神經網路 (以下簡稱 NN) 的心得,比較多的敘述都圍繞在數據收集、清理,而 NN 架構上則是直接採用那些鼎鼎有名到 NN 框架都內建的架構。而這篇文章則著重在如何優化上次的結果,優化範圍包含準確度與速度。

 

雜談:

  其實這個後續研究是在【研究筆記】object detection & classification by CNN (上) 實作 發表後就馬上接著進行的,並不是最近研究的新成果,拖到現在是因為研究所忙得不可開交導致整個部落格荒廢許久,不過我已經在今年一月離開研究所並重新回到職場工作。擇我所愛,是我休學的原因;愛我所擇,是我現在能做的。於是在工作半年多、習慣新生活後決定繼續更新部落格。

 

前情提要:

p2.png

輸入圖片來源:LoveLive! School idol festival 角色卡

  上篇中主要分享我從完全不懂 NN 到實作了一個用來辨識《LoveLive! Sunshine!!》中的學園偶像團體 Aqours 九位成員的一個偵測與分類器。架構如圖,這個應用屬於 object detection,前方用 opencv 的 window sliding 與 haar cascade classifier 來做 object localization 偵測出人臉後再傳遞給 CNN 做 classification。然而在結果上我們也發現用來做 object localization 部分的準確率不高,導致整體準確率下降。同時用來做 classification 的 CNN 架構,ResNet50,雖然其出自於有名論文的經典架構讓我輕易的就訓練到 99% 的準確率,但它在原論文中是被設計來解決更難的問題,在此分類器中使用如此大的架構是殺雞用牛刀,並且導致速度上略慢。這篇文章將會針對這兩個問題做優化,最後在下個結論表示調教這些架構的心得。

 

先備知識:

p3.png

p4.png

圖片來源 ResNet 原論文,參考資料 [1]

  本篇的兩個優化中

object localization 部分:需要的先備知識與前篇相同,因為我並沒有深入 haar cascade classifier 而是換了另一個 object detection 領域的經典 CNN 架構,同時我也沒有深入這個新的架構。

classification 部分:需要的先備知識是 ResNet50,因為會藉由更改它的架構來優化,不一定要讀論文,它已經有名到直接丟 google 就有滿多中文的文章在詳解了,至少會需要知道它在架構中主要有四種不同參數的 Residual Block 並且各有兩種 (Basic residual block 跟 Bottleneck block),藉由組合四組參數與兩種類型的 Residual Block 配上不同的重複次數,論文中提出 18、34、50、101 與 152 層等不同架構 (如上圖)。

 

準確度:

  從上篇的結論得知偵測與分類失敗有兩種可能:

object localization classification
沒偵測到人臉 沒收到人臉直接無法判斷
偵測到不是人臉的東西 收到非人臉的東西但是依舊將其高機率歸類於某角色

第一種

p5.png

輸入圖片來源:https://www.pixiv.net/artworks/66335030

第二種

p6.png

輸入圖片來源:http://www.lovelive-anime.jp/uranohoshi/cd.php#cd30

  第一種可能很顯然是 object localization 部分準確率不高,而第二種是因為我原本以為 CNN 有能力在不屬於任何一類時輸出不確定的答案,但從結果看來不管輸入什麼東西,我訓練的 Model 都會給某一個分類極高的確定率 (> 95%)。所以優化正確率的方法就只剩下加強 object localization 讓它不要沒偵測也不要偵測錯誤。

  為了解決這個問題我開始尋找其他也利用 NN 解決 object detection 的有名架構,在尋找期間我發現這個領域主要有兩個研究分支,一方法被稱為 one-stage,其打算利用一個 CNN 就一次完成 object localization 跟 classification 兩個動作;二方法被稱為 two-stage,是跟我用的方法一樣 object localization 跟 classification 各有一個演算法在負責。兩種方法比較有名的分支各分別是 YOLO 跟 R-CNN,相關的論文已放在參考資料中,這邊不在詳細說明他們的原理。在我原本就有一個足夠強大的 classification Model 的前提下,one-stage 的 YOLO 就不考慮了,而在 R-CNN 的各種變形中,我選用 Faster R-CNN,原因是因為我非常幸運的找到需求跟我要求的完全一樣的已訓練 Model,Anime-Face-Detector,只做動漫畫人臉偵測的 Faster R-CNN Model。所以決定直接拿這個已訓練模型來做 object localization。

 

速度:

  由於 classification 部分的 ResNet 已經有足夠高的準確率了,接下來需要的就是優化它的速度,主要方向為縮小 NN 的架構為主,優化器就維持使用 adam 配上其預設的參數來優化。

我優化的步驟如下:

  1. ResNet50 在這個問題上實際可以拿到 99% 的正確率。
  2. 假設這個問題不需要這麼多的層數就能被解決。
  3. 為了驗證這個假設,我隨便設計一個少層數的 CNN 架構發現實際無法解決這個問題,所以我的假設不太正確。
  4. 我把假設更正為這個問題不需要這麼多的層數就能被解決,但它需要 ResNet50 在層數多以外的某些其他特性。
  5. 為了驗證這個假設,我直接改用較少層數的 ResNet18,在實驗下 ResNet18 實際解決問題拿到 95% 的準確率。
  6. 由於假設正確,所以我決定更加減少層數,ResNet18 是由輸入層加上四組參數的 Basic residual block,每個 Basic residual block 有兩層並且重複兩次,最後再加上輸出層,1 + (4 * 2 * 2) + 1 = 18。直接再拿掉重複兩次的設定,提出一個 1 + (4 * 2) + 1 = 10 的 modified ResNet10 以下稱 mResNet10,在實驗下 mResNet10 實際解決問題拿到 96% 的準確率。

p7.png

  在不同的假設與實驗下最終成功將 ResNet50 下降到只剩下 10 層,縮小 NN 架構的大小不只可以獲得更短的訓練時間來方便我們快速調教各種參數,預測時所需要的計算資源也更低,對於部分需要崁入在移動裝置與嵌入式裝置的應用來說是不可或缺的。

 

最終組合:

p8.png

  這次優化的最終組合,偵測與分類兩個部分都由 CNN 來處理

object localization 部分:改用一整個 Faster R-CNN 都拿來只做 object localization,來提升準確率。

classification 部分:用優化過的 mResNet10 做 classification,降低了 classification 部分的 Model 大小。

 

結果展示:

 

  展示剛剛兩種偵測與分類失敗的案例在優化過後成功被偵測與分類

第一種成功被偵測到原本未偵測到的人臉也成功被分類

p9.png

輸入圖片來源:https://www.pixiv.net/artworks/66335030

第二種提供對比圖,誤偵測的非人臉已經不會在被偵測到

p10.png

輸入圖片來源:http://www.lovelive-anime.jp/uranohoshi/cd.php#cd30

結論:

  在讀完一些圖像偵測與分類問題的論文後我依舊採用 two-stage 的原因在於,其不論是上一篇的初次實作或是這一篇的優化,都可以將兩端分開來作數據處裡、替換演算法、優化等,也比較容易知道是哪一端出問題才導致不準確的結果。但是如果今天應用本身需要實時處裡 (例如監視器等) 或是對速度上有要求,我可能就會考慮 one-stage,object localization 和 classification 同時處理的速度通常會更快一些。

object localization 部分:這部分還有一堆優化空間,它面臨跟優化前的 classification 部分一樣的狀況,牛刀殺雞,Faster R-CNN 本身就是 two-stage,它自己就可以連 classification 都做掉,但是我只拿它作 object localization,可以嘗試把 mResNet10 放進去 Faster R-CNN 的第二個 stage,甚至可以在更簡化它的第一個 stage,礙於這是我一門課的期末專題,當初經沒有更多的時間再做優化了。

classification 部分:這部分我非常推薦大家先使用這些強大的架構來解決自己的問題,事後再來像我一樣優化降低它的複雜度。因為刪減沒有用的東西比憑空生出有用的東西還要簡單的多;讀懂這些強大架構並根據假設移除多餘的部分比起設計出與這些強大架構匹敵的架構還要簡單的多。

綜合上下兩篇就是 Aqours Classifier 這個專案的全部內容了,礙於以下因素:

  • 所有的資料集都有版權
  • 我研究時的程式碼通常因為不確定性太高導致相當醜陋
  • NN 的架構比起程式碼本身是更重要的資訊

原始碼就不公開,但是我相信比起原始碼,分享我嘗試 NN 領域的心得、研究過程的假設以及 mResNet10 的架構,對大家的幫助會更大一些。本次的分享就到此為止,謝謝正在觀看的你。

 

參考資料:

[1] Deep Residual Learning for Image Recognition (ResNet 原論文)

https://arxiv.org/abs/1512.03385

[2] You Only Look Once: Unified, Real-Time Object Detection (YOLO 原論文)

https://arxiv.org/abs/1506.02640

[3] Rich feature hierarchies for accurate object detection and semantic segmentation (R-CNN 原論文)

https://arxiv.org/abs/1311.2524

[4] Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks (Faster R-CNN 原論文)

https://arxiv.org/abs/1506.01497

[5] Anime-Face-Detector (動漫畫人臉偵測的 Faster R-CNN & Model)

https://github.com/qhgz2013/anime-face-detector

(其他 Demo 用的圖片皆在使用圖片時附上引用網址,如有遺漏或不妥請告知,將移除或補上)

 

arrow
arrow
    創作者介紹
    創作者 迷宮兔 的頭像
    迷宮兔

    兔窩

    迷宮兔 發表在 痞客邦 留言(0) 人氣()