隨著自動化程度的提高,工業(yè)成像和機(jī)器視覺應(yīng)用在工業(yè)控制中變得越來越普遍,以支持提高生產(chǎn)率的動力。為了實現(xiàn)提高效率的承諾,圖像處理系統(tǒng)需要高速運行,以確保節(jié)拍時間,即每個新單元開始生產(chǎn)之間的平均時間,盡可能短。
同時,市場上出現(xiàn)了高分辨率相機(jī),能夠進(jìn)行高清晰度記錄,并且可以支持生產(chǎn)線上組件的極細(xì)細(xì)節(jié)成像。由于使用千兆以太網(wǎng),它們能夠高速傳輸這些高質(zhì)量圖像。因此,圖像處理軟件的高性能至關(guān)重要。
這表明在硬件中實現(xiàn)關(guān)鍵算法,但工業(yè)圖像處理的靈活性至關(guān)重要。不同類型的組件和組件需要特別關(guān)注某些視覺特征。組裝后對PCB的檢查通常是檢測焊道中的斷裂和擠壓,指示可能的故障源。檢查發(fā)動機(jī)歧管可能會尋找未對準(zhǔn)或缺失的緊固件。雖然這些任務(wù)可能使用通用模塊,例如邊緣檢測和模式匹配來識別感興趣的區(qū)域,但每個模塊都需要自己的一組圖像處理程序來執(zhí)行完整的檢查任務(wù)。
靈活性將變得更加重要當(dāng)調(diào)用圖像處理子系統(tǒng)來協(xié)助設(shè)置自動化時。圖像處理不僅對于檢查而言是必要的,而且有助于定位機(jī)器人系統(tǒng)并對其進(jìn)行訓(xùn)練。傳統(tǒng)上機(jī)器人使用精心計算的運動輪廓進(jìn)行編程,而現(xiàn)在他們開始使用視野內(nèi)的攝像機(jī)和物體來對齊自己并確定需要拾取和處理的組件。要運行此類映像應(yīng)用程序,開發(fā)人員需要一個功能工具包,可以在平臺上輕松組裝,具有實時運行算法所需的性能。
可視化工具包,提供一組基本功能包括工業(yè)在內(nèi)的多種形式的圖像處理以O(shè)penCV庫的形式提供?,F(xiàn)在,開源OpenCV庫已經(jīng)成為許多領(lǐng)域中圖像處理的流行選擇,現(xiàn)在已達(dá)數(shù)百萬行代碼。到2016年,SourceForge存儲庫記錄了超過1300萬次的庫下載。
OpenCV涵蓋了圖像處理和機(jī)器視覺應(yīng)用所需的許多功能,從基本的像素級操作,如閾值處理到特征提取基于深度學(xué)習(xí)等機(jī)器學(xué)習(xí)技術(shù)進(jìn)行對象識別。它的功能可以從C/C ++,Java和Python等語言中獲得。
從C ++訪問,OpenCV使用“cv”命名空間中的類和函數(shù)提供服務(wù)。例如,要檢索存儲的圖像和顯示,開發(fā)人員首先通過基于cv:Mat類創(chuàng)建對象來創(chuàng)建合適的圖像數(shù)組。函數(shù)cv :: imread()用于賦值,將圖像數(shù)據(jù)插入到使用cv :: Mat聲明的數(shù)組中:
cv :: Mat圖像(height,width,pixel_type);
image = cv :: imread(“image.bmp”);
鏡像圖像的簡單操作可以通過聲明一個新的Mat對象來實現(xiàn) - 例如“鏡像” - 并發(fā)出命令cv :: flip(image,mirrored,1)。第三個位置使用的整數(shù)決定了圖像翻轉(zhuǎn)的軸。
Mat數(shù)組提供對圖像數(shù)據(jù)的低級別像素訪問,以支持掃描區(qū)域以查找屬性(例如最小值或最大值)的算法,并支持直接操作數(shù)據(jù)。但是該庫還實現(xiàn)了在機(jī)器視覺中有用的更高級過濾功能,例如邊緣檢測過濾器。例如,cv :: Sobel和cv :: Laplacian調(diào)用實現(xiàn)了對圖像的濾波器,該圖像通過將圖像數(shù)據(jù)與3×3或更大的矩陣進(jìn)行卷積來檢測像素亮度的突然變化。在源陣列上執(zhí)行過濾器會生成包含可能邊緣的數(shù)組。較大的內(nèi)核可用于抑制高頻噪聲并以更高的置信度產(chǎn)生實際邊緣。使用Canny算子等函數(shù)進(jìn)行閾值處理可以提高結(jié)果的整體質(zhì)量。
可以使用cv :: HoughLinesP等函數(shù)提取圖像中檢測到的行,并用于支持對其進(jìn)行操作的算法在源圖像中找到的形狀。這些可用于確定是否存在預(yù)期在圖像中的物體,例如發(fā)動機(jī)殼體上的緊固件。
雖然OpenCV是為計算效率而設(shè)計的,但是高分辨率的數(shù)據(jù)流量相機(jī)可以挑戰(zhàn)純軟件實現(xiàn),甚至是那些在高性能多核SoC上運行的軟件。 OpenCV不僅支持在通用處理器上實現(xiàn)其功能,還支持在圖形處理單元(GPU)甚至自定義硬件上實現(xiàn)其功能。保持基于軟件的控制的靈活性,同時利用硬件實現(xiàn)下可實現(xiàn)的性能的一種方法是采用可編程邏輯。 Xilinx Zynq-7000提供了一種在單個SoC中訪問多核CPU和可編程邏輯的便捷方式。
Zynq-7000平臺將一個或兩個ARM?Cortex?-A9處理器與靈活的硬件組合在一起。嵌入式現(xiàn)場可編程門陣列(FPGA)以及支持高速I/O的外設(shè)。 Zynq-7000器件支持兩種形式的FPGA架構(gòu):一種基于Xilinx Artix-7架構(gòu),另一種基于高性能Kintex-7架構(gòu)。所有這些都采用28 nm CMOS工藝實現(xiàn),具有高性價比的高邏輯和存儲密度。
除了基于查找表概念的靈活可編程邏輯外,Artix和Kintex架構(gòu)均提供數(shù)字信號處理(DSP)資源設(shè)計用于有效處理濾波器和卷積。使用片式架構(gòu),DSP資源可以調(diào)諧到器件,Kintex提供比Artix更高的DSP引擎與位級邏輯比。超過2000條互連線將處理器復(fù)合體連接到可編程結(jié)構(gòu),有助于支持在處理模塊之間傳輸圖像數(shù)據(jù)所需的高帶寬。
使用Zynq-7000平臺的設(shè)計人員可以使用高級別Vivado Design Suite中的綜合(HLS)技術(shù)將算法編譯成可編程硬件。傳統(tǒng)的FPGA開發(fā)是圍繞硬件描述語言(HDL)構(gòu)建的,例如Verily和VHDL。盡管這些HDL分別與C和Ada具有語法上的相似性,但它們的運行細(xì)節(jié)水平低于大多數(shù)軟件開發(fā)人員所熟悉的程度。 Verilog和VHDL基于位級操作和組合邏輯。 HLS技術(shù)提供了將用C ++等語言表達(dá)的算法轉(zhuǎn)換為硬件的能力。
HLS綜合利用面向?qū)ο蟮腃 ++基礎(chǔ),讓程序員識別并發(fā)機(jī)會,在代碼中進(jìn)行低級調(diào)度,為合成引擎提供如何從源代碼生成硬件的方向。例如,創(chuàng)建用于在FPGA架構(gòu)上部署的嵌套矩陣乘法運算的程序員可以識別可以在Vivado HLS實現(xiàn)工具中分配給硬件及其相關(guān)調(diào)度的每個循環(huán)的處理模塊。在圖1中,Row,Col和Product標(biāo)識符表示輸出塊。圖2顯示了Row塊及其包含的Col塊的擴(kuò)展,以及用于在塊之間移動數(shù)據(jù)的兩個區(qū)域??刂屏餮h(huán)顯示合成操作的延遲。
圖1:適用于FPGA實現(xiàn)的嵌套循環(huán)代碼。
圖2:在Vivado中查看的嵌套循環(huán)部分的控制流程圖。
為了提高性能,設(shè)計人員可以展開循環(huán)以允許更多功能并行發(fā)生(如果可用的DSP節(jié)點和查找表)硬件可用。對于圖像和視頻處理工作,Vivado環(huán)境包括許多提供直接支持的庫。
HLS成像庫包括與OpenCV imgproc模塊非常接近匹配的函數(shù)。例如,雖然軟件中的OpenCV將使用cv :: Mat聲明來創(chuàng)建在內(nèi)存中保存圖像所需的數(shù)組,但是有一個相應(yīng)的模板類,稱為hls :: Mat <>,它提供相同的核心功能。聲明一個名為image的數(shù)組的等效調(diào)用將顯示為:
hls :: Mat image();
而不是從磁盤讀取圖像,它通常使用hls :: stream <>數(shù)據(jù)類型將處理器復(fù)合體傳遞到FPGA架構(gòu)中。在處理器空間和FPGA中處理圖像之間存在關(guān)鍵差異。硬件結(jié)構(gòu)是在假設(shè)將存在以像素流形式通過邏輯元件的加速操作流水線的情況下編程的。因此,依賴于對圖像數(shù)據(jù)的隨機(jī)訪問的算法需要轉(zhuǎn)換為可以作用于線性流的形式。
流式訪問也意味著如果兩個硬件映射函數(shù)需要圖像,它需要重復(fù)。這通常使用hls :: Duplicate函數(shù)執(zhí)行。另一個不同之處在于浮點值的處理。 OpenCV本身支持浮點運算,但這在典型FPGA的DSP資源上通常效率低下。將所有數(shù)據(jù)類型轉(zhuǎn)換為定點等價物然后在將數(shù)據(jù)傳遞回軟件例程后使用縮放轉(zhuǎn)換以保持與核心OpenCV函數(shù)的兼容性是有意義的。
硬件對函數(shù)的適用性可能決定應(yīng)用程序或子系統(tǒng)的分區(qū)。 Zynq-7000平臺上與OpenCV兼容處理的參考設(shè)計之一是實現(xiàn)角點檢測和創(chuàng)建覆蓋圖,顯示圖像中的所有角落。其結(jié)構(gòu)如圖3所示。
圖3:快速應(yīng)用示例的數(shù)據(jù)流結(jié)構(gòu)。
與許多人一樣機(jī)器視覺應(yīng)用程序,實現(xiàn)采用管道的形式。第一個功能是灰度轉(zhuǎn)換,可以通過從RGB源提取綠色通道來近似。然后進(jìn)行角點檢測,然后使用模塊在圖像上繪制角點。
應(yīng)用程序在硬件使用方面的問題是在目標(biāo)圖像中繪制疊加層需要隨機(jī)訪問圖像陣列,這是面向流的硬件實現(xiàn)不容易支持的。設(shè)計人員可以采用的方法是在FPGA和處理器復(fù)合體之間劃分功能。綠色通道提取和角點檢測卷積很容易在硬件中實現(xiàn)。一旦通過Zynq-7000的AXI4接口將圖像流回處理器存儲器,就可以在圖像上執(zhí)行角圖繪制功能,這些圖像的計算密集度較低。
涉及數(shù)字的更復(fù)雜的圖像處理系統(tǒng)執(zhí)行提取,識別和其他任務(wù)的協(xié)作模塊可能涉及比固定延遲流水線更復(fù)雜的架構(gòu)。例如,不同的情況可能需要對圖像進(jìn)行更密集的處理。例外情況可能會觸發(fā)對部分?jǐn)?shù)據(jù)的更深入分析。這些考慮使調(diào)度變得復(fù)雜。最簡單的選擇是在處理器復(fù)合體上運行自由選擇的函數(shù),但如果某些函數(shù)是計算密集型的,則存在整體系統(tǒng)性能受損并且控制例程將錯過關(guān)鍵期限的風(fēng)險。 FPGA的區(qū)域可以保留用于計算密集型功能,但除非留出大部分,否則無法保證資源在某些條件下可用。所需要的是在處理器復(fù)合體和其他加速器之間分配功能的動態(tài)方法,例如能夠在FPGA架構(gòu)上運行的加速器。
嵌入式多核構(gòu)建模塊(EMB2)庫提供動態(tài)所需的支持預(yù)定的異構(gòu)系統(tǒng)。 EMB2庫可從GitHub獲得,為各種嵌入式實時應(yīng)用程序提供一組設(shè)計模式,這些應(yīng)用程序需要在GPU,GPU和可編程硬件上實現(xiàn)高性能計算支持,以及支持OpenCV等環(huán)境的C ++包裝器。
EMB2庫符合多核任務(wù)管理應(yīng)用程序編程接口(MTAPI),由多核協(xié)會定義,以確保跨異構(gòu)計算平臺的高可移植性。 MTAPI體系結(jié)構(gòu)將工作負(fù)載組織為一組任務(wù)和隊列,后者用于實現(xiàn)數(shù)據(jù)元素流的處理流程。任務(wù)提供了將多個工作包彼此同步所需的組織。
EMB2和MTAPI的一個關(guān)鍵方面是它們支持能夠?qū)ν蝗蝿?wù)使用不同實現(xiàn)的概念。如果構(gòu)成庫的一部分的調(diào)度程序確定硬件結(jié)構(gòu)中有資源可用,則它將運行能夠?qū)嵗匾壿嫷拇a版本,并允許數(shù)據(jù)流入和流出。如果處理器上有更大的空間,則可以標(biāo)記純軟件版本以備運行。開發(fā)人員只需確保兩個表單都可供調(diào)度程序調(diào)用。結(jié)果是高性能應(yīng)用程序的靈活執(zhí)行環(huán)境和適合OpenCV架構(gòu)的應(yīng)用程序。
結(jié)論
由于靈活的開源庫和平臺的結(jié)合提供高速微處理器和可編程硬件,現(xiàn)在可以實現(xiàn)適用于工業(yè)物聯(lián)網(wǎng)的高效機(jī)器視覺應(yīng)用。
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28576瀏覽量
207766 -
機(jī)器視覺
+關(guān)注
關(guān)注
162文章
4400瀏覽量
120516 -
工業(yè)物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
25文章
2383瀏覽量
64598
發(fā)布評論請先 登錄
相關(guān)推薦
評論