鄒勇搏,陳 明,馮國富
上海海洋大學信息學院,農業部漁業信息重點實驗室,上海 201306
漁船駕駛艙是漁船安全航行的核心部分,據統計,多數漁船安全事故是由駕駛人員違規操作造成的,利用視頻監控技術對漁船駕駛艙操作人員進行人員檢測和人數識別,對整個漁船安全具有至關重要的作用。現有漁船安全駕駛監控系統主要通過架設在船艙斜上方的攝像頭采集船艙內場景視頻流,利用人員檢測系統對待測圖像進行人員的檢測和人數的識別,并將檢測結果利用北斗衛星通信系統傳輸到陸地監測系統中,若連續幾次檢測結果有異常,將啟動警報裝置。其中人員檢測系統是漁船安全駕駛監控系統的核心部分,占用很多的計算資源,且受限于北斗衛星傳輸系統的帶寬限制,無法進行實時視頻流的傳遞,需要在漁船艙內環境下完成人員檢測任務。
漁船駕駛艙人員檢測中存在的一個主要問題是檢測效率過低,傳統人員檢測算法中,基于梯度方向直方圖(Histogram of Oriented Gradient,HOG)特征[1]的可變形部件模型(Deformable Part Models,DPM)算法[2-4]在常規場景人員檢測方面取得了很好的效果。文獻[5]提出基于DPM 算法的漁船安全監控系統,針對漁船駕駛艙小范圍特殊場景進行了重新建模,使在該場景下的人員檢測精度可以達到80%以上,但是系統實際應用在船載普通的工控計算機上時,檢測一幀圖像所需要時間達到30~35秒,很難及時反映漁船駕駛艙內的安全狀況。為了突破DPM 算法的檢測效率瓶頸,文獻[6]使用級聯檢測器提高了DPM 算法的檢測效率;文獻[7]提出的快速特征金字塔匹配算法使DPM 算法的特征計算速度得到了顯著提高;文獻[8]提出基于貪婪搜索的Greedy DPM 檢測算法以提高模型的檢測速度;文獻[9-11]使用CUDA 模型在GPU 上實現了DPM 算法的并行化加速,但是這些方法仍然存在計算資源消耗較大及能耗過高的問題。
本文在文獻[5]的系統基礎上,提出一種基于嵌入式GPU 的低功耗漁船駕駛艙人員檢測方法。以嵌入式低功耗開發板Firefly RK3288 為處理平臺,采用GPU 和OpenCL[12]編程模型,對DPM 人員檢測算法中的滑動窗口檢測部分進行了并行加速,充分利用了GPU 中的計算單元,解決了文獻[5]基于工控計算機的人員檢測系統存在的檢測效率過低問題。Firefly RK3288 處理平臺是一種采用ARM+GPU 架構的低成本嵌入式平臺,占用空間小,功率損耗低,可以滿足漁船船載電子設備密封無風扇設計的需要。
DPM 算法采用增強的HOG 特征來描述圖像,為了檢測不同尺度的目標對象,需要將輸入圖像縮放若干次生成不同尺度的圖像金字塔,分別計算圖像在不同尺度上的HOG 特征,進而構建一個關于輸入圖像的HOG 特征金字塔。
在檢測過程中,需要使用一個檢測模型組成的檢測窗口在構建的圖像特征金字塔上滑動掃描。檢測模型的每個組件由一個根濾波器和幾個部件濾波器組成,根濾波器用來描述目標的總體輪廓,而部件濾波器描述目標的不同區域。濾波器與特征金字塔中指定位置相同大小的特征向量存在一個響應,即為濾波器在該位置的得分。定義F 是一個模板濾波器,H 表示圖像HOG 特征金字塔,本文所使用目標模型包含有8 個部件,可以使用一個(8+2)元組來表示目標模型:(F0,P1,…,P8,b),其中F0表示根濾波器,Pi表示第i個部件模型,b表示偏差值,且Pi=(Fi,vi,di),表示第i個部件濾波器Fi的錨點位置vi及偏移懲罰di。使用z=(p0,…p8)表示一個目標假設,pi=(xi,yi,li),i=0,1,…,8 表示第i個濾波器所在的層和位置坐標,則目標假設的得分等于每個濾波器在各自位置的響應得分之和,減去部件濾波器相對于錨點位置的偏移懲罰,再加上一個偏差值b,即:

目標假設得分的核心是每個濾波器響應得分的計算,使用兩個由z 維權重向量組成二維數組定義濾波器F與特征映射G,F的大小為?F×hF,G的大小為?feat×hfeat,S表示每個濾波器的響應得分矩陣,可以由濾波器F與特征映射G中左上角坐標為(x,y)、大小與F相同的子集點積得到:

