1簡介
人工智能圖像識別是人工智能領域的一個重要分支,它涉及計算機視覺、深度學習、機器學習等多個領域的知識和技術。圖像識別主要是處理具有一定復雜性的信息。計算機采用與人類類似的圖像識別原理,即對圖像的重要特征進行分類和提取,并有效排除無用的多余特征,進而實現圖像識別。一般而言,圖像識別有四大類任務:(1)分類-Classification:解決“是什么?”的問題,即給定一張圖片或一段視頻判斷里面包含什么類別的目標。(2)定位-Location:解決“在哪里?”的問題,即定位出這個目標的的位置。(3)檢測-Detection:解決“在哪里?是什么?”的問題,即定位出這個目標的位置并且知道目標物是什么。(4)分割-Segmentation:分為實例的分割(Instance-level)和場景分割(Scene-level),解決“每一個像素屬于哪個目標物或場景”的問題。
我們之前已經介紹了如何使用分類任務進行手寫數字的分類。相信大家腦海中可能會產生如下疑問:
數據依賴性強:分類模型的表現通常依賴于大量的標注數據進行訓練。獲取高質量、大規模的數據集既耗時又昂貴。
泛化能力有限:模型可能在訓練數據上表現良好,但在遇到未曾見過的數據(例如不同環境、光照條件、角度等)時性能可能會下降。
對異常值敏感:如果訓練集中包含異常值或者噪聲數據,這可能導致模型學習到不正確的模式,從而影響其準確性。
類別不平衡問題:當某些類別的樣本數遠多于其他類別時,分類器可能會偏向多數類別,導致少數類別的預測精度較低。
過擬合風險:復雜的模型容易在訓練數據上過擬合,即學到了訓練數據中的特定特征而不是一般化的規律,從而降低了模型在新數據上的泛化能力。
對抗攻擊易感性:圖像分類模型容易受到精心設計的對抗樣本的影響,這些樣本在人類看來幾乎與原始圖像相同,但卻會導致模型做出錯誤的分類。
背景干擾:在自然場景中,目標物體周圍復雜的背景信息可能會干擾分類結果,使得分類器難以專注于真正重要的區域。
在深入探討了圖像分類任務及其面臨的挑戰之后,我們現在將目光轉向一個更為復雜的計算機視覺問題——目標檢測。
如果說分類任務是識別圖像中主體內容的是什么?的問題,那么目標檢測則是進一步解答在哪里?
目標檢測不僅需要識別出圖像或視頻流中存在哪些類型的物體,還需要精確定位每個物體的位置。這種能力對于許多實際應用場景至關重要,比如:
自動駕駛汽車需要準確地識別并定位行人、其他車輛和交通標志;
安防監控系統依賴于實時檢測異常活動的具體位置;
隨著物聯網(IoT)的發展以及邊緣計算能力的增強,越來越多的目標檢測應用開始直接在靠近數據源的邊緣設備上運行。這不僅減少了數據傳輸延遲,保護了用戶隱私,同時也減輕了云端服務器的壓力。然而,在邊緣端部署高效且準確的目標檢測模型并非易事,它涉及到從選擇合適的算法架構到針對特定硬件平臺進行優化等一系列復雜的工作。
接下來,我們將詳細介紹如何在資源受限的邊緣設備上成功部署目標檢測模型,探索其背后的原理和技術,并討論解決該領域內常見挑戰的方法。
2 目標檢測模型介紹
在目標檢測的任務中,有著許許多多的模型,如 Picodet、Faster R-CNN、YOLO、SSD等,它們都實現了檢測目標并定位其位置的功能。我們主要介紹的是百度的Picodet模型,它是一種基于深度卷積網絡(DNN)的輕量級目標檢測模型,具有非常高的檢測精度,可以在低算力設備進行實時的端到端推理檢測。
2.1 Picodet模型介紹
目標檢測在各個領域都有廣泛的應用,然而,在移動端工業領域的實際應用中,對目標檢測算法提出了更為苛刻的要求:需要實現高速度、高精度、小體積、易部署等特性。為應對這一挑戰,百度于2021年末發布了一篇關于移動端性能卓越的實時目標檢測網絡 PP-PicoDet。PP-PicoDet 具有以下架構優點:
網絡架構優化: PP-PicoDet 基于 ShuffleNetV2 進行改進,引入了 SE 模塊和 Ghost 模塊,同時采用神經網絡搜索(NAS)技術,最終形成了 ESNet(Enhanced ShuffleNet)作為骨干網絡,以在移動端保證高效性能。
采樣策略和標簽分配: 使用 SimOTA 采樣策略,動態變換標簽分配方式,并采用VFL+GloU替代CELoss+IoU作為損失函數,從而提高模型的訓練效果。
激活函數和學習率策略: 將 H-Swish 替代 Relu 作為激活函數,采用 cosine 學習率衰減策略,以提高模型的學習能力和泛化性能。
硬件友好性: 在驍龍865等硬件平臺上表現出色,并支持快速導出為 ONNX 格式,使得模型在硬件部署時更加友好和高效。
在此基礎上,2022年初,PaddleDetction 再次發布了增強版本的 PP-PicoDet,在以下方面做出了改進:
引入 TAL 及 ETA Head,優化 PAN 等結構,精度提升2個點以上
優化 CPU 端預測速度,同時訓練速度提升一倍
導出模型將后處理包含在網絡中,預測直接輸出 box 結果,無需二次開發,遷移成本更低,端到端預測速度提升10%-20%。
2.2 模型結構
PP-PicoDet 網絡結構圖如下所示:
Backbone:基于 shuffleNetV2 改進,ESNet,輸出 C3,C4,C5 特征圖進入 neck;
Neck:CSP-PAN,接受 C3,C4,C5輸入,輸出 P3,P4,P5,P6;
2.2.1 BackBone
基于大量實驗,發現 ShuffleNetV2 比移動設備上的其他網絡更穩健。為了進一步提高 ShuffleNet V2 的性能,遵循 PP-LCNet 的一些方法來增強網絡結構并構建一個新的骨干網,即增強型 ShuffleNet(ESNet)。下圖詳細描述了 ESNet 的 ES 塊。SE 模塊在加權網絡通道以獲得更好的功能方面做得很好。因此,將 SE 模塊添加到所有塊中。與MobileNetV3 一樣,SE 模塊兩層的激活函數分別是 ReLU 和 H-Sigmoid。信道混洗提供了 ShuffleNetV2 信道的交換信息,但它會導致融合特征的丟失。為了解決這個問題,當步幅為2時,添加了深度卷積和逐點卷積來整合不同的信道信息(圖 a)。GhostNet 的作者提出了一種新的 Ghost 模塊,該模塊可以用更少的參數生成更多的特征圖,以提高網絡的學習能力。在步幅設置為1的塊中添加 Ghost 模塊,以進一步提高 ESNet 的性能(圖b)。
2.2.2 Neural Architecture Search(NAS)
Picodet 提出首個針對目標檢測器的 one-shot 搜索的工作。目標檢測模型搭配在分類上高性能的主干網絡,可能會因為不同任務間的差異而性能下降。Picodet 沒有去搜索一個較佳的分類器,而是在檢測數據集上訓練和搜索檢測的超網絡,從而介紹了大量計算并且達到檢測而不是分類的最優。此框架僅需兩步:(1)在檢測數據集上訓練 one-shot 超網,(2)使用 EA(evolutionary algorithm,進化算法)算法對訓練好的超網絡進行架構搜索。
2.2.3 CSP-PAN and Detector Head
使用PAN結構來獲得多層特征圖以及 CSP 結構來進行相鄰特征圖間的特征連接和融合。在原始的 CSP-PAN 中,每個輸出特征圖的通道數與來自主干網絡的輸入特征圖保持相同。對于移動設備來說,這樣大通道數的結構具有昂貴的計算成本。為了解決這個問題,本文用1 × 1 卷積使所有特征圖中的通道數與最小的通道數相等,(也就是都設為96)。通過 CSP 結構實現 top-down 和 bottom-up 的特征融合。縮小的特征使得計算成本更低且不損失準確性。此外,在原有 CSP-PAN 的頂部加入了一個特征圖尺度分支來檢測更多物體。與此同時,所有除了1 × 1 卷積外的卷積層都使用深度可分離卷積(Depthwise Separable Convolution)。深度可分離卷積使用5 × 5 卷積擴大感受野。這種結構在使用很少參數的情況下給精度帶來了大幅度提升。模塊的具體結構如下圖所示。
在檢測頭中,使用 Depthwise Separable Convolution和5 × 5 卷積來擴大感受野。深度可分離卷積的數量可以被設置為2、4或更多。Neck 和 head 部分都有四個尺度分支。其中 head 部分的通道數與 neck 部分保持一致,并將分類和回歸分支耦合在一起,在 Picodet 中耦合預測頭在沒有降低通道數時表現更好。
2.3 神經網絡的相關知識點
2.3.1 卷積的基本概念
卷積是一種數學運算,在計算機視覺中被廣泛應用于特征提取。它通過一個小型矩陣(稱為卷積核或濾波器)與輸入圖像的局部區域進行相乘并求和,生成新的特征圖(Feature Map)。這個過程可以看作是用卷積核掃描整個輸入圖像,以捕捉圖像中的模式,如邊緣、紋理等。
卷積操作有幾個關鍵參數:
卷積核(Kernel):也被叫做濾波器(filter),假設卷積核的高和寬分別為?和,則將稱為?×卷積,比如3×3卷積,就是指卷積核的高為3, 寬為3。卷積核中數值為對圖像中與卷積核同樣大小的子塊像素點進行卷積計算時所采用的權重。
填充(Padding): 填充(Padding)是在卷積神經網絡(CNN)中為輸入張量的邊緣添加額外的像素,以控制輸出特征圖的大小并保持輸入圖像的空間尺寸。填充有助于保留輸入圖像邊緣的信息,并在卷積運算中避免空間尺寸的過度縮小。
步長(Stride): 步長(Stride)是卷積操作中的一個參數,決定了卷積核在輸入圖像上滑動的步幅。具體來說,步長定義了卷積核每次滑動的距離。它控制了卷積運算中卷積核在輸入圖像上移動的距離,從而影響輸出特征圖的大小。
卷積層輸出特征圖的尺寸計算:
其中,H為輸出特征圖的高度和寬度(假設輸入為正方形圖像),W為輸入圖像的高度和寬度,F為卷積核大小,P為填充,S為步長。卷積的計算過程
2.3.2 逐深度卷積
逐深度卷積(Depthwise convolution,DWConv)與標準卷積的區別在于,深度卷積的卷積核為單通道模式,需要對輸入的每一個通道進行卷積,這樣就會得到和輸入特征圖通道數一致的輸出特征圖。即有輸入特征圖通道數=卷積核個數=輸出特征圖個數。假設一個大小為64×64像素、3通道彩色圖片,3個單通道卷積核分別進行卷積計算,輸出3個單通道的特征圖。所以,一個3通道的圖像經過運算后生成了3個 Feature map,如下圖所示。其中一個 Filter 只包含一個大小為3×3的 Kernel,卷積部分的參數量為:depthwise=3×3×3=27。
2.3.3 逐點卷積
逐點卷積(Pointwise Convolution)就是 W/H 維度不變,改變 channel。根據深度卷積可知,輸入特征圖通道數=卷積核個數=輸出特征圖個數,這樣會導致輸出的特征圖個數過少(或者說輸出特征圖的通道數過少,可看成是輸出特征圖個數為1,通道數為3),從而可能影響信息的有效性。此時,就需要進行逐點卷積。逐點卷積(Pointwise Convolution,PWConv)實質上是用1x1的卷積核進行升維。在 GoogleNet 中大量使用1x1的卷積核,那里主要是用來降維。1x1的卷積核主要作用是對特征圖進行升維和降維。舉一個例子,如下圖所示,從深度卷積得到的3個單通道特征圖,經過4個大小為1x1x3卷積核的卷積計算,輸出4個特征圖,而輸出特征圖的個數取決于 Filter 的個數。因此,卷積層的參數量為:
2.3.4 深度可分離卷積
深度可分離卷積(Depthwise separable convolution)由逐深度卷積和逐點卷積組成,深度卷積用于提取空間特征,逐點卷積用于提取通道特征。深度可分離卷積在特征維度上分組卷積,對每個 channel 進行獨立的逐深度卷積(depthwise convolution),并在輸出前使用一個1x1卷積(pointwise convolution)將所有通道進行聚合。
2.3.5 卷積神經網絡的組成
當然,可以對卷積神經網絡(CNN)的組成進行更詳細的介紹。以下是基于上述五個關鍵組件的進一步擴展和說明:
2.3.5.1 卷積層(Convolutional Layer)
多通道輸入:在處理彩色圖像時,每個像素有三個通道(紅、綠、藍),即三維輸入數據。卷積核也相應地是三維的,以匹配輸入數據的深度。
多濾波器:通常一個卷積層包含多個不同的濾波器,它們共同工作來捕捉輸入數據的不同特征。每一個濾波器都會生成一個稱為“特征圖”或“激活圖”的輸出。
共享權重:所有位置使用相同的卷積核參數,這不僅減少了模型參數的數量,還使得模型能夠學習到平移不變的特征。
2.3.5.2 激活層(Activation Layer)
(1)Leaky ReLU
Leaky ReLU(泄漏修正線性單元)是ReLU(修正線性單元)的變種,旨在解決標準ReLU函數在負值區域輸出為零的問題,即所謂的“死神經元”問題。對于輸入x小于0的情況,Leaky ReLU會給出一個小的非零梯度,這有助于訓練過程中的梯度傳播,特別是在網絡較深時。公式:
其中 α 是一個很小的正數,通常是0.01,用于控制負區間的斜率。
優點:
緩解死區問題:與傳統的ReLU不同,Leaky ReLU對于所有輸入都有非零梯度,這意味著它可以在一定程度上避免神經元“死亡”的情況。
加速收斂:由于在所有區域都有梯度,Leaky ReLU可以加速某些類型模型的訓練過程。
保留稀疏激活:與ReLU類似,Leaky ReLU仍然能夠促進稀疏激活,這對模型的學習是有利的。
缺點:
性能提升有限:盡管Leaky ReLU解決了ReLU的一些問題,但在實踐中,它的表現并不總是優于其他改進版本的ReLU函數,如PReLU或ELU。
超參數選擇: α 的選擇可能需要一些試驗和錯誤來找到最適合特定任務的值。不合適的 可能會導致不良的訓練動態。
總的來說,Leaky ReLU是一個簡單而有效的激活函數,它可以改善某些情況下傳統ReLU的局限性。然而,在選擇激活函數時,應該根據具體的應用場景和實驗結果來決定最合適的選項。
(2)Parametric ReLU
Parametric ReLU(PReLU),即參數化的修正線性單元,是Leaky ReLU的一種擴展。與Leaky ReLU相比,PReLU允許負輸入的斜率 α 是一個可學習的參數,這意味著它可以在訓練過程中根據數據自動調整。這種靈活性使得PReLU能夠更好地適應不同任務的需求。公式:
其中 是針對每個神經元或共享給所有神經元的學習參數,用于控制負區間的斜率。優點
自適應學習: α 參數可以被優化算法自動調整,因此PReLU可以更靈活地適應不同的數據分布。
緩解死區問題:如同Leaky ReLU一樣,PReLU也避免了傳統ReLU中“死神經元”的問題,因為對于任何輸入都有非零梯度。
可能更好的表現:在某些情況下,PReLU可以比標準ReLU和Leaky ReLU提供更好的性能,因為它可以根據具體任務來調整激活函數的形狀。
保留稀疏激活:類似于其他ReLU變體,PReLU仍然能夠在正輸入區域促進稀疏激活,這對模型的學習是有利的。
缺點
增加模型復雜度:由于引入了額外的可學習參數 α,這增加了模型的復雜性和需要優化的參數數量。
潛在過擬合風險:更多的可學習參數意味著模型有更大的能力去記憶訓練數據,從而可能導致過擬合,特別是在小規模數據集上。
訓練時間延長:因為需要額外的時間來學習 α 參數,這可能會導致訓練過程稍微變慢。
(3)Softmax
Softmax函數是一種常用于多分類問題中的激活函數,它將一個含任意實數的K維向量。z 轉換為另一個同樣長度為K的概率分布向量 σ(z),每個元素都在0和1之間,并且所有元素之和等于1。這使得Softmax非常適合用作分類任務中最后的輸出層,以生成各個類別的概率估計。
優點
產生概率分布:Softmax可以將模型的原始輸出轉換成一個合理的概率分布,這對于解釋性和決策制定非常有用。
支持多分類:與二元分類問題不同,Softmax自然地擴展到了多分類場景,適用于需要區分多個類別的任務。
計算簡單:其形式相對簡單,易于實現,并且在現代深度學習框架中都有高效的實現。
結合交叉熵損失函數:當與交叉熵損失一起使用時,Softmax能提供一個平滑、可微分的目標函數,有利于梯度下降優化過程。
缺點
梯度消失:對于遠離正確答案的預測,Softmax加上交叉熵損失可能會導致非常小的梯度,從而影響訓練速度,特別是在深層網絡中。
對異常值敏感:由于采用了指數運算,Softmax對異常大的輸入值非常敏感,這些異常值可能導致不理想的模型性能。
2.3.5.3 池化層(Pooling Layer)
重疊池化(Overlapping Pooling):池化窗口之間有一定的重疊,能增加一些不變性,同時不會顯著增加計算量。
全局池化(Global Pooling):對整個特征圖應用池化操作,而不是局部區域。它可以在一定程度上替代全連接層,并減少過擬合。
2.3.5.4 批歸一化層(Batch Normalization Layer)
訓練與推理:在訓練階段,批歸一化使用每一批次的數據來估計均值和方差;而在推理階段,則使用運行時統計(通常是移動平均)。
γ和β參數:除了標準化外,批歸一化還引入了兩個可學習參數γ(縮放)和β(偏移),使網絡能夠在需要時恢復原始的激活尺度和位置。
2.3.5.5 全連接層(Fully Connected Layer, FC Layer)
Dropout技術:為了防止過擬合,在全連接層中經常采用dropout方法,隨機丟棄一部分神經元,強迫網絡學習更加魯棒的特征表示。
稀疏連接:作為全連接層的一種替代方案,某些架構嘗試使用稀疏連接來減少參數數量并提高效率,比如通過只連接特定模式下的神經元。
動態架構調整:現代的一些研究探索了動態改變網絡結構的可能性,例如根據輸入樣本的復雜度自動調整FC層的大小或配置。
這些組件的組合和優化構成了卷積神經網絡的核心,并且隨著計算機視覺領域的發展,新的技術和理論不斷被提出,以進一步提升CNN的性能和泛化能力。例如,殘差網絡(ResNet)、密集連接網絡(DenseNet)等創新設計都是為了克服深層網絡訓練中的挑戰而提出的。
3 邊緣端設備部署
在邊緣端設備部署目標檢測模型,特別是像PP-PicoDet這樣輕量級且高效的模型,涉及到多個步驟和技術考量。
以下是一些關鍵點和建議,可以幫助你在資源受限的環境中成功部署這樣的模型:
3.1 準備工作
在進行模型的部署之前,我們首先需要確認自己手上的模塊的支持哪些算子、支持什么類型的量化(int4/int8/fp16/混合精度)、內存大小等參數,對于手上的板子有一個全面的了解。在進行部署時,我們常常將訓練的模型轉化成onnx中間文件,再根據硬件設備要求的轉化成硬件要求的模型文件。在本次實驗中,我使用的模塊是凌智視覺模塊(Lockzhiner Vision Module) ,這個模塊是福州市凌睿智捷電子有限公司聯合百度飛槳傾力打造的一款高集成度人工智能視覺模塊,專為邊緣端人工智能和機器視覺應用而設計,模塊的參數如下圖所示。
這個模塊有著一個很吸引人的特點與飛槳低代碼開發工具 PaddleX 完美適配,配合飛槳星河社區 Al Studio, 可以實現一鍵訓練;配合凌智視覺算法部署庫,用戶可以實現一鍵部署,減少我們在模型部署時遇到的疑難雜癥。如果遇到問題,可以去廠家開源倉庫提交問題。凌智視覺模塊Gitee鏈接
3.2 模型轉換
在 百度飛槳的 AiStudio 中,搜索【硬件部署】在凌智視覺模塊上部署 PaddleDetection 模型如果說有自己制作數據的話,需要將數據上傳,然后在修改全局配置項,修改數據集地址以及對應的類別數。
按照廠家提供的配置直接進行訓練轉換。
訓練完成后,會自動生成一個rknn模型文件,
3.3 部署結果
模型的推理結果如下圖所示
-
AI
+關注
關注
87文章
30728瀏覽量
268886 -
人工智能
+關注
關注
1791文章
47183瀏覽量
238245 -
目標檢測
+關注
關注
0文章
209瀏覽量
15605
發布評論請先 登錄
相關推薦
評論