###### tags: `Edge AI` `Edge AI 期中論文報告` `從頭開始說的影像辨識` `論文解說+補充`
# Towards Efficient and Data Agnostic Image Classification Training Pipeline for Embedded Systems
**Reference:
Kirill Prokofiev and Vladislav Sovrasov, "[Towards Efficient and Data Agnostic Image Classification Training Pipeline for Embedded Systems](https://arxiv.org/abs/2108.07049)," arXiv:2108.07049v1 16 Aug 2021**
<font color=#808080>_前情提要--這篇論文主要是針對**優化既有模型**的方法著墨,文章裡優化兩個著名的影像分類模型--[MobileNetV3](https://arxiv.org/abs/1905.02244)以及[EfficientNet](https://arxiv.org/abs/1905.11946),而在本文章當中會從**影像分類的先備工具**開始介紹,然後是**模型優化**的幾種常見方式,最後呈現**論文的實驗結果**。_</font>
:pencil:
<font size=2>***小補充:論文當中著重將機器學習模型放到嵌入式裝置當中,所以需要具備`體積容量小`與`計算量少`的特點,所以預測準確度的標準不同**</font>
<font size=2>***SOTA, State-Of-The-Art,指的是在該領域當中,目前最先進,表現最好的模型**</font>
<font size=2><font color=dd0000>***由於篇幅問題,本文章當中部分專有名詞僅附上連結,沒有多作解釋**</font></font>
## I. 先備工具
### A. 經典的資料集
**要如何判斷一個模型的好壞呢?** 直觀的想法就是預測準確度高、速度快,並且可以運用在各種情境下,然而**要如何判斷模型是否可以利用在所有的情況下呢?** 這個時候就需要利用一個標準來做比較,下面將會列出在影像辨識領域<font color=dd0000>**五大經典資料集**</font>:
#### a. [ImageNet](https://www.image-net.org)
是一個大型視覺訓練專用的資料集,裡面包含了兩萬多個類別,並且有超過一百萬張已標註的影像。
<font size=2>***從2010年開始,每年都會舉行ILSVRC視覺辨識挑戰大賽**</font>

#### b. [CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html)
是專屬給機器視覺學習的圖庫,裡面有十種類別,六萬張的影像,分別為飛機、汽車、鳥、貓、鹿、青蛙、馬、輪船、卡車,以及狗。
<font size=2>***現在也有CIFAR-100的資料集,內有一百種的影像類別**</font>

#### c. [SVHN, Street View House Numbers](http://ufldl.stanford.edu/housenumbers/)
是一個搜集各式各樣戶外門牌號碼的資料集,裡面包含了不同地區、時間,以及天氣所拍攝的影像。

#### d. [Caltech 101](http://www.vision.caltech.edu/Image_Datasets/Caltech101/)
是加州理工學院自己產生的數據集,裡面包含了101種類的影像。

#### e. [SUN397](https://paperswithcode.com/dataset/sun397) (SUN, Scene UNderstanding)
是一個用於場景理解(Scene UNderstanding)基準測試的資料集,內涵397種類。

### B. 經典的影像辨識模型
知道著名的資料集之後,在這個部分將會介紹影像辨識當中相當著名的<font color=dd0000>**四大模型**</font>:
#### a. AlexNet
是一個卷積神經網路(CNN)架構,透過模型的深度來增加準確度,所以計算成本很高,在加入GPU的幫助之後,使其具有可行性,但仍不適用在嵌入式系統上。
<font size=2>***該模型在2012年ImageNet的ILSVRC大賽中以15.3%的「Top-5錯誤率」榮獲第一名**</font>
**<u>架構</u>:**

#### b. ResNet
其中最大的貢獻就是 **「Residual」** 的概念(如下圖),這可以降低參數量並減少運算複雜度(,還可以避免次要特徵在深層網路會消失的問題)。
<font size=2>***依照模型不同的深度,可以分成ResNet18、ResNet34(一般的residual block),以及ResNet50、ResNet101、ResNet152(擴張為4的`Bottleneck Block`)**</font>
**<u>架構</u>:**

<font size=2>***Bottleneck Block是利用中間加入Kernal(1*1 filter)來達到減少運算量,效果如下:
若是要將(28x28x192)的feature map利用(5x5)的filter,產生(28x28x32)的new feature map,則所需要的參數量是(28x28)x(5x5x192)x32 = 120M,而透過瓶頸層則可以縮減(28x28)x(5x5x16)x32 + (28x28)x(1x1x192)x16 = 12M**</font>