其大小M×N可以表示為(?feat-?F+1)×(hfeat-hF+1)。
最后通過距離變換找到每個部件濾波器相對于根過濾器的最佳位置,采用非極大值抑制法(Non-Maximum Suppression,NMS)篩選出目標檢測結果大于相應閾值的結果,得出每個目標的最佳匹配結果,即為目標人體的所在位置。其中,滑動窗口檢測過程是DPM 算法運行的核心部分,需要計算濾波器在每個位置的響應得分,具有計算量大、耗時長的特點,其耗時占全部檢測過程的80%以上。通過分析發現,每個檢測窗口的檢測是相互獨立的,可以高度并行化,因此,考慮對滑動窗口檢測部分進行相應優化,縮短檢測周期。
本文以DPM 人員檢測算法為基礎,提出一種基于嵌入式GPU 的漁船駕駛艙人員檢測方法。通過將運算密集型的負載調度到GPU 上以實現檢測算法的加速與優化,有效利用RK3288 異構處理平臺的運算處理優勢。
DPM 算法的異構加速模型由CPU 主機端處理的串行程序和GPU 設備端處理的并行程序組成(圖1)。
1)讀取攝像頭攝取的漁船駕駛艙內的視頻流圖像,在CPU 上完成計算提取輸入圖像HOG 特征及生成特征金字塔的過程;
2)使用檢測窗口在圖像特征金字塔上滑動掃描,自定義OpenCL kernel 函數,計算指定位置濾波器及相應特征映射子集的點積,得到每個位置的響應得分;
3)在CPU 上完成根濾波器與部件濾波器的鏈接、合并冗余窗口等操作,篩選出檢測得分結果大于相應閾值的結果,最終僅保留響應得分最高的檢測窗口,即為目標所在位置。

為了提高算法的檢測效率,基于嵌入式GPU,利用OpenCL 編程模型對算法運算最密集的滑動窗口檢測部分進行并行化實現。
2.2.1 內存模型OpenCL 編程模型使用計算內核(kernel)定義大量重復的計算,本文使用的kernel 主要完成濾波器與特征映射的點積計算,需要使用濾波器矩陣數據以及當前檢測窗口對應的特征映射數據。如果使用通常的內存模型進行數據的存儲訪問,kernel 在每次運行時,都要從全局內存(Global Memory)中讀取相應的數據,不僅延遲較大,且會出現重復讀取的情況。因此使用常量內存(Constant Memory)來存儲濾波器數據,常量內存是GPU 全局內存的其中一個區域,但是該區域在執行一個kernel 期間是保持不變的,而模板濾波器數據是離線訓練的,在整個程序運行過程中是固定的,使用這種內存模型可以避免對全局內存的多次訪問,節省帶寬,并且常量內存緩存在每個GPU 處理器核心中,每個線程都可以訪問緩存的常量內存,這樣在連續讀取相同的地址點時就不會產生額外的內存流量。
特征映射數據存儲在全局內存中,使用clEnqueueMapBuffer()將分配的OpenCL 設備緩沖區的地址映射到CPU 可訪問的內存地址。當檢測窗口在圖像特征金字塔上滑動檢測時,僅讀取該檢測窗口所引用的特征數據,由于檢測窗口的滑動步長是1 個cell(DPM 算法使用1 個cell 描述8×8 個像素點),所以特征數據的讀取將是連續的。
2.2.2 并行策略 串行程序在計算濾波器響應得分時,線程讀取濾波器的數據只能一個接著一個讀取,然后計算每個位置的得分。計算濾波器響應得分(fconv()函數)的檢測窗口是相互獨立的,前后數據之間沒有關聯性,可以對函數進行并行化實現。
OpenCL中最基本的工作單元是工作項(work-item),相當于CPU程序中的線程,通過為每一個檢測窗口分配一個工作項,每一個工作項執行計算一個檢測窗口中濾波器和特征映射的響應得分,如圖2所示。檢測窗口每次滑動的步長為1個cell,即每個檢測窗口相距1個cell,這樣當在某一尺度的特征金字塔上計算時,若當前層由M×N個cell組成,檢測窗口的總數即為M×N,則分配的工作項數量即為M×N,那么全局索引空間的大小global_work_size即設置為M×N,全局索引中的每個索引對應1個cell在圖像中的坐標,查找在這個兩維空間中對應工作項的全局id,使用get_global_id(0)和get_global_id(1)拆分雙重循環,形成一個kernel inner loop。
工作組(work-group)是比工作項更高一級的組織形式,同一工作組的工作項可以并發執行在一個計算單元上。本文設定工作組的大小需要根據當前檢測尺度的圖像大小決定,且處理平臺Firefly RK3288搭載的嵌入式GPU最大計算單元數量為4,因此最多設定4個工作組,每個工作組的大小通常為16的倍數,最大為256,用二維組織形式表示為16×16。
最終使用OpenCL并行實現的濾波器得分計算過程描述如下:
步驟1調用clGetPlatform()函數,獲取可用平臺及平臺ID,調用clGetDevices()函數,獲取可用設備及設備ID,選擇GPU設備,創建上下文,協調主機端與設備端之間的交互機制,創建命令隊列開始與設備進行通信。
步驟2讀取濾波器數據到矩陣F,大小為?F×hF,讀取圖像映射特征數據到矩陣G,大小為?feat×hfeat;
步驟3調用clCreateBuffer()函數,創建輸入buffer用于存儲設備執行程序所需要的數據;使用clEnqueueMapBuffer()將數據在CPU上的內存地址映射至分配的OpenCL設備緩沖區的地址,完成數據到設備端的傳輸;
步驟4調用clCreateKernel函數,創建kernel,設置kernel的參數,執行kernel,計算檢測窗口在不同尺度的圖像特征金字塔上滑動掃描時,濾波器在每個位置的響應得分;
步驟5調用clEnqueueReadBuffer()函數將輸出結果從設備端傳回主機端,供后續程序處理。

