AI 賦能 | 智能制造的 AI 算法開發和工程實現

談到智能制造、智慧工廠,愿景是美好的,借助計算機視覺技術和 AI 算法,為自動化生產線賦予環境感知的能力,從而改善工藝流程,提高生產效率。但是,隨著柔性化生產的需求增長,產線的布局調整和功能擴展在所難免,這就要求設備供應商或使用者能夠對 AI 算法進行持續性的維護、優化或移植,而現實是維護成本高、團隊能力缺乏。

MATLAB 就像一位全能的搭檔,提供了完備的文檔和友好的交互式應用程序,即使是沒有數據科學背景的領域工程師,也可以在一步步引導,快速完成“數據準備-AI?算法開發-系統部署”整個工作流程。

圖片

紙上得來終覺淺,讓我們來具體看看,以上工作流在一個典型的工業應用場景——零件表面缺陷檢測——中是如何實現的。

圖片

????◆??

數據準備

攝像頭采集的原始圖像數據中,往往含有大量冗余信息。前處理的第一步,通常是將被檢測的目標對象和背景(其他無關物體)分離開來,即提取感興趣區域(Region Of Interest, ROI)。在這里,可以運用一個小技巧:選擇一個與目標顏色對比差異足夠大的背景,采用簡單的圖像處理方法,例如顏色空間變換、二值化處理等,就可以快速提取出目標,而不需要使用計算更復雜的 YOLO 等目標檢測深度神經網絡。

具體步驟如下:

1.將采集的單幀彩色 RGB 圖像轉換為更有利于進行圖像分割的 HSV 顏色模型;

img1 = snapshot(webcam);

hsv1 = rgb2hsv(img1);

2.通過大津算法確定閾值,對圖像進行二值化分割;

th = otsuthresh(imhist(hsv1(:,:,2)));

bw = hsv1(:,:,2) > th;

bw = bwareaopen(~bw,50);

3.分析區域特性,可確定邊界框,再對原圖進行相應的裁剪;

stats = regionprops('table',bw,'BoundingBox');

bbox = int16(stats.BoundingBox);

img2 = imcrop(img1,bbox);

4.最后進行灰度化處理。

img3 = rgb2gray(img2);

圖片

經過以上步驟,單幀圖像的數據量從 207x174x3 降低至 110x100,數據維度的降低,可減輕后續分類算法的需要完成的計算量,從而提高推斷速度。

如果您的實際應用場景較為復雜,可考慮加強對外部環境的控制,例如光照條件、攝像頭角度等,此外,在前處理的過程中,結合更多圖像處理和計算機視覺技術,例如相機校準、圖像增強和降噪等方法,以獲得更高質量的樣本數據。

采集足夠多的樣本后,通過對帶有真值標注的數據進行監督式機器學習,是常用的構建預測模型進行分類的方法。使用 MATLAB 中的數據存儲對象 imageDatastore,可以方便快速地對硬盤中的數據進行索引,并定義數據標簽來源:

categ = {'good', 'defective'};

imds =imageDatastore(fullfile(pwd,?'images', categ), ...

??? 'IncludeSubfolders',1,'LabelSource',?'foldernames')

我們準備了一個樣本大小為 784 的數據集,標簽為缺陷檢測結果,其中 509 個“有缺陷”(Defective)樣本,273 個“無缺陷”(Good)樣本,隨機選取 90% 樣本作為訓練集,剩余 10% 作為驗證集:

[trainingSet,validationSet] = splitEachLabel(imds, 0.9,?'randomize');

在數據不夠多、類別不均衡的情況下,借助數據增強的方法,對圖像進行不同程度的平移、旋轉和縮放等,可一定程度上提高機器學習模型的泛化能力。

augmenter =imageDataAugmenter('RandXReflection',true, ...

????'RandYReflection',true,'RandRotation', [-180180]);

trainingSet =augmentedImageSource([227 227],trainingSet, ...

????'DataAugmentation',augmenter);

????◆??

AI 算法開發

AI 應用領域目前主流的方法有兩大分支:一是基于統計的傳統機器學習方法,例如支持向量機、隨機森林等,其中需要人為定義數據的特征作為輸入;二是基于人工神經網絡的深度學習方法,可以直接從數據中學習特征后進行推斷。接下來,我們將探討兩種方式各自的可行性和優缺點:1. 基于特征工程和支持向量機的缺陷檢測;2. 基于深度神經網絡的缺陷檢測。

方案 1. 基于特征工程和支持向量機的缺陷檢測

特征工程,是機器學習中一個非常重要的環節,對模型推斷的準確度影響很大。我們嘗試使用 Bag of Features 方法,從圖像數據中提取特征,并轉換為機器學習算法可以處理的形式——特征向量。

bag =bagOfFeatures(trainingSet);

