傳統(tǒng)嵌入式視覺系統(tǒng)采用FPGA/處理器組合來實現(xiàn),也有越來越多地使用將高性能處理器與FPGA相結合的片上系統(tǒng)來實現(xiàn)。在本文中我們將會介紹嵌入式視覺系統(tǒng)的高級元素;如何簡便快捷地使用軟件 API 和 IP 庫構建嵌入式視覺系統(tǒng),如何把算法開發(fā)的增值部分添加到圖像處理鏈中。
從監(jiān)控攝像頭等簡單監(jiān)控系統(tǒng)到更高級的應用,例如當今最新款汽車配備的高級駕駛員輔助系統(tǒng) (ADAS)和先進生產設施及工廠里使用的機器視覺,嵌入式視覺系統(tǒng)已在一系列應用中得到使用。不論何種應用,嵌入式視覺系統(tǒng)都具備一些共同之處,總體來講它們可以分為下列三大類:
設備接口 — 提供到所選成像設備的接口。根據(jù)選擇的設備類型,提供所需的時鐘、偏置和配置數(shù)據(jù)。這樣還可以從設備接收圖像數(shù)據(jù),根據(jù)需要進行解碼和格式化,以供圖像處理鏈做進一步處理。
圖像處理鏈 — 通過設備接口接收圖像數(shù)據(jù)并進行彩色濾波器陣列內插和色域轉換(即從彩色轉換到灰度)等操作。這部分仍處于我們對接收到的圖像使用大量算法的圖像處理鏈內。這些可以是降噪或邊緣增強等簡單算法,也可以是對象識別或光流等復雜得多的算法。常見情況是在圖像處理鏈的上游部分調用算法實現(xiàn)方案。當然圖像處理鏈上游的實現(xiàn)復雜性取決于要實現(xiàn)的應用。而輸出格式化部分(即將處理后的圖像數(shù)據(jù)轉換為正確格式,以輸出到顯示器或是通過通信接口輸出)被稱為下游部分。
系統(tǒng)監(jiān)視與控制 – 這是一項獨立于設備接口和圖像處理鏈的類別,它從兩個方面提供系統(tǒng)監(jiān)視和控制。第一個位于設備內部,它提供:
o 圖像處理鏈的配置
o 圖像分析功能
o 在算法執(zhí)行過程中根據(jù)要求更新圖像處理鏈
第二個是更廣泛的嵌入式視覺系統(tǒng)的控制與管理,它提供:
o 電源管理和圖像設備上電排序
o 執(zhí)行自檢及其他系統(tǒng)管理功能
o 網(wǎng)絡支持通信或點對點通信
o 在首次成像操作前通過 I2C 或 SPI 配置圖像設備
部分應用允許系統(tǒng)監(jiān)視功能訪問幀存儲器并在其中的幀上執(zhí)行算法。在這種情況下系統(tǒng)監(jiān)視能夠構成圖像處理鏈的一部分。
這三大類別因為每個階段內在的難點不同,需要不同的實現(xiàn)方法。設備接口和圖像處理鏈都要求有能力處理帶寬高數(shù)據(jù),從而在內部實現(xiàn)圖像處理鏈,在外部從系統(tǒng)傳輸圖像數(shù)據(jù)。而系統(tǒng)監(jiān)視與控制要求能夠處理和響應通過通信接口接收到的命令并為外部通信提供支持。如果系統(tǒng)監(jiān)視也要構成圖像處理鏈的組成部分,就需要一個高性能處理器。
照此,傳統(tǒng)嵌入式視覺系統(tǒng)采用FPGA/處理器組合來實現(xiàn),也有越來越多地使用將高性能處理器與FPGA相結合的片上系統(tǒng)來實現(xiàn)。在我們演示上述幾個方面如何結合在一起之前,我們先來了解一下這三個類別中每一個的不同難點。
設備接口
傳感器接口由應用所選擇的設備決定,大多數(shù)嵌入式視覺應用使用 CMOS 圖像傳感器 (CIS)。一般情況下這些傳感器使用 CMOS 并行輸出總線,用控制信號提示行和幀的有效順序,或者使用速率更高的串行通信,實現(xiàn)較簡單的系統(tǒng)接口,但會導致 FPGA 實現(xiàn)方案略顯復雜。與并行總線相比,這些串行數(shù)據(jù)流能通過更少數(shù)量的通道傳輸圖像,因為它們以快得多的數(shù)據(jù)速率運行,因此相比并行接口而言,能讓成像器支持更高的幀速率。為實現(xiàn)同步,常見的做法是讓包含圖像及其它數(shù)據(jù)字的數(shù)據(jù)通道與包含用于定義數(shù)據(jù)通道上的內容的代碼字的同步通道相結合。與數(shù)據(jù)通道和同步通道結合的還有一個時鐘通道,因為該接口采用源同步。這些高速串行通道一般實現(xiàn)為 LVDS 或微擺幅差分信號 (Reduced Swing LVDS),以降低系統(tǒng)噪聲和功耗。
不論輸出圖像格式如何,通常是 CIS 設備在獲取任何圖像之前需要由嵌入式視覺系統(tǒng)加以配置。這是由 CIS 設備的多功能性造成的。這種多功能性在提供強大的片上處理功能的同時,也需要在輸出圖像前使用正確的設置進行配置。這些接口對帶寬的要求沒有圖像傳輸要求的那么高,因此常常使用 I2C 或 SPI 接口標準。
因為所需的圖像數(shù)據(jù)帶寬較高,經常把該接口實現(xiàn)在 FPGA 中,這樣更便于與圖像處理鏈集成。該 CIS 設備的配置接口一般使用 I2C 或 SPI,它們既可以用 FPGA 實現(xiàn),也可以用支持這種接口的系統(tǒng)監(jiān)視與控制處理器實現(xiàn)。
圖像處理鏈
圖像處理鏈由上下游元件和接口組成,像素數(shù)據(jù)通過設備接口輸出。但是接收到的像素的格式可能不能用于正確顯示圖像。我們可能需要進行圖像校正,尤其是在使用彩色成像器的情況下。 為維持所需數(shù)據(jù)率下的吞吐量,圖像處理鏈常實現(xiàn)在 FPGA 中,以發(fā)揮其并行優(yōu)勢。這樣可以生成圖像處理流水線,使得處理鏈的每一步都將并行實現(xiàn),從而獲得更高的幀速率。但是對部分應用我們必須考慮時延,尤其是對高級駕駛員輔助系統(tǒng) (ADAS) 這樣的系統(tǒng)而言。為有效建立圖像處理鏈,我們需要使用通用互聯(lián)協(xié)議作為圖像處理內核的基礎,從而方便處理 IP 的互聯(lián)。這樣可以帶來兩重好處:一是可以重復使用的庫;二是由于每個 IP 核旨在根據(jù)定義的標準接收和發(fā)送數(shù)據(jù),從而方便流水線的建立。這里有多種常用的協(xié)議可供選用,其中最常見的是 AXI,因其具有同時支持內存映射接口和流接口的靈活性。
圖像處理鏈內的典型處理階段包括:
彩色濾波器陣列 – 在CIS設備上用貝爾 (Bayer) 濾色片生成每個像素的彩色
色域轉換 – 從RGB轉換為YUV
色度重采樣 – 將 YUV 像素轉換為更高效的像素編碼
應用圖像校正算法,比如色彩校正或伽馬校正,或是進行圖像增強或降噪
在下游側我們可以配置視頻輸出時序,然后在輸出到指定的目標前轉換回本機并行輸出視頻格式
部分系統(tǒng)也使用外部內存,例如DDR 的內存作為幀存儲,在 SoC 內部 DDR 內存也往往提供給 SoC 的處理器側。共享內存空間的能力讓系統(tǒng)監(jiān)視側能通過千兆位以太網(wǎng)或 USB 傳輸數(shù)據(jù),或成為圖像處理鏈的延伸。
系統(tǒng)監(jiān)視
傳統(tǒng)上該功能實現(xiàn)在處理器內部,能夠處理相關命令,以按應用需求對圖像處理鏈進行配置。為接收和處理命令,系統(tǒng)監(jiān)視功能必須能夠支持從簡單的 RS232、千兆位以太網(wǎng)、USB、PCIe 到 CAN 汽車專用接口等一系列不同的通信接口。
只要嵌入式視覺系統(tǒng)的架構能夠支持,我們就能使用處理器來生成圖像疊加信息,可供疊加在輸出圖像上。在能夠訪問圖像數(shù)據(jù)的條件下,我們也能夠使用處理器對圖像開展進一步處理,或是收集統(tǒng)計數(shù)據(jù)(像素值分布柱狀圖等)。這樣系統(tǒng)監(jiān)視就成為圖像處理鏈的一部分,讓開發(fā)人員能利用各種開源圖像處理庫,如OpenCV、OpenCL 和 OpenVX。
EVK使用實例
在闡明嵌入式視覺系統(tǒng)的基本元素后,下文將示范這些概念,展現(xiàn)如何綜合運用它們創(chuàng)建出可工作的系統(tǒng)。該實例將展示我們如何使用安富利 MicroZed 嵌入式視覺套件 (EVK)創(chuàng)建嵌入式視覺系統(tǒng)。
該套件使用安森美 Python 1300C 成像設備和賽靈思 Zynq 7020。 Python 1300C 是一個 1280 像素×1024行的色彩圖像傳感器,通過 SPI 接口配置。此型號傳感器使用串行輸出實現(xiàn)高幀率,同時EVK 支持通過 HDMI 接口輸出圖像到顯示器。
Zynq 7020 為嵌入式視覺系統(tǒng)的實現(xiàn)提供了一個極好的平臺,因為我們能使用 FPGA 架構中的可編程邏輯 (PL) 實現(xiàn)該設備的接口和圖像處理鏈。而 FPGA 架構中的 ARM A9雙核處理器(即處理系統(tǒng) (PS))可用于根據(jù)我們的需要實現(xiàn)系統(tǒng)監(jiān)視功能和圖像處理鏈延伸。
為開發(fā)該應用,我們將用到兩個 SoC 開發(fā)工具。一個是賽靈思 Vivado 2015.4,另一個是賽靈思SDK 2015.4。在 Vivado 中我們將實現(xiàn)設備的接口、圖像處理鏈,在 Zynq 內配置 PS,建立 PS 到 PL 存儲器映射以完成下列操作:
根據(jù)圖像大小和幀速率所要求的參數(shù)以及所需操作在圖像處理鏈內配置 IP。為此我們將在 PS和 PL 間使用通用 AXI 互聯(lián),以 PS 為主設備。使用該接口我們能在 PS 和 PL 間實現(xiàn) 高達 1,200Mbps 的傳輸速率。
如有必要,將處理器的 DDR 內存置于圖像處理鏈中,以便處理器訪問。為此我們將在 PL 和 PS 間使用高性能 AXI 互聯(lián),以 PL 為主設備。使用該接口我們能在 PL 和 PS DDR 內存間實現(xiàn)高達 2,400Mbps 的傳輸速率。
該演示將使用 HDMI 展示如何將圖像輸出到顯示器上。相當有用的是,EVK 制造商安富利為Python 1300C 提供了一個設備接口 IP 模塊,并為在 EVK 上接口輸出到 HDMI 設備提供了一個 HDMI 輸出 IP 模塊。我們將本實例中使用所有這些模塊。在 Vivado 中我們可以使用 IPXact 格式把這些 IP 模塊添加到 Vivado IP 目錄中。
圖像處理鏈將與安森美設備接口并執(zhí)行下列處理階段,除了 Python 1300C 和 HDMI IP 核,所有使用的 IP 核均來自 Vivado 中的標準賽靈思圖像處理 IP 庫(實際 IP 核的名稱在下面顯示):
圖1:圖像處理流程
將來自 Python 接口 IP 的并行視頻和水平及垂直同步轉換為 AXIS Stream,以便我們能夠將其與后續(xù)的圖像處理IP核接口。 視頻輸入到 AXIS (Video in to AXIS)
彩色濾波器陣列使用貝爾濾色片為每個輸出像素賦予一個 RGB 值(僅以 R、G 或 B 表示)。彩色濾波器陣列插值 (Color Filter Array interpolation)
RGB 到 YUV色域轉換,將 RGB 色域轉換為 HDMI 驅動器優(yōu)選的 YUV 色域輸出格式。RGB 到 YCRCB色域轉換器 (RGB to YCRCB Color-Space Convertor)
將 YUV 從 4:4:4 格式重新縮放為 4:2:2 格式。 色度重采樣 (Chroma Resampler)
配置視頻 DMA 以傳輸圖像幀到 PS DDR。 AXI VDMA
配置同一視頻 DMA,以從 PS DDR 讀取圖像幀。 AXI VDMA
將 AXI Stream 轉換回并行格式。 AXIS 到視頻輸出
為輸出視頻時序提供時序參考生成器。 視頻時序控制器
除了確保系統(tǒng)正常運行,我們還需要兩個 AXI 互聯(lián)。一個是高性能 AXI 互聯(lián),另一個是通用AXI 互聯(lián),以及每個時鐘域所需的復位模塊。
圖像處理應用需要一系列的時鐘域,大部分時鐘域我們可以使用 Zynq 內部的 PS 提供給 PL的時鐘。就該應用而言,我們需要下列時鐘:
108 MHz – 這是以 1280x1024 分辨率和 60 Hz幀速率輸出圖像所需的像素時鐘速率。
75 MHz – 用于存儲器映射的 AXI 和 AXI Lite 接口。
150 MHz – 用于圖像處理鏈,也稱為AXI Streaming時鐘。AXI Stream 時鐘的速率必須至少與像素速率相同。但是我們必須考慮處理鏈中的所有 IP 核的吞吐量。雖然大多數(shù)模塊能夠每時鐘周期處理一個像素,留出部分裕度并減少所需的緩存是明智的做法。
200 MHz – 提供給 Python 1300C CIS 設備作為基準。
為實現(xiàn)像素時鐘,我們需要使用時鐘向導來生成該 108MHz 像素時鐘,因為該時鐘需要極為準確的設置。雖然在用 PL 架構時鐘設置時,75MHz和150MHz時鐘允許部分容差,但 200MHz時鐘也要求精確。與 108MHz 時鐘不同的是該時鐘可由 PL 架構時鐘精確生成。
所使用的 IP 模塊的時鐘結構如下表所示:
評論
查看更多