#### c. [MobileNet](https://iter01.com/590254.html)
<font size=2>***separable convolution (可分離卷積),分為:</br>:one:空間可分離:將一個大的卷積核變成兩個小的卷積核

:two:Depthwise separable convolution(深度可分離),透過改變Filter架構達到減少參數值的效果。其中包含DW, Depthwise_Convolution(上)&PW, Pointwise_Convolution(下),以原本的CNN方式計算parameters of filter會是(5x5x3x256=192000),而經過深度分離之後會變成(5x5x1x3+1x1x3x256=843)**</font>
<font size=2>***Depthwise Convolution: Filter的深度為1,提取各個通道中的特徵**</font>
<font size=2>***Pointwise_Convolution: Filter的面積為1x1,提取通道之間的特徵**</font>

##### 1. MobileNetV1
**目標**:在保持**精確度**的前提,**減少參數量**與**模型複雜度**。
:one: **Width Multiplier(alpha)**:在每一層網路的輸入輸出通道數進行縮減。
:two: **Resolution Multiplier(rho)**:用於控制輸入和內部層表示,即用解析度因子控制輸入的解析度。
**<u>架構</u>:**

##### 2. MobileNetV2
**目標**:考慮更多的特徵,增加準確度。
:one: **Inverted Residuals**:利用Pointwise可以擴增通道的特性,解決V1當中DW因前層通道數太少而影響特徵的提取。
:two: **Linear Bottlenecks**:即上述之Bottleneck Block。
**<u>架構</u>:**

##### 3. MobileNetV3
**目標**:朝向輕,短,簡為目標。
:one: **SE Module (Squeeze-and-Excitation)**:一種輕量級的**通道注意力模組**,透過特徵提取,賦予每個通道不同的權重值。
:two: **NAS, Neural Architecture Search**:一種**自動化設計人工神經網絡**的方法。通過學習**通道之間的關係**,自動獲得每個特徵的重要程度,提升有用的特徵並抑制用處不大的特徵,提高網路所產生表示的質量。
**<u>架構</u>:**

#### d. EfficientNet
這是一個把**NAS**用到出神入化的一種模型(如下圖),他沒有絕對的形狀,而是透過NAS的方式進行探索,來決定模型的高矮胖瘦,以達到最佳化的**輕量化**與**準確度**。

**<u>架構</u>:**