在 Bag of Features 中,將對每張圖片,先用 SURF(加速穩健特征)算法提取局部特征,再通過 K-均值聚類將相似特征合并,聚類中心構成大小為 500 的視覺詞匯字典。

每張圖片可以對應表示為各個視覺詞匯的組合,即特征向量,用于描述各個視覺詞匯出現的頻率。如以下直方圖所示,不同樣本的特征向量有所差別。

圖片

您可以通過 encode 函數,將每張圖片對應轉換為對應的特征向量后,作為機器學習模型的輸入進行訓練:

featureVector =encode(bag, img);

也可以通過 trainImageCategoryClassifier 函數,直接接收訓練集和 bag 對象,快速訓練一個支持向量機(SVM)分類器:

categoryClassifier= trainImageCategoryClassifier(trainingSet,bag);

分類器對訓練集的預測準確度為 82%,測試集為 75%,通常進行超參數調優,可在一定程度上提高推斷準確度,然而受限于人為的特征選擇,傳統機器學習方法的優化空間比較有限。如何能夠降低難度并進一步提高分類準確度呢?我們來看下一個方案。

方案 2. 基于深度神經網絡的缺陷檢測

相較于方案1,深度神經網絡訓練和推斷對計算資源的要求更高,但是往往準確度也更高。卷積神經網絡(CNN)是一種適用于視覺任務的深度神經網絡架構,如下圖所示,從左到右,依次是輸入層、特征學習相關層(卷積層,ReLU 激活層和池化層)和分類輸出層。

圖片

MATLAB 深度學習工具箱提供了基礎網絡層庫,您可以使用交互式應用程序 Deep Network Designer 從零起步創建網絡,并進行圖像分類網絡的訓練。目前有大量優秀的預訓練網絡,可供開發者直接使用,您只需要按照實際的任務對網絡的輸出進行微調后再訓練,就能以較低的數據和計算成本,得到一個功能強大的深度學習模型,這種方法稱為“遷移學習”。

我們選用 SqueezeNet 進行遷移學習,保留其中特征學習的部分,加入輸出大小為 2 的全連接層,并替換最后的 Softmax 和分類層,使其適用于當前的二分類缺陷檢測任務。

圖片

接下來,選擇數據源為之前設定的訓練集 trainingSet 和驗證集 validationSet,可加入數據增強方法,然后,設置學習率、優化器等訓練參數:

圖片

啟動訓練,并查看以下圖窗中的曲線了解訓練進度和效果:

圖片

訓練完成后,可以看到驗證準確度達到 97.44%,效果相對于方案1大幅提升,您可以在此基礎上,嘗試繼續迭代優化,或直接導出至工作空間用于推斷。以上操作流程可直接導出為 MATLAB 代碼,當需要擴展數據集或更換數據時,用于自動化訓練過程和模型更新。

后處理與神經網絡驗證

深度神經網絡是一個黑盒模型,使用訓練好的模型對新圖像進行分類,可直接輸出對應的標簽,但是怎樣解釋預測結果,神經網絡的推斷是否有合理依據,卻難以評估,此外,簡單分類也無法反映缺陷的位置和形狀。為了解答這些疑問,我們可以使用類激活映射(Class Activation Mapping, CAM)的方法,提供一些用于評估網絡的可視化依據。

之前提到,卷積核會對特定的特征產生不同程度的激活,下圖中,每一個黑白相間的像素組代表一個卷積核對輸入圖像產生的激活,白色像素表示強正激活,黑色表示負激活。預測結果(類別)和最后一個卷積層的激活程度,存在一定的映射關系,全連接層的權重值?[w1?w2?… w1000]T?代表各個激活對預測結果的貢獻大小,加權計算以后得到的值稱為類激活映射,將其以熱圖(heatmap)的形式,疊加在原圖像上,如下:

圖片

上圖中,高亮處代表神經網絡將樣本判定為“有缺陷“類別的主要特征,這與實際的缺陷位置基本吻合,我們可以判斷神經網絡預測依據合理。

????◆??

系統部署?

算法開發完成后,最終需要部署到生產環境才能發揮作用。MATLAB 提供了完整的工具鏈,支持一次開發,多平臺部署,您可以將深度神經網絡,連同前后處理函數和其他應用邏輯,自動生成產品級代碼,運行在嵌入式設備中,或者作為應用程序,運行在桌面、網頁或者云端。

在代碼生成方面,MATLAB Coder 支持基于 MKL-DNN 和 ARM Compute Library 的神經網絡 C/C++ 代碼生成,而 GPU Coder 則支持基于 NVIDIA GPU 的 CUDA 代碼生成。

接下來,讓我們來看看如何在真實場景下測試以上算法。

借助硬件支持包 GPU Coder Support Package for NVIDIA GPUs,可以快速將方案 2 部署在 Jetson Nano 的開發板中,步驟如下:

