其中,推理一張圖片,那麼就在–source中的default寫上圖片路徑,也可以如圖寫上整個圖片文件夾,這樣會檢測所有圖片。也可以寫上視頻地址和視頻文件夾,檢測所有視頻,存放於inference
的out中。改成0
就是實時檢測了~默認電腦攝像頭,當然也可以改成手機。這個也很簡單,需要的可以私聊我。運行代碼你將看到實時檢測於您電腦內置攝像頭中,這樣可能會有些卡頓,如果您使用我下文使用的2085模組,將有另一番全新體驗。
3.1 高手也愛的黑科技:無損的半精度模型
上面,我們介紹了以yolov5 吸菸檢測為例的目標檢測,接下來我們在此基礎上提升,說說高手們也想要的黑科技。
1:混合精度模型,半精度模型如何可以以降低顯存卻可以保持精度呢?
裝好apex後在代碼中添加,在optimizer中amp初始化一下
優化反向傳播。組裝到cuda訓練
實現半精度,其他資料詳見博客,還有一些細節沒公布。
3.2 高手也愛的黑科技:為何使用預訓練模型
使用預訓練模型,官方已經給出了,那麼你知道為什麼要使用預訓練模型嗎?
作者已盡其所能設計了基準模型。我們可以在自己的數據集上使用預訓練模型,而不是從頭構建模型來解決類似的自然語言處理問題。
儘管仍然需要進行一些微調,但它已經為我們節省了大量的時間:通常是每個損失下降更快和計算資源節省。
加快梯度下降的收斂速度
更有可能獲得一個低模型誤差,或者低泛化誤差的模型
降低因未初始化或初始化不當導致的梯度消失或者梯度爆炸問題。此情況會導致模型訓練速度變慢,崩潰,直至失敗。
其中隨機初始化,可以打破對稱性,從而保證不同的隱藏單元可以學習到不同的東西
3.3 高手也愛的黑科技:訓練被迫中斷怎麼辦,『遷移學習』幫你搞定?
我在代碼中添加了--resume參數,當你在訓練中被迫中斷了,可以使用這個參數,在你訓練中保存的last.pt
上進行遷移學習。這時候,你將在代碼中看到細節,用法就是加上--resume
然後不使用官方的預訓練模型即可,你將看到接著上次的loss訓練,就成功了。
3.3 高手也愛的黑科技:數據增強
人工智慧,或者說計算機視覺的一個最終目標在於構建一個真正可適用於真實世界複雜環境的系統。而就目前所應用的機器學習系統而言,大部分採用了有監督的學習方法,也必然導致了需要廣泛收集圖像樣本,並進行對應的圖像標註的工作。而人力時有窮盡,高質量的樣本集圖片又是構建一個優秀的機器學習系統的關鍵因素。使用適當的數據增強方法可以將數據集的數量增大十倍以上,從而極大化利用小樣本集中的每個樣本,使之也可以訓練得到一個較好的機器學習模型。數據增強方法也可以提高模型的魯棒性,防止其易在訓練中出現過擬合的現象。
常用的數據增強方法主要來自數字圖像處理中的幾何變換,但不改變圖像中的像素值,而是改變了其空間位置,藉此希望卷積神經網絡學習到圖像中更多的不變性特徵,也有利於提高其泛化性能。
以下將對各種方法做簡單的列舉與說明。
平移(Shift)變換:對原始圖片在圖像平面內以某種方式(預先定義或者隨機方式確定平移的步長、範圍及其方向)進行平移。
翻轉(Flip)變換:沿豎直或者水平方向對原始圖片進行翻轉。
隨機裁剪(Random Crop):隨機定義感興趣區域以裁剪圖像,相當於增加隨機擾動。
噪聲擾動(Noise):對圖像隨機添加高斯噪聲或者椒鹽噪聲等。
對比度變換(Contrast):改變圖像對比度,相當於在HSV空間中,保持色調分量H不變,而改變亮度分量V和飽和度S,用於模擬現實環境的光照變化。
縮放變換(Zoom):以設定的比例縮小或者放大圖像。
尺度變換(Scale):與縮放變換有點類似,不過尺度變換的對象是圖像內容而非圖像本身(可以參考SIFT特徵提取方法),構建圖像金字塔以得到不同大小、模糊程度的圖像。
3.3 高手也愛的黑科技:BN
批規範化(Batch normalization)
當訓練一個深度神經網絡時,由於各層參數不斷變化,所以各層輸入的概率分布也在不斷的變化,也導致了非線性激活函數(如sigmoid等)正負兩邊都會飽和,使得訓練迭代的過程變得極其緩慢甚至無法進行。這時候,通常需要採用較小的學習率以及精細進行權重初始化。loffe等將這種現象稱為「內部協方差偏移」(internal
covariate shift),並提出了批規範化(Batch normalization,BN)解決此類問題。
該論文中提出在每次隨機梯度下降迭代時,在最小批量樣本(mini-batch)內做規範化操作,使得輸出結果各個維度的均值為0,方差為1,有效地避免了非線性激活函數的飽和問題(以sigmoid為例,觀察sigmoid函數即可知,該函數輸入集中在0附近時,其輸出梯度較大);同時也讓梯度變化受參數及其初值的影響減小。
批標準化: 一般用在非線性映射(激活函數)之前,對 x=Wu+b做規範化,使結果(輸出信號各個維度)的均值為0,方差為1 。讓每一層的輸入有一個穩定的分布會有利於網絡的訓練。
BN算法在網絡中的應用
傳統的神經網絡,只是在將樣本x輸入輸入層之前對x進行標準化處理(減均值,除標準差),以降低樣本間的差異性。BN是在此基礎上,不僅僅只對輸入層的輸入數據x進行標準化,還對每個隱藏層的輸入進行標準化。
四 模型優化
前面我們說了訓練的優化,接下來我將介紹基於Openvino的推理優化,拿好小本本了嗎?
4.1 Openvino 介紹 可以參見這篇博客
OpenVINO是英特爾基於自身現有的硬體平臺開發的一種可以加快高性能計算機視覺和深度學習視覺應用開發速度工具套件,支持各種英特爾平臺的硬體加速器上進行深度學習,並且允許直接異構執行。支持在Windows與Linux系統,Python/C++語言。優化工具包
OpenVINO
讓不懂電腦視覺和深度學習原理的小白可以在很短的時間上手,不必擔心如何建置開發平臺、選擇深度學習框架、訓練及優化模型和硬體加速等問題,只需利用預先訓練及優化過的語義分割模型,很快就可以做出一組看起來很專業的自駕車視覺分析系統。
主要特點:
1:在Intel平臺上提升計算機視覺相關深度學習性能達19倍以上
2:解除CNN-based的網絡在邊緣設備的性能瓶頸
3:對OpenCV,OpenXV*視覺庫的傳統API實現加速與優化
4:基於通用API接口在CPU、GPU、FPGA等設備上運行加上
OpenVINO 有2個大模塊,第一個是 OR 他是用於把深度學習訓練好的模型轉換成engine可識別的文件(xml和bin) ,另一個是inference engine 是OpenVINO具體實施單元,利用一個智能引擎完成相應的應用 。
一般流程:
1:根據自己的訓練模型需要配置Mode Optimizer.
2: 根據設置的模型參數運行Model Optimizer,生成相對應的IR(主要是xml和bin)
xml-主要用來描述網絡拓撲結構
bin-包括生成的weights and biases 二進位數據
3: 在實際應用場景種使用Inference Engine測試生成的IR
4: 在應用程式種調用Inference Engine相應接口,將生成的模型IR部署到實際環境中。
Model Optimizer
Model Optimizer 是一個跨平臺命令行工具,用於促進訓練與具體實施平臺中的過渡,主要是進行靜態模型分析 以及根據配置參照自動調整深度模型
Model Optimizer 被用來設計成支持常用的框架(Caffe, TensofFlow, MXNet, Kaldi, ONNX等),相當於封裝了一層,便於進行開發。
Model Optimizer主要工作流程:
1:根據需要所用到的框架,配置Model Optimizer
2: 提供訓練模型作為輸入,包括網絡拓撲以及參數
3:運行Model Optimizer(根據選擇的網絡拓撲進行訓練)
4:IR作為Model Optimizer輸出
Inference Engine:
Inference Engine是主要運行單元,並提供相應API
將IR作為輸入
在目標硬體優化執行
提供嵌入式平臺最佳執行性能方案