鄒勇搏,陳 明,馮國富
上海海洋大學(xué)信息學(xué)院,農(nóng)業(yè)部漁業(yè)信息重點實驗室,上海 201306
漁船駕駛艙是漁船安全航行的核心部分,據(jù)統(tǒng)計,多數(shù)漁船安全事故是由駕駛?cè)藛T違規(guī)操作造成的,利用視頻監(jiān)控技術(shù)對漁船駕駛艙操作人員進行人員檢測和人數(shù)識別,對整個漁船安全具有至關(guān)重要的作用?,F(xiàn)有漁船安全駕駛監(jiān)控系統(tǒng)主要通過架設(shè)在船艙斜上方的攝像頭采集船艙內(nèi)場景視頻流,利用人員檢測系統(tǒng)對待測圖像進行人員的檢測和人數(shù)的識別,并將檢測結(jié)果利用北斗衛(wèi)星通信系統(tǒng)傳輸?shù)疥懙乇O(jiān)測系統(tǒng)中,若連續(xù)幾次檢測結(jié)果有異常,將啟動警報裝置。其中人員檢測系統(tǒng)是漁船安全駕駛監(jiān)控系統(tǒng)的核心部分,占用很多的計算資源,且受限于北斗衛(wèi)星傳輸系統(tǒng)的帶寬限制,無法進行實時視頻流的傳遞,需要在漁船艙內(nèi)環(huán)境下完成人員檢測任務(wù)。
漁船駕駛艙人員檢測中存在的一個主要問題是檢測效率過低,傳統(tǒng)人員檢測算法中,基于梯度方向直方圖(Histogram of Oriented Gradient,HOG)特征[1]的可變形部件模型(Deformable Part Models,DPM)算法[2-4]在常規(guī)場景人員檢測方面取得了很好的效果。文獻[5]提出基于DPM 算法的漁船安全監(jiān)控系統(tǒng),針對漁船駕駛艙小范圍特殊場景進行了重新建模,使在該場景下的人員檢測精度可以達到80%以上,但是系統(tǒng)實際應(yīng)用在船載普通的工控計算機上時,檢測一幀圖像所需要時間達到30~35秒,很難及時反映漁船駕駛艙內(nèi)的安全狀況。為了突破DPM 算法的檢測效率瓶頸,文獻[6]使用級聯(lián)檢測器提高了DPM 算法的檢測效率;文獻[7]提出的快速特征金字塔匹配算法使DPM 算法的特征計算速度得到了顯著提高;文獻[8]提出基于貪婪搜索的Greedy DPM 檢測算法以提高模型的檢測速度;文獻[9-11]使用CUDA 模型在GPU 上實現(xiàn)了DPM 算法的并行化加速,但是這些方法仍然存在計算資源消耗較大及能耗過高的問題。
本文在文獻[5]的系統(tǒng)基礎(chǔ)上,提出一種基于嵌入式GPU 的低功耗漁船駕駛艙人員檢測方法。以嵌入式低功耗開發(fā)板Firefly RK3288 為處理平臺,采用GPU 和OpenCL[12]編程模型,對DPM 人員檢測算法中的滑動窗口檢測部分進行了并行加速,充分利用了GPU 中的計算單元,解決了文獻[5]基于工控計算機的人員檢測系統(tǒng)存在的檢測效率過低問題。Firefly RK3288 處理平臺是一種采用ARM+GPU 架構(gòu)的低成本嵌入式平臺,占用空間小,功率損耗低,可以滿足漁船船載電子設(shè)備密封無風(fēng)扇設(shè)計的需要。
DPM 算法采用增強的HOG 特征來描述圖像,為了檢測不同尺度的目標對象,需要將輸入圖像縮放若干次生成不同尺度的圖像金字塔,分別計算圖像在不同尺度上的HOG 特征,進而構(gòu)建一個關(guān)于輸入圖像的HOG 特征金字塔。
在檢測過程中,需要使用一個檢測模型組成的檢測窗口在構(gòu)建的圖像特征金字塔上滑動掃描。檢測模型的每個組件由一個根濾波器和幾個部件濾波器組成,根濾波器用來描述目標的總體輪廓,而部件濾波器描述目標的不同區(qū)域。濾波器與特征金字塔中指定位置相同大小的特征向量存在一個響應(yīng),即為濾波器在該位置的得分。定義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)表示一個目標假設(shè),pi=(xi,yi,li),i=0,1,…,8 表示第i個濾波器所在的層和位置坐標,則目標假設(shè)的得分等于每個濾波器在各自位置的響應(yīng)得分之和,減去部件濾波器相對于錨點位置的偏移懲罰,再加上一個偏差值b,即:
目標假設(shè)得分的核心是每個濾波器響應(yīng)得分的計算,使用兩個由z 維權(quán)重向量組成二維數(shù)組定義濾波器F與特征映射G,F(xiàn)的大小為?F×hF,G的大小為?feat×hfeat,S表示每個濾波器的響應(yīng)得分矩陣,可以由濾波器F與特征映射G中左上角坐標為(x,y)、大小與F相同的子集點積得到:
其大小M×N可以表示為(?feat-?F+1)×(hfeat-hF+1)。
最后通過距離變換找到每個部件濾波器相對于根過濾器的最佳位置,采用非極大值抑制法(Non-Maximum Suppression,NMS)篩選出目標檢測結(jié)果大于相應(yīng)閾值的結(jié)果,得出每個目標的最佳匹配結(jié)果,即為目標人體的所在位置。其中,滑動窗口檢測過程是DPM 算法運行的核心部分,需要計算濾波器在每個位置的響應(yīng)得分,具有計算量大、耗時長的特點,其耗時占全部檢測過程的80%以上。通過分析發(fā)現(xiàn),每個檢測窗口的檢測是相互獨立的,可以高度并行化,因此,考慮對滑動窗口檢測部分進行相應(yīng)優(yōu)化,縮短檢測周期。
本文以DPM 人員檢測算法為基礎(chǔ),提出一種基于嵌入式GPU 的漁船駕駛艙人員檢測方法。通過將運算密集型的負載調(diào)度到GPU 上以實現(xiàn)檢測算法的加速與優(yōu)化,有效利用RK3288 異構(gòu)處理平臺的運算處理優(yōu)勢。
DPM 算法的異構(gòu)加速模型由CPU 主機端處理的串行程序和GPU 設(shè)備端處理的并行程序組成(圖1)。
1)讀取攝像頭攝取的漁船駕駛艙內(nèi)的視頻流圖像,在CPU 上完成計算提取輸入圖像HOG 特征及生成特征金字塔的過程;
2)使用檢測窗口在圖像特征金字塔上滑動掃描,自定義OpenCL kernel 函數(shù),計算指定位置濾波器及相應(yīng)特征映射子集的點積,得到每個位置的響應(yīng)得分;
3)在CPU 上完成根濾波器與部件濾波器的鏈接、合并冗余窗口等操作,篩選出檢測得分結(jié)果大于相應(yīng)閾值的結(jié)果,最終僅保留響應(yīng)得分最高的檢測窗口,即為目標所在位置。
為了提高算法的檢測效率,基于嵌入式GPU,利用OpenCL 編程模型對算法運算最密集的滑動窗口檢測部分進行并行化實現(xiàn)。
2.2.1 內(nèi)存模型OpenCL 編程模型使用計算內(nèi)核(kernel)定義大量重復(fù)的計算,本文使用的kernel 主要完成濾波器與特征映射的點積計算,需要使用濾波器矩陣數(shù)據(jù)以及當(dāng)前檢測窗口對應(yīng)的特征映射數(shù)據(jù)。如果使用通常的內(nèi)存模型進行數(shù)據(jù)的存儲訪問,kernel 在每次運行時,都要從全局內(nèi)存(Global Memory)中讀取相應(yīng)的數(shù)據(jù),不僅延遲較大,且會出現(xiàn)重復(fù)讀取的情況。因此使用常量內(nèi)存(Constant Memory)來存儲濾波器數(shù)據(jù),常量內(nèi)存是GPU 全局內(nèi)存的其中一個區(qū)域,但是該區(qū)域在執(zhí)行一個kernel 期間是保持不變的,而模板濾波器數(shù)據(jù)是離線訓(xùn)練的,在整個程序運行過程中是固定的,使用這種內(nèi)存模型可以避免對全局內(nèi)存的多次訪問,節(jié)省帶寬,并且常量內(nèi)存緩存在每個GPU 處理器核心中,每個線程都可以訪問緩存的常量內(nèi)存,這樣在連續(xù)讀取相同的地址點時就不會產(chǎn)生額外的內(nèi)存流量。
特征映射數(shù)據(jù)存儲在全局內(nèi)存中,使用clEnqueueMapBuffer()將分配的OpenCL 設(shè)備緩沖區(qū)的地址映射到CPU 可訪問的內(nèi)存地址。當(dāng)檢測窗口在圖像特征金字塔上滑動檢測時,僅讀取該檢測窗口所引用的特征數(shù)據(jù),由于檢測窗口的滑動步長是1 個cell(DPM 算法使用1 個cell 描述8×8 個像素點),所以特征數(shù)據(jù)的讀取將是連續(xù)的。
2.2.2 并行策略 串行程序在計算濾波器響應(yīng)得分時,線程讀取濾波器的數(shù)據(jù)只能一個接著一個讀取,然后計算每個位置的得分。計算濾波器響應(yīng)得分(fconv()函數(shù))的檢測窗口是相互獨立的,前后數(shù)據(jù)之間沒有關(guān)聯(lián)性,可以對函數(shù)進行并行化實現(xiàn)。
OpenCL中最基本的工作單元是工作項(work-item),相當(dāng)于CPU程序中的線程,通過為每一個檢測窗口分配一個工作項,每一個工作項執(zhí)行計算一個檢測窗口中濾波器和特征映射的響應(yīng)得分,如圖2所示。檢測窗口每次滑動的步長為1個cell,即每個檢測窗口相距1個cell,這樣當(dāng)在某一尺度的特征金字塔上計算時,若當(dāng)前層由M×N個cell組成,檢測窗口的總數(shù)即為M×N,則分配的工作項數(shù)量即為M×N,那么全局索引空間的大小global_work_size即設(shè)置為M×N,全局索引中的每個索引對應(yīng)1個cell在圖像中的坐標,查找在這個兩維空間中對應(yīng)工作項的全局id,使用get_global_id(0)和get_global_id(1)拆分雙重循環(huán),形成一個kernel inner loop。
工作組(work-group)是比工作項更高一級的組織形式,同一工作組的工作項可以并發(fā)執(zhí)行在一個計算單元上。本文設(shè)定工作組的大小需要根據(jù)當(dāng)前檢測尺度的圖像大小決定,且處理平臺Firefly RK3288搭載的嵌入式GPU最大計算單元數(shù)量為4,因此最多設(shè)定4個工作組,每個工作組的大小通常為16的倍數(shù),最大為256,用二維組織形式表示為16×16。
最終使用OpenCL并行實現(xiàn)的濾波器得分計算過程描述如下:
步驟1調(diào)用clGetPlatform()函數(shù),獲取可用平臺及平臺ID,調(diào)用clGetDevices()函數(shù),獲取可用設(shè)備及設(shè)備ID,選擇GPU設(shè)備,創(chuàng)建上下文,協(xié)調(diào)主機端與設(shè)備端之間的交互機制,創(chuàng)建命令隊列開始與設(shè)備進行通信。
步驟2讀取濾波器數(shù)據(jù)到矩陣F,大小為?F×hF,讀取圖像映射特征數(shù)據(jù)到矩陣G,大小為?feat×hfeat;
步驟3調(diào)用clCreateBuffer()函數(shù),創(chuàng)建輸入buffer用于存儲設(shè)備執(zhí)行程序所需要的數(shù)據(jù);使用clEnqueueMapBuffer()將數(shù)據(jù)在CPU上的內(nèi)存地址映射至分配的OpenCL設(shè)備緩沖區(qū)的地址,完成數(shù)據(jù)到設(shè)備端的傳輸;
步驟4調(diào)用clCreateKernel函數(shù),創(chuàng)建kernel,設(shè)置kernel的參數(shù),執(zhí)行kernel,計算檢測窗口在不同尺度的圖像特征金字塔上滑動掃描時,濾波器在每個位置的響應(yīng)得分;
步驟5調(diào)用clEnqueueReadBuffer()函數(shù)將輸出結(jié)果從設(shè)備端傳回主機端,供后續(xù)程序處理。
為了驗證本文基于嵌入式GPU 的漁船駕駛艙人員檢測方法的檢測準確性和檢測效率,主要通過與現(xiàn)有漁船安全監(jiān)控系統(tǒng)中的船載人員檢測系統(tǒng)、基于嵌入式CPU 實現(xiàn)的人員檢測方法作為對比。選取相同的待檢測數(shù)據(jù)及檢測模型,搭建如下實驗平臺:
現(xiàn)有船載檢測系統(tǒng)平臺:Intel(R)Core(TM),搭載雙核i3-2120 CPU,主頻為3.30 GHz,2 GB內(nèi)存,軟件環(huán)境為Windows 7,OpenCV2.4.13 庫。
嵌入式處理平臺:Firefly RK3288,搭載四核Cortex-A17 CPU,主頻為1.8 GHz,2 GB 內(nèi)存,ARM Mali-T764 GPU。軟件環(huán)境為Ubuntu 16.04 系統(tǒng)(內(nèi)核版本Linux 4.4.52),Opencv2.4.13 庫,Open CL1.1。
通過對同一視頻流圖像進行檢測,來分別驗證計算機、嵌入式CPU 以及嵌入式GPU 上的檢測準確性,檢測結(jié)果如圖3 所示,其中圖(a)是攝像頭采集到的船艙監(jiān)控場景原圖像,圖(b)是現(xiàn)有船載檢測系統(tǒng)的檢測結(jié)果,圖(c)為嵌入式CPU 實現(xiàn)的檢測結(jié)果,圖(d)為嵌入式GPU 實現(xiàn)的檢測結(jié)果。
圖3 檢測結(jié)果Fig.3 Detection results
由圖3 可以看出,本文基于嵌入式GPU 實現(xiàn)的并行化人員檢測方法,在人員檢測數(shù)目上與現(xiàn)有船載檢測系統(tǒng)、嵌入式CPU 實現(xiàn)的檢測方法基本保持一致,在檢測準確性方面基本沒有損失。
在保證檢測準確性的前提下,本文重點測試基于嵌入式GPU 的人員檢測方法在檢測效率方面的提升。選取船艙某一時段的視頻流圖像,驗證其分別在現(xiàn)有船載檢測系統(tǒng)、嵌入式CPU 以及嵌入式GPU 上進行人員檢測的檢測時間。選取其中連續(xù)5 幀圖像,其檢測時間如表1 所示
表1 檢測時間/sTable 1 Detection time
圖4 檢測時間對比Fig.4 Comparison of detection time
通過分析表1 及圖4 可以看出,在不影響算法的檢測效果的前提下,使用嵌入式GPU 并行化實現(xiàn)的檢測方法,與基于嵌入式CPU 實現(xiàn)的檢測方法相比,檢測速度提高了3.75~4.23 倍;與現(xiàn)有船載檢測系統(tǒng)相比,其檢測速度提高了6.74~7.37 倍,系統(tǒng)運行效率有了顯著的提高。限于嵌入式處理平臺的硬件配置限制,雖然仍沒有達到實時檢測的效果,但是基本可以滿足了普通漁船駕駛艙監(jiān)控系統(tǒng)對人員檢測的應(yīng)用要求。
根據(jù)漁船安全航行的需要,本文提出了一種基于嵌入式GPU 的低功耗漁船駕駛艙人員檢測方法。通過對DPM 算法實現(xiàn)過程進行分析,利用嵌入式GPU 和OpenCL 編程模型對算法運行耗時最多的滑動窗口檢測部分進行了并行化優(yōu)化,相對于現(xiàn)有船載檢測系統(tǒng),在保證系統(tǒng)識別效果的前提下,提高了系統(tǒng)的綜合運行效率。同時使用嵌入式處理平臺成本低,占用空間小,功耗也非常少,可以滿足船載電子設(shè)備無風(fēng)扇設(shè)計的要求,可以很好的適應(yīng)漁船上的特殊環(huán)境。