1. 連接硬件:

hwobj = jetson('hostname','username','password');

2. 設置代碼生成相關參數,例如生成可執行文件,使用 cuDNN 庫等:

cfg =coder.gpuConfig('exe');

cfg.DeepLearningConfig= coder.DeepLearningConfig('cudnn');

cfg.DeepLearningConfig.DataType=?'fp32';

cfg.Hardware =coder.hardware('NVIDIA Jetson');

cfg.Hardware.BuildDir=?'~/';

3. 自動生成代碼:

codegen?-config cfg targetFunction -args {ones(240, 320, 3,'uint8'), coder.Constant(Weights),coder.Constant(true)} -report

下圖為在 NVIDIA Jetson Nano 開發板上,調用 Webcam,對測試樣本進行缺陷檢測的效果示意,在使用 cuDNN 庫,采用 32 位浮點計算的情況下,同時處理兩個樣本幀率大約為 4.3 FPS,單樣本約為 8 FPS。

圖片

在以上模型的基礎上,通過生成基于 TensorRT 的 fp16 代碼,或采用 Xavier 等處理能力更強的硬件,可進一步加快推斷速度。此外,您也可考慮使用其他神經網絡架構。在 MATLAB 附加功能資源管理器中搜索”Deep Learning for Defect Detection on Raspberry Pi”,可以獲取基于樹莓派的代碼部署版本。

????◆??

總結

概括來說,在 MATLAB 中,您可以:

  • 通過圖像處理技術減少原始圖像數據中的冗余信息

  • 利用深度學習直接學習特征,實現端到端的缺陷檢測

  • 借助應用程序和自動代碼生成工具提高 AI 算法開發和部署效率

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209639.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鎖的策略及synchronized詳解

加鎖過程中,處理沖突的過程中,涉及到的一些不同的處理方式。鎖的策略決定了線程如何獲取和釋放鎖以及在何種情況下阻塞和喚醒線程。 1. 常見的鎖策略 1.1 樂觀鎖和悲觀鎖 樂觀鎖:在加鎖之前,預估當前出現鎖沖突的概率不大&am…

Docker三 | 數據卷

目錄 Docker數據卷簡介 添加數據卷的命令 容器數據卷的繼承 Docker數據卷簡介 Docker容器產生的數據,如果不備份,當容器實例刪除后,容器中的數據也會消失,為了保存數據可以在Docker中使用數據卷。Docker數據卷是宿主機的一個可以…

vue3中子組件調用父組件的方法

<script lang"ts" setup>前提 父組件&#xff1a; 子組件&#xff1a; const emit defineEmits([closeson]) 在子組件的方法中使用&#xff1a; emit(closeson)

EP15:動態內存管理概述(c語言)malloc,calloc,realloc函數的介紹使用及柔性數組的介紹

如果學習方向是c方向那么c語言有三個板塊的知識是非常重要的. 1:指針 2:結構體 3;動態內存管理. 序言:在c語言中,什么是動態內存 C語言中的動態內存是指在程序運行時&#xff0c;根據需要動態地分配內存空間的一種內存管理方式。與靜態內存相比&#xff0c;動態內存的大小和生…

12.ROS導航模塊:gmapping、AMCL、map_server、move_base案例

目錄 1 導航概述 2 導航簡介 2.1 導航模塊簡介 1.全局地圖 2.自身定位 3.路徑規劃 4.運動控制 5.環境感知 2.2 導航坐標系odom、map 1.簡介 2.特點 3.坐標系變換 2.3 導航條件說明 1.硬件 2.軟件 3 導航實現 3.1 創建本篇博客的功能包 3.2 建圖--gmapping 3.…

JavaScript基礎知識整理(最全知識點, 精簡版,0基礎版)

文章目錄 一、輸入和輸出內容 1.1 輸出 1.1.1 在瀏覽器的控制臺輸出打印 1.1.2 直接在瀏覽器的頁面上輸出內容 1.1.3 頁面彈出警告對話框 1.2 輸入 二、變量 2.1 變量是什么 2.2 變量的聲明和賦值 2.3 變量的命名規范和規范 三、變量擴展&#xff08;數組&#xff09; 3.1 數組…

Cypress:前端自動化測試的終極利器

引言&#xff1a; 在現代軟件開發中&#xff0c;前端自動化測試已經成為了一個不可或缺的環節。它不僅可以提高開發效率&#xff0c;減少手動測試的工作量&#xff0c;還可以保證軟件的穩定性和質量。而在眾多的前端自動化測試工具中&#xff0c;Cypress無疑是其中的佼佼者。本…

openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷

文章目錄 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷144.1 背景信息144.2 前提條件 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷 144.1 背景信息 在SQL語句執行性能不符合預期時&#xff0c;可以查看SQL語句執行信息&#xff0c;便…