為了驗證本文基于嵌入式GPU 的漁船駕駛艙人員檢測方法的檢測準確性和檢測效率,主要通過與現有漁船安全監控系統中的船載人員檢測系統、基于嵌入式CPU 實現的人員檢測方法作為對比。選取相同的待檢測數據及檢測模型,搭建如下實驗平臺:
現有船載檢測系統平臺:Intel(R)Core(TM),搭載雙核i3-2120 CPU,主頻為3.30 GHz,2 GB內存,軟件環境為Windows 7,OpenCV2.4.13 庫。
嵌入式處理平臺:Firefly RK3288,搭載四核Cortex-A17 CPU,主頻為1.8 GHz,2 GB 內存,ARM Mali-T764 GPU。軟件環境為Ubuntu 16.04 系統(內核版本Linux 4.4.52),Opencv2.4.13 庫,Open CL1.1。
通過對同一視頻流圖像進行檢測,來分別驗證計算機、嵌入式CPU 以及嵌入式GPU 上的檢測準確性,檢測結果如圖3 所示,其中圖(a)是攝像頭采集到的船艙監控場景原圖像,圖(b)是現有船載檢測系統的檢測結果,圖(c)為嵌入式CPU 實現的檢測結果,圖(d)為嵌入式GPU 實現的檢測結果。

圖3 檢測結果Fig.3 Detection results
由圖3 可以看出,本文基于嵌入式GPU 實現的并行化人員檢測方法,在人員檢測數目上與現有船載檢測系統、嵌入式CPU 實現的檢測方法基本保持一致,在檢測準確性方面基本沒有損失。
在保證檢測準確性的前提下,本文重點測試基于嵌入式GPU 的人員檢測方法在檢測效率方面的提升。選取船艙某一時段的視頻流圖像,驗證其分別在現有船載檢測系統、嵌入式CPU 以及嵌入式GPU 上進行人員檢測的檢測時間。選取其中連續5 幀圖像,其檢測時間如表1 所示

表1 檢測時間/sTable 1 Detection time

圖4 檢測時間對比Fig.4 Comparison of detection time
通過分析表1 及圖4 可以看出,在不影響算法的檢測效果的前提下,使用嵌入式GPU 并行化實現的檢測方法,與基于嵌入式CPU 實現的檢測方法相比,檢測速度提高了3.75~4.23 倍;與現有船載檢測系統相比,其檢測速度提高了6.74~7.37 倍,系統運行效率有了顯著的提高。限于嵌入式處理平臺的硬件配置限制,雖然仍沒有達到實時檢測的效果,但是基本可以滿足了普通漁船駕駛艙監控系統對人員檢測的應用要求。
根據漁船安全航行的需要,本文提出了一種基于嵌入式GPU 的低功耗漁船駕駛艙人員檢測方法。通過對DPM 算法實現過程進行分析,利用嵌入式GPU 和OpenCL 編程模型對算法運行耗時最多的滑動窗口檢測部分進行了并行化優化,相對于現有船載檢測系統,在保證系統識別效果的前提下,提高了系統的綜合運行效率。同時使用嵌入式處理平臺成本低,占用空間小,功耗也非常少,可以滿足船載電子設備無風扇設計的要求,可以很好的適應漁船上的特殊環境。