### C. 嵌入式系統
是一種具有**專一功能**以及**即時計算效能**的小型電腦系統,但在計算力及容量都比電腦少很多,所以要存入的內容物就有很大的限制。
***BUT!*** **為什麼我們不把東西都放到雲端上呢?** 雲端的好處在本篇文章就不再多提了,但是為什麼 **「上雲運動」** 一直無法盛行呢?主要是**兩個原因**::one:**網路安全性**:two:**資訊延遲問題**,所以**邊緣運算**出現了!
**邊緣運算**,將嵌入式系統裝置部署在本地端,**直接**做傳輸與計算。以下是<font color=dd0000>**常見嵌入式系統裝置**</font>介紹:
#### a. [Arduino](https://www.arduino.cc)
因為**入手容易性**而聞名,是許多~~初踏進Maker坑的~~人會選擇使用的開發版,而在官網當中,有一個很友善的[專屬討論社區(免費)](https://forum.arduino.cc/?_gl=1*13s42fd*_ga*MTg3NTk4MjIwLjE2NDgyODExMjQ.*_ga_NEXN8H46L5*MTY0ODI4MTEyNC4xLjEuMTY0ODI4MTIyOC4w)可以和很多大神交流,也可以提出疑問。

#### b. [Raspberry Pi](https://zh.wikipedia.org/wiki/树莓派)
是一種以ARM為架構的電腦處理器(單板微電腦),其宗旨是要以低價硬體,及[自由軟體](https://zh.wikipedia.org/wiki/自由软件)來促進學校的基本電腦科學的教育,操作環境是[UNIX](https://zh.wikipedia.org/wiki/UNIX)架構,而較多人使用的作業系統為raspberry自行開發的Raspberry Pi OS,或是Ubuntu。

#### c. [ARM, Advanced RISC Machine](https://zh.wikipedia.org/wiki/ARM架構)
是一種處理器核心,我們較常接觸的是屬於低階系列--ARM Cortex-M。它是一種可程式的晶片,經常被使用在電源管理制器、輸入/輸出控制器、系統控制器、觸碰螢幕制器、智慧電池控制器以及感測器控制器。

#### d. [FPGA, Field Programmable Gate Array](https://zh.wikipedia.org/wiki/现场可编程逻辑门阵列)(現場可程式化邏輯閘陣列)
以PAL, GAL, CPL所組成,由可程式化邏輯裝置為技術基礎,可作為「特殊應用積體電路」中的一種**半客製化電路**,既彌補全客製化電路不足,又克服原有可程式化邏輯控制器門電路數有限的缺點。

### D. ToolKit -- [OpenVINO](https://grady1006.medium.com/%E9%82%8A%E7%B7%A3ai%E7%B3%BB%E5%88%97-openvino-%E6%87%B6%E4%BA%BA%E5%8C%85-55f357ceae75)
<font size=2>***OpenVINO, Open Visual Inference and Neural Network Optimization**</font>
<font size=2>***工具包內容物: :one:Deep Learning Deployment Toolkit (DLDT), :two:Deep Learning Model Optimizer: 將從不同框架所訓練出來的模型做格式與參數優化轉換, :three:Deep Learning Inference Engine: 針對不同硬體做模型掛載的API接口, :four:Samples: intel自家開發的參考模型, :five:Tools: 模型的校正與量化以及準確度驗證, :six:Open Model Zoo: 是OpenVINO的子專案,裡面包含Pre-trained, Demo Application, Tools, 利用工具可以立即體驗應用, :seven:OpenCV, :eight:OpenCL™ version 2.1, :nine:Intel® Media SDK, :one::zero:OpenVX***</font>
是一個**免費**工具包,透過裡面整合的**常用函式**與**深度學習模型**以及強大的**硬體設備**,可以協助我們快速開發與驗證**電腦視覺**的應用問題。

#### a. 常用函式
<font size=2>***這裡提供了三種跨平台(Open Source)關於電腦視覺工具**</font>
##### 1. [OpenCV, Open Source Computer Vision Library](https://ithelp.ithome.com.tw/articles/10251665)
從初踏入影像領域小毛頭到熟練老手都會接觸到的工具,裡面包含許多**基本影像處理**的方法,是相當實用的Library。
##### 2. [OpenCL, Open Computing Language](http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi)
由用於**編寫Kernel的語言**與一組用於**定義並控制平台的API**所組成,是一個為異構平台編寫程式的框架,可用於CPU、GPU、DSP、FPGA或其他類型的處理器與硬體加速器所組成的平台。
##### 3. [OpenVX](https://medium.com/@kobeyu/openvx-%E7%B0%A1%E4%BB%8B-b706fb868012)
對於電腦視覺跟類神經網路的應用提出的一系列API,其目的是讓異質核心的嵌入式系統達到最佳的執行效率,工作方法是作用在硬體語言與應用程式之間。

#### b. 深度學習模型
<font size=2>***這是intel(OpenVINO)提供之已訓練完畢模型範例可供大家使用**</font>
:one: 人臉模型: 臉部偵測、頭部姿態、表情、特徵點、性別年齡辨識

:two: 人體模型: 人員偵測、高角度人體偵測、行人屬性、跨影片追蹤、動作姿態辨識、骨架偵測

:three: 車輛模型: 車輛偵測、車牌辨識、車道線偵測、路面區域分割、車種辨識、路標號誌

:four: 其他模型: 文字標籤偵測、高解析度

#### c. 硬體設備
在intel平台上可以使用其部屬的設備進行推論,包含CPU、GPU(內顯)、NCS、Movidius VPU、FPGA, 但不支援Nvidia和AMD的設備 ~~(競爭對手)~~。
****
**終於介紹完影像辨識(分類)的基本工具了**:confetti_ball:
**`接下來要分享聰明通靈的方法(誤?),是說在訓練模型時最困擾的應該是「如何設定超參數(hyperparameters)」這個問題吧?在接下來的「模型優化」段落,就要來介紹如何聰明的選擇!`**
****
## II. 模型優化
:pencil:
<font size=2>***泛化能力(generalization ability):機器學習模型有學習到`隱含在數據對背後的知識`,對於不同規律的數據經過訓練也能有適應能力**</font>
<font size=2>***Robustness(穩健性)(魯棒性):系統在收到noisy或是uncertain的訊號時,仍然可以保持穩定的特徵行為**</font>
<font size=2>***[TPE, Tree-structured Parzen Estimator](https://www.twblogs.net/a/5c86126ebd9eee35fc142801):是一種樹狀圖結構配置空間上的超參數選擇方式**</font>
### A. Learning Rate
指的是在優化模型參數時每次**移動步伐的大小**,**太大**會很容易錯過最佳化的地方;**太小**會拖延學習的時間,其中有<font color=dd0000>**三個重要的參數**</font>
:one:**Initial Learning Rate**:初始設定。
:two:**Learning Schedule**:隨著時間,學習速率的變化公式。
:three:**Stopping Condition**:這是訓練加速的方法,設定一個足夠小(自己滿意)的Loss值,**達到目標後就不再學習**。

<font size=2>***Steepest Gradient:梯度下降法(Gradient descent)是`學習率選擇`的基本概念,我們透過`方法`選擇一組參數,計算過後與真實情況相比後會得到誤差,若誤差值如下梯度圖,我們會選擇最快(steepest)到達最佳化之處**</font>

### B. Data Augmentation(影像資料增補)
由前述可以知道在機器學習當中資料集是相當重要的,對於**數量較少**的資料會因為不平衡而損失精確度,為解決此問題有以下<font color=dd0000>**四種增加資料量**</font>的方法:
:one:**Random Crop(隨意剪裁)**:將圖片隨機的剪裁,可以獲得**局部的特徵**

:two:**Color Perturbation(顏色擾動)**:將整張圖片的顏色進行同種的**變色處理**,這可以使模型學習到**形狀的特徵**,而不是顏色的部分

:three:**Rotation & Flip**:這是影像增補當中最常使用的方法,因為其的**可控性**,而且圖片的size也不需要另外做調整


:four:**數據增強**:綜合上述三種工具,這裡提出<font color=dd0000>**四種有效利用工具**</font>的方法
:large_blue_circle:**MixUp**:透過**將兩張圖像與標籤按權重逐像素相加,得到新樣本**的方法,改善機器學習模型**過度擬合**於輸入資料的問題

:black_circle:**CutMix**:先利用**特徵熱力圖**找到最重要的特徵處將其剪掉,這個動作可以讓模型學習比較**難的特徵地方**

:red_circle:**FMix**:是MixUp的一種變形方法,在做**影像融合**的時候不是利用內插法,而是**將圖像轉換到傅立葉空間**,取得低頻的圖像之後再轉換回來

:white_circle:**AugMix**:將影像進行多種**改造**後**疊合**在一起,避免新產生的影像無意義,所以會與原影像做**比對**

### C. Regularization(正則化)
當模型訓練時的準確度太高就需要擔心**過度擬合**的問題,簡之就是模型只適合這群資料集,當在實際利用時準確度就會下降很多,這個時候就需要加入正則化,會使訓練與測試的準確度較為相近。

### D. Optimization
#### a. Learning Optimizer
##### 1. SGD, Stochastic Gradient Descent
每個訓練樣本透過**隨機的梯度下降權重**可以更快地達到收斂,為了通過隨機梯度下降獲得準確的結果,以**隨機順序**呈現數據非常重要,所以每個epoch會打亂訓練集以防止循環。
##### 2. SAM, Sharpness Aware Minimization
將真實的參數模型視覺化表示會像是左圖,透過SAM會先將整體**環境平坦化(Sharpness)** 再來尋找最佳點,如此可以有更好的**泛化能力**。

##### 3. AdaGrad
這是SGD的進階版,當次的學習率會**參考過去的行為**,如此可以增快前期訓練,到了後期也可以透過微調達到最佳化。
##### 4. Adam
此為AdaGrad的進化版,是更有智慧的利用過去狀態,數值優化每次都會考慮到前一步的 **[動量(Momentum)](https://ithelp.ithome.com.tw/articles/10236554)**,如此除了可以加快訓練速度,亦可**跳脫Local Minima**。
##### 5. AdamW
此透過 **正則化(L2)** 解決Adam泛化性不足的部分。
<font size=2>***若是上面的介紹比較難懂,筆者有找到一個很棒的網站,包含SGD->Adam的動圖會更好理解--[梯度最佳解相關算法](https://chih-sheng-huang821.medium.com/機器學習-基礎數學-三-梯度最佳解相關算法-gradient-descent-optimization-algorithms-b61ed1478bd7)**</font>
#### b. Data Optimizer
##### 1. softmax
當輸入資料**數值差距不大**時會導致學習上的困難,透過此方法可以**拉大之間的差距**,使其特徵更加明顯。

##### 2. AM-softmax, Additive Margin softmax loss
這是softmax的強化版,除了將輸入資料分開之外中間還加上間隔(margin),這會使學習效果更加提升。

#### c. Compression
##### 1. Pruning
將權重較小的連結移除,除了減少記憶體容量,也可以避免過度擬合的情況。**</font>

##### 2. Knowledge Distillation(知識蒸餾)
大模型將某種特定功能的知識傳遞給小模型來減少參數,有點像是老師教導學生的模式。

##### 3. Deep Mutual Learning
這打破知識蒸餾的層級與單向之關係,而是類似同學互教互學的學習的概念。

#### d. Trick
##### 1. Fine-Grained Grid Search
不同於一般設定區間以隨機的方式盲找超參數,是一種有效率的**網格**尋找方式。

##### 2. ReduceLROnPlateau
一種衰降學習率的方法,用於模型訓練後期**成效都沒有好轉時,就進行一次學習率衰降**,如此有助於跳脫Local Minima朝向Global Minia。
## III. 論文結果
本片論文利用時下最著名的light weight model -- **MobileNetV3** & **EfficientNet**透過前述的增強與優化方法,提升準確度與運算速度。
### A. 實驗材料
#### a. 資料集
論文當中採用下圖之11種資料集來做測試

#### b. 比對標準
mAP, mean Average Precision:這是評斷物件偵測(辨識)模型的一種標準,將每種類別的準確度計算後再做平均。

### B. 實驗結果
表格二是在比較**原始的模型訓練**與**加上模型優化**對於前述之11種模型的mAP,表格三為個別模型與資料集的評比。


#### a. Baseline
training length is **200 epochs**; **learning rate is annealed to zero with cosine schedule**; optimization is performed with **SGD with momentum**; training images are augmented with **random flip, random color jittering, random crop** and **random rotation**; **dropout with p = 0.2** is applied to the classifier layer; learning rate is set as an average of optimal learning rates obtained by grid search over all the 11 considered datasets for each model individually.
#### b. Adaptive
**maximum training length to 200 epochs**, **maximum amount of trials in TPE to 15 (each trial takes 6 epochs or less)**; **learn- ing rate search range** for **EffficientNet-B0 is [0.001−0.01]**, while for **MobileNetV3 the range is [0.005 − 0.03]**; **Augmix with a pre-trained** on ImageNet policy, **random flip, random crop and random rotation** are employed for data augmentation; **early stopping and learning rate decay patiences are equal to 5 epochs**; **ρ in SAM is 0.05**. **Weight decay is always set to 5 · 10−4**. Input resolution for all versions of the considered models is **224 × 224**, no test time augmentation is applied.
### C. Ablation Study
#### a. 由上述模型進行拆解
經過測試我們可以得到比較好的準確度,而在這個部分將其**拆解**,來得知增加某個工具之後準確度的差異。

<font size=2>***根據NBD這項進行其他參數的訓練結果**</font>

#### b. 其它
##### 1. MobileNetV3 + Adaptive
:one: Input datasets: CIFAR-100, DTD, Flowers, Cars, Pets, Caltech101
:two: Adaption: random flip, rotate, scale, and color jitt

##### 2. EfficientNet-B0 + Adaptive
:one: Input datasets: CIFAR-100, DTD, Flowers, Cars, Pets, Caltech101
:two: Adaption: random flip, rotate, scale, and color jitt

##### 3. (MobileNetV3 vs. EfficientNet-B0) + Adopting SAM(ρ= 0.05)

##### 4. ReduceLROn-PlateauV2 scheduler 測試
:one: Input datasets: CIFAR-100, FOOD101, DTD, Flowers, Cars, Pets, Caltech101
:two: **cosine schedule** for **200 epochs**, all the cases **learning rate was fixed to 0.013**, **SGD** was set as an optimizer.

:three: Distribution of optimal learning rates: 利用本篇題及之11種數據集找出最佳化學習率分布

##### 5. 不同超參數選擇方法比較 (using MobileNetV3-large)
:one: Input datasets: 本篇題及之11種資料集
:two: use **6 epochs per trial** and **restrict the number of trials to 15**, trials are conducted on
**all the training data**

##### 6. Different DML settings (using MobilenetV3-large)

## IIII. 補充資料
<font size=2>***MobileNetV3 vs. EfficientNet 的效能比較**</font>

****
結語 :pencil2:
這篇論文雖然**沒有新穎的想法**,但提供很多**工具**幫助我們**解決問題**,同時也讓我們學習到**做實驗的方法**,`另外,透過撰寫論文研讀總結文章,不僅讓我練習表達學習內容的能力,也在查詢資料當中加深了很多對於基本工具的認識`,最後在這裡提供在查詢資料時找到的**免費機器學習的教學網站**,提供大家參考 :sunflower:
<font size=2>***[Fast-ai's Heuristic](https://en.wikipedia.org/wiki/Fast.ai):是一個非營利的組織,其專注於深度學習以及人工智慧,開放免費課程期望智能產業民主化,這裡是[官網連結](https://www.fast.ai)。**</font>
****