文章解讀與仿真程序復現思路——中國電機工程學報EI\CSCD\北大核心《考慮垃圾處理與調峰需求的可持續化城市多能源系統規劃》

這個標題涵蓋了城市多能源系統規劃中的兩個重要方面&#xff1a;垃圾處理和調峰需求&#xff0c;并強調了規劃的可持續性。 考慮垃圾處理&#xff1a; 含義&#xff1a; 垃圾處理指的是城市廢棄物的管理和處置。這可能涉及到廢物分類、回收利用、焚燒或填埋等方法。重要性&…

GIS入門,Leaflet介紹,Leaflet可以做什么,網頁中如何使用Leaflet地圖,vue中如何使用Leaflet地圖

VueLeafLet教程推薦&#xff1a;《VueLeaflet入門》 Leaflet介紹 Leaflet是一個開源的JavaScript庫&#xff0c;用于創建交互式的地圖和地圖應用。Leaflet框架具有輕量級、靈活性強、易于使用和擴展等特點&#xff0c;支持各種地圖服務商&#xff08;如OpenStreetMap、Google…

前端知識筆記(三十八)———HTTPS:保護網絡通信安全的關鍵

當談到網絡通信和數據傳輸時&#xff0c;安全性是一個至關重要的問題。在互聯網上&#xff0c;有許多敏感信息需要通過網絡進行傳輸&#xff0c;例如個人身份信息、銀行賬戶信息和商業機密等。為了保護這些信息不被未經授權的人訪問和篡改&#xff0c;HTTPS&#xff08;超文本傳…

【開源】基于Vue+SpringBoot的河南軟件客服系統

文末獲取源碼&#xff0c;項目編號&#xff1a; S 067 。 \color{red}{文末獲取源碼&#xff0c;項目編號&#xff1a;S067。} 文末獲取源碼&#xff0c;項目編號&#xff1a;S067。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統管理人員2.2 業務操作人員 三、…

搞懂內存函數

引言 本文介紹memcpy的使用和模擬實現、memmove的使用和模擬實現、memcmp使用、memset使用 ? 豬巴戒&#xff1a;個人主頁? 所屬專欄&#xff1a;《C語言進階》 &#x1f388;跟著豬巴戒&#xff0c;一起學習C語言&#x1f388; 目錄 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK實戰2

上一篇文章介紹了HOOK常規的應用場景&#xff0c;這篇我們講一下HOOK其他原生函數。又是一個新的其他思路 很多時候&#xff0c;當我們想要某些網站的請求參數的時候&#xff0c;因為某些加密導致了獲取起來很復雜。 這時候hook就十分方便了 源代碼 var _JSON_Parse JSON.…

scp 指令詳細介紹

目錄 1. 基本語法 2. 例子 從本地到遠程 從遠程到本地 從遠程到遠程 使用端口和指定私鑰 遞歸復制目錄 3. 注意事項 如何拷貝文件的軟鏈接 SCP&#xff08;Secure Copy Protocol&#xff09;是一種用于在計算機之間安全地傳輸文件的協議。它通過加密的方式在網絡上安全…

Vue:Vue的開發者工具不顯示Vue實例中的data數據

一、情況描述 代碼&#xff1a; 頁面&#xff1a; 可以看到&#xff0c;input獲取到了data數據&#xff0c;但是&#xff0c;vue-devtool沒有獲取到data數據 二、解決辦法 解決辦法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解決辦法2&…

C語言 編程題

C語言學習&#xff01; 1.小明上課需要走n階臺階&#xff0c;他每次可以選擇走一階或者走兩階&#xff0c;他一共有多少種走法&#xff1f; 輸入描述&#xff1a;輸入包含一個整數n&#xff08;1 ≤ n ≤30&#xff09; 輸出描述&#xff1a;輸出一個整數&#xff0c;即小明可…

LeetCode 1457. 二叉樹中的偽回文路徑||位運算 DFS

1457. 二叉樹中的偽回文路徑 給你一棵二叉樹&#xff0c;每個節點的值為 1 到 9 。我們稱二叉樹中的一條路徑是 「偽回文」的&#xff0c;當它滿足&#xff1a;路徑經過的所有節點值的排列中&#xff0c;存在一個回文序列。 請你返回從根到葉子節點的所有路徑中 偽回文 路徑的…

Golang優雅實現按比例切分流量

我們在進行灰度發布時&#xff0c;往往需要轉發一部分流量到新上線的服務上&#xff0c;進行小規模的驗證&#xff0c;隨著功能的不斷完善&#xff0c;我們也會逐漸增加轉發的流量&#xff0c;這就需要按比例去切分流量&#xff0c;那么如何實現流量切分呢&#xff1f; 我們很容…

力扣(LeetCode)-1. 兩數之和

給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…