彭 爽,蔣榮欣
(浙江大學(xué)浙江省網(wǎng)絡(luò)多媒體技術(shù)研究重點(diǎn)實(shí)驗室,杭州310027)
面向高清視頻監(jiān)控系統(tǒng)的實(shí)時運(yùn)動檢測算法
彭 爽,蔣榮欣
(浙江大學(xué)浙江省網(wǎng)絡(luò)多媒體技術(shù)研究重點(diǎn)實(shí)驗室,杭州310027)
針對高清視頻監(jiān)控系統(tǒng)中精確運(yùn)動檢測的高實(shí)時性需求,提出一種基于計算統(tǒng)一設(shè)備架構(gòu)(CUDA)的運(yùn)動檢測算法。采用一種改進(jìn)幀差與背景差分相結(jié)合的方法,減少背景更新干擾,提升運(yùn)動檢測的精確性。在CUDA內(nèi)進(jìn)行視頻運(yùn)動檢測計算,避免傳統(tǒng)圖形處理器硬解碼后視頻數(shù)據(jù)在顯示內(nèi)存與CPU之間傳輸?shù)膯栴}。運(yùn)用塊內(nèi)多線程合并訪問共享內(nèi)存的方式,減少52.9%全局內(nèi)存訪問量,解決CUDA大規(guī)模訪問全局內(nèi)存延遲較大的問題。實(shí)驗結(jié)果表明,該算法在保證準(zhǔn)確性的同時,針對高清視頻每秒可傳輸52.6幀,能夠滿足實(shí)時性要求。
視頻監(jiān)控;運(yùn)動檢測;幀差法;背景差分法;硬解碼;合并訪問
運(yùn)動檢測是監(jiān)控領(lǐng)域的一個重要課題。特別是在需要安全防范的場合下,運(yùn)動檢測能在發(fā)生異常情況時有效幫助跟蹤定位運(yùn)動目標(biāo),自動報警或自動存儲視頻,是監(jiān)控系統(tǒng)達(dá)到智能化的必要手段[1]。然而,隨著高清視頻的普及化,視頻的解碼及運(yùn)動檢測很難達(dá)到精確性與實(shí)時性兼顧的要求。1080P分辨率的H264視頻碼流,通常碼率為8 Mb/s,幀率為25 f/s,意味著監(jiān)控系統(tǒng)解碼的負(fù)荷量為8 Mb/s,運(yùn)動檢測計算的負(fù)荷量為320 Mb/s,對實(shí)時精確地檢測運(yùn)動目標(biāo)構(gòu)成了極大的挑戰(zhàn)[2]。
視頻監(jiān)控系統(tǒng)運(yùn)動偵測主要包含視頻解碼和運(yùn)動檢測計算。視頻解碼分為軟解碼和硬解碼,高清視頻的軟解碼和運(yùn)動檢測對CPU性能挑戰(zhàn)大,無法達(dá)到實(shí)時性需求。傳統(tǒng)的視頻硬解碼和運(yùn)動檢測存在以下問題:(1)運(yùn)動檢測算法主要有光流法、背景差分法、幀差法[3]。這3種算法都存在很大的局限性。光流法計算復(fù)雜,背景差分法對光線等背景變化敏感,幀差法無法提取完整的運(yùn)動目標(biāo)及內(nèi)部紋理;(2)解碼后的數(shù)據(jù)存放于顯示內(nèi)存中,而顯示內(nèi)存與主存之間的數(shù)據(jù)傳輸速度受限于總線的傳輸速度[4]。
針對上述問題,本文提出基于CUDA的硬解碼及運(yùn)動檢測算法,具體內(nèi)容包括:(1)采用一種改進(jìn)的幀差與背景差分結(jié)合的方法,完整地提取運(yùn)動目標(biāo),有效避免背景誤判;(2)在CUDA環(huán)境下進(jìn)行運(yùn)動檢測計算,避免了顯示內(nèi)存與內(nèi)存?zhèn)鬏數(shù)钠款i問題;(3)針對CUDA對全局內(nèi)存訪問延遲大的問題,采用塊(block)內(nèi)多線程共享內(nèi)存,一個線程處理4×4個像素,合并訪問其鄰域,降低運(yùn)算復(fù)雜度。
2.1 傳統(tǒng)的運(yùn)動檢測算法
背景差分法通過計算當(dāng)前幀和設(shè)定背景的特征差,進(jìn)行背景消去,然后與預(yù)設(shè)閾值作比較。若所得到的像素數(shù)大于預(yù)設(shè)閾值,則判定被監(jiān)視場景中有運(yùn)動物體,從而得到運(yùn)動目標(biāo)[5]。其優(yōu)點(diǎn)是原理和算法設(shè)計簡單,但是對光線變化敏感,同時容易忽略與背景亮度相似的運(yùn)動物體。幀差法是采用計算相鄰幀差絕對值是否大于閾值來檢測移動物體。其優(yōu)點(diǎn)是算法簡單,對光線變化不敏感;缺點(diǎn)是無法完整地提取運(yùn)動目標(biāo),且如果選擇幀間隔過大則判斷缺乏準(zhǔn)確,幀間隔小則計算量較大[6]。在運(yùn)動分量檢測后,通常畫面的噪點(diǎn)較多,需進(jìn)行降噪操作以保證檢測的精確度[7]。
2.2 改進(jìn)的運(yùn)動檢測算法
針對背景差分法對背景變化敏感,幀差法無法完整提取運(yùn)動目標(biāo)等問題,本文采用一種改進(jìn)的基于幀差和背景差分結(jié)合的運(yùn)動檢測算法。將當(dāng)前幀與上一參考幀相減,將所得圖像與背景差分后圖像進(jìn)行位或運(yùn)算后可準(zhǔn)確提煉出運(yùn)動目標(biāo)所在區(qū)域。隨后針對存在移動物體的8×8宏塊單元進(jìn)行開運(yùn)算,去掉毛刺,去掉孤立的噪點(diǎn)像素[8-9]。將運(yùn)動目標(biāo)以外的區(qū)域更新到背景中,如圖1所示。
圖1 改進(jìn)的運(yùn)動檢測算法
在圖1中,It(x,y)是當(dāng)前幀,I(t-1)(x,y)是上一參考幀,I(t-1)(x,y)為上一次更新過的背景圖像,其表達(dá)方式為:
將當(dāng)前幀與參考幀進(jìn)行絕對值減法運(yùn)算:
再將I(t,m)(x,y)與B(t-1)(x,y)進(jìn)行差分運(yùn)算,后得到背景差分后運(yùn)動區(qū)域。將此區(qū)域與幀差所得運(yùn)動區(qū)域疊加,可得到完整的運(yùn)動物體。圖像根據(jù)d閾值進(jìn)行二值化,將運(yùn)動區(qū)域與非運(yùn)動區(qū)域區(qū)分出來:
此時運(yùn)動區(qū)域尚有圖像噪點(diǎn)。利用圖像開運(yùn)算提取運(yùn)動目標(biāo)骨干信息,去掉毛刺,減少孤立噪點(diǎn)的影響:
同時,將運(yùn)動區(qū)域按8×8宏塊存儲,若當(dāng)前區(qū)域內(nèi)有運(yùn)動像素,則置為255,反之置為0:
該算法相比幀差法能更完整地檢測到運(yùn)動目標(biāo),并能準(zhǔn)確完整地反映運(yùn)動物體的位置與移動量。同時相比背景差分法降低了光線等因素的影響,可精確地獲得運(yùn)動物體的形狀與內(nèi)部紋理。
3.1 CUDA硬解碼及運(yùn)動檢測算法
本文選取NVIDA公司提供的CUDA開發(fā)包進(jìn)行實(shí)驗。將網(wǎng)絡(luò)碼流解析后組成完整視頻幀,送入GPU進(jìn)行解碼,解碼出來的數(shù)據(jù)為NV12或者YV12格式。這2種數(shù)據(jù)格式都屬于YUV格式,其Y分量都是連續(xù)的,NV12的U,V分量為交叉分布,YV12的U,V分量為連續(xù)分布[10]。而運(yùn)動檢測算法通常只需取像素點(diǎn)的亮度分量,即Y分量進(jìn)行計算。獲取Y分量后進(jìn)行運(yùn)動檢測計算,計算完成后將YUV數(shù)據(jù)格式轉(zhuǎn)化成顯卡可渲染的RGB數(shù)據(jù)進(jìn)行顯示,同時更新背景幀。通知業(yè)務(wù)層進(jìn)行運(yùn)動偵測的后處理,如自動報警或自動存儲等,如圖2所示。
GPU解碼后的數(shù)據(jù)存放于紋理內(nèi)存中,即顯示內(nèi)存[11]。而顯示內(nèi)存與內(nèi)存間的數(shù)據(jù)傳輸速度為當(dāng)前的難題。基于CUDA的運(yùn)動檢測計算是直接從紋理內(nèi)存讀取數(shù)據(jù),有效地避免這一瓶頸。
圖2 視頻監(jiān)控系統(tǒng)運(yùn)動檢測算法流程
在CUDA中將待檢測的Y圖像分量作幀差與背景差分運(yùn)算,得到的2個運(yùn)動區(qū)域進(jìn)行疊加,利用開運(yùn)算將背景中的毛刺去除,提取準(zhǔn)確的運(yùn)動目標(biāo)。將運(yùn)動區(qū)域以外的圖像塊更新到背景中,流程如圖3所示。
圖3 CUDA環(huán)境內(nèi)數(shù)據(jù)處理流程
3.2 CUDA數(shù)據(jù)處理布局
CUDA架構(gòu)的內(nèi)存分為寄存器、常量內(nèi)存、紋理內(nèi)存、共享內(nèi)存、本地內(nèi)存和全局內(nèi)存等。共享內(nèi)存讀寫速度相當(dāng)快,一般為1個~2個GPU時鐘周期,而全局內(nèi)存讀寫速度高達(dá)400個GPU時鐘周期左右[12]。共享內(nèi)存要求數(shù)據(jù)有局部性重用(一個block內(nèi)共享),且每個GPU處理單元共享內(nèi)存最大限制為48 KB,所以不適用針對高清圖像的多步處理;全局內(nèi)存容量大,適合圖像批處理數(shù)據(jù)的存儲。為了提高訪問全局存儲器的效率,本文采用了一種稱為合并訪問的機(jī)制來加速全局存儲器的訪問[13]。
當(dāng)運(yùn)動檢測計算時,大量的訪問全局內(nèi)存存在冗余性,效率較低。因此,本文采用一種共享內(nèi)存和全局存儲器合并訪問的方式。同一個塊內(nèi)線程可訪問同一共享內(nèi)存,每個線程可將當(dāng)前待處理數(shù)據(jù)和上下鄰域數(shù)據(jù)存儲至共享內(nèi)存中,如圖4所示。當(dāng)所有線程讀取完畢后,線程處理時可直接從共享內(nèi)存中獲取需要訪問的鄰域數(shù)據(jù)。為了能夠高效地訪問顯存,讀取和存儲必須對齊,寬度為4 Byte。如果沒有正確的對齊,讀寫將被編譯器拆分為多次操作,極大地影響效率[14]。計算每個輸出點(diǎn)時,需要取其鄰域的8個像素,相鄰像素處理時讀取到的數(shù)據(jù)有重疊(如圖5(a)所示),為了避免重復(fù)訪問所以每個線程處理4×4個像素,計算此16個像素點(diǎn)時,共訪問36個鄰域像素值,為4字節(jié)對齊(如圖5(b)所示)。4×4像素計算時,每個線程平均需要訪問全局內(nèi)存68次,而采用共享內(nèi)存后,每個線程平均訪問全局內(nèi)存次數(shù)降低至36次,節(jié)省了52.9%的全局內(nèi)存訪問。
圖4 同一塊內(nèi)共享內(nèi)存存儲數(shù)據(jù)
圖5 單數(shù)據(jù)處理和塊數(shù)據(jù)處理方式對比
運(yùn)用CUDA進(jìn)行塊內(nèi)的計算時,需要通過<<<numBlocks,threadPerBlock> > > 進(jìn) 行 內(nèi) 核數(shù)(numBlocks)和塊內(nèi)線程數(shù)(threadsPerBlock)的配置[12]。針對上文中提到的每次處理4×4個數(shù)據(jù),每次訪問到的數(shù)據(jù)x坐標(biāo)idx,y坐標(biāo)idy分別為:
其中,blockIdx為當(dāng)前塊的索引號;blockDim表示每個塊的維度;threadIdx為當(dāng)前塊內(nèi)線程索引號。
該算法實(shí)驗環(huán)境的 GPU為 NVIDIA Geforce 8400 GS(computer capability:1.1),CPU為Intel(R) Core(TM)2 Duo。網(wǎng)絡(luò)視頻分辨率分別設(shè)置為720×480像素,1 280×720像素和1 920×1 080像素。實(shí)驗數(shù)據(jù)如圖6所示。其中,圖6(a)為上一次更新過的背景圖像;圖6(b)為上一幀圖像;圖6(c)為當(dāng)前幀;圖6(d)為圖6(a)與圖6(c)進(jìn)行差分閾值二值化的圖像;圖6(e)為圖6(b)與圖6(c)進(jìn)行幀差閾值二值化的圖像;圖 6(f)為圖 6(d)和圖6(e)圖像位或后所得圖像;圖6(g)為圖6(f)進(jìn)行開運(yùn)算后的圖像;圖6(h)為提取的運(yùn)動宏塊,此運(yùn)動宏塊以外的區(qū)域進(jìn)行背景更新。
圖6 高清監(jiān)控運(yùn)動檢測實(shí)驗輸出
實(shí)驗結(jié)果表明,本文采取的改進(jìn)幀差與背景差分結(jié)合的方法可以準(zhǔn)確檢測出運(yùn)動目標(biāo)的輪廓以及內(nèi)部紋理,將圖像進(jìn)行開運(yùn)算后去除了孤立噪點(diǎn),消除了誤判斷成運(yùn)動目標(biāo)的小物體。所以本文中的基于CUDA的解碼及運(yùn)動檢測算法保證了輸出數(shù)據(jù)的精確度。
在相同環(huán)境下,運(yùn)用相同算法對比CPU和GPU的運(yùn)動檢測計算,實(shí)驗數(shù)據(jù)如表1所示,其中,總時間比為CPU運(yùn)動檢測時間與GPU運(yùn)動檢測的時間之比。720×480像素分辨率下平均碼率為1.5 Mb/s, I幀大小為50 Kb,幀率為25 f/s。1 280×720像素分辨率平均碼率為4 Mb/s,I幀大小平均為100 Kb,幀率為25 f/s。1 920×1 080像素分辨率平均碼率為8 Mb/s,I幀大小平均為150 Kb,幀率為25 f/s。表1中為不同分辨率的視頻解碼及運(yùn)動檢測所需時間的平均數(shù)據(jù)。
表1 不同分辨率的視頻解碼及運(yùn)動檢測所需時間對比
表1數(shù)據(jù)顯示,針對720×480像素,1 280×720像素,1 920×1 080像素分辨率的視頻,基于CUDA的硬解碼及運(yùn)動檢測與CPU軟解碼和運(yùn)動檢測相比,總時間分別縮短了5.2倍、6.0倍、10.4倍。
從表2數(shù)據(jù)可看出,基于CUDA的運(yùn)動檢測計算運(yùn)用本文中優(yōu)化后的內(nèi)存訪問方案較優(yōu)化前平均時間縮短了1.91倍。表中的時間比表示優(yōu)化前的檢測時間與優(yōu)化后的檢測時間之比。針對1 080 P分辨率,基于CUDA的視頻運(yùn)動檢測方法幀率可達(dá)52.6 f/s,滿足了高清智能監(jiān)控系統(tǒng)的實(shí)時性要求。
表2 不同分辨率的GPU運(yùn)動檢測優(yōu)化前后時間對比
本文設(shè)計了一個在高清智能監(jiān)控系統(tǒng)中的環(huán)境實(shí)時運(yùn)動檢測算法。該算法兼顧了高清視頻運(yùn)動檢測的準(zhǔn)確性與實(shí)時性。實(shí)驗結(jié)果表明,本文提出的運(yùn)動檢測算法精度高,計算復(fù)雜度較低。在GPU內(nèi)進(jìn)行圖像運(yùn)動檢測計算可避免傳統(tǒng)GPU硬解碼后顯示內(nèi)存中視頻數(shù)據(jù)與CPU之間的傳輸瓶頸問題。在CUDA內(nèi)部的運(yùn)動檢測算法采用了多線程共享內(nèi)存與合并訪問的方式,減少了數(shù)據(jù)訪問延遲,保證了高清智能監(jiān)控系統(tǒng)的實(shí)時性要求。
[1] Hu Weiming,Tan Tieniu,Wang Liang,et al.A Survey on Visual Surveillance of Object Motion and Behaviors[J].IEEE Transactions on Systems,Man,and Cybernetics,2004,34(3):334-352.
[2] Scotti G,Marcenaro L,Coelho C,et al.Dual Camera Intelligent Sensor for High Definition 360 Degrees Surveillance[J].IEEE Proceedings on Vision,Image and Signal Processing,2005,152(2):250-257.
[3] 周 游,劉艷瀅,王春民,等.幾種人體運(yùn)動檢測算法的比較分析[J].吉林大學(xué)學(xué)報:信息科學(xué)版,2009,27 (6):652-657.
[4] Padalikar S,Diamos G.Exploring theLatency and Bandwidth Tolerance of Cuda Applications[Z].2009.
[5] McHugh J M,Konrad J,Saligrama V,et al.Foregroundadaptive Background Subtraction[J].IEEE Signal Processing Letters,2009,16(5):390-393.
[6] Davide A,Matteucci M,Naccari M.A Revaluation of Frame Difference in Fast and Robust Motion Detection[C]//Proc.of the 4th ACM International Workshop on Video Surveillance and Sensor Networks.New York, USA:ACM Press,2006:215-218.
[7] Gonzalez R C,Wintz P.Digital Image Processing[M].2nd ed.New York,USA:Academic Press,1987.
[8] Yang J,Tian M.Denoising of Coal Flotation Froth Image Using Opening and Closing Filters with Area Reconstruction and Alternating Order Filtering[M]// Deng Hepu,Miao Duoqian,Lei Jingsheng.Artificial Intelligence and ComputationalIntelligence.Berlin, Germany:Springer,2011:376-382.
[9] Rane M A.Fast Morphological Image Processing on GPU Using CUDA[D].Pune,India:Pune University, 2013.
[10] Han Bo,Zhou Bingfeng.Efficient Video Decoding on GPUsby PointBased Rendering[C]//Proc.of Eurographics Symposium on Graphics Hardware. Vienna,Austria:ACM Press,2006:79-86.
[11] Wang Guohui,Wu M,Sun Yang,et al.A Massively Parallel Implementation of QC-LDPC Decoder on GPU[C]//Proc.of the 9th Symposium on Application Specific Processors.[S.l.]:IEEE Press,2011:82-85.
[12] NVIDIA.CUDA Programming Guide Version 2.1[M].Santa Clara,USA:NVIDIA Corporation,2009.
[13] Rao Chao,Liu Shuoqi.Research of CUDA in Intelligent Visual Surveillance Algorithms[C]//Proc.of the 3rd Chinese Conference on Intelligent Visual Surveillance.[S.l.]:IEEE Press,2011:73-76.
[14] NVIDIA.The CUDA Compiler Driver NVCC[M].Santa Clara,USA:NVIDIA Corporation,2009.
編輯 顧逸斐
Real-time Motion Detection Algorithm for High Definition Video Surveillance System
PENG Shuang,JIANG Rong-xin
(Network Multimedia Technology Research Laboratory of Zhejiang Province,Zhejiang University,Hangzhou 310027,China)
Aiming at high real-time demand for accurate motion detection in high-definition video surveillance system, this paper proposes an efficient motion detection algorithm based on Compute Unified Device Architecture(CUDA).By using an improved frame difference and background subtraction method of combining,background interference update is reduced and the accuracy of motion detection is enhanced.By performing video motion detection calculations in the CUDA, the traditional Graphic Processing Unit(GPU)hard decoded video data avoid storing in display memory transferred to CPU,which is the bottleneck problem.This paper uses multiple threads within a block coalesced access shared memory, reduces the amount by 52.9% of the global memory access,solves large-scale access to global memory latency CUDA larger problem.Experimental results show that for high-definition video monitoring system,the proposed motion detection algorithm can reach 52.6 frames per second,ensuring the accuracy as well,and can meet the real-time requirements.
video surveillance;motion detection;frame difference method;background subtraction method;hard decode; coalesced access
1000-3428(2014)11-0288-04
A
TP311.1
10.3969/j.issn.1000-3428.2014.11.057
浙江省級重點(diǎn)科技創(chuàng)新團(tuán)隊基金資助項目(2011R09021-02)。
彭 爽(1989-),女,碩士研究生,主研方向:網(wǎng)絡(luò)多媒體,并行編程;蔣榮欣,副研究員。
2013-11-07
2013-12-02E-mail:vivo_peng@126.com
中文引用格式:彭 爽,蔣榮欣.面向高清視頻監(jiān)控系統(tǒng)的實(shí)時運(yùn)動檢測算法[J].計算機(jī)工程,2014,40(11):288-291.
英文引用格式:Peng Shuang,Jiang Rongxin.Real-time Motion Detection Algorithm for High Definition Video Surveillance System[J].Computer Engineering,2014,40(11):288-291.