冉 涌
基于百度AI的人流量監(jiān)測系統(tǒng)
冉 涌
(重慶三峽職業(yè)學(xué)院 智能制造學(xué)院,中國 重慶 404155)
人流量實時監(jiān)測既有潛在的商業(yè)價值,更是保障公共安全的重要手段之一。視頻識別技術(shù)實現(xiàn)區(qū)域人流量監(jiān)測是目前最有效的手段,然而,開發(fā)其中的機(jī)器視覺算法耗時耗力。目前,一種更有效的解決方案是基于百度AI平臺提供的視覺識別API接口,結(jié)合實際需求做二次開發(fā)。采用C#語言開發(fā)客戶端監(jiān)控識別程序,完成攝像機(jī)連接以及百度AI平臺接入和數(shù)據(jù)交換等工作。其中,關(guān)鍵是通過多線程的方式,保證視頻流暢和網(wǎng)絡(luò)數(shù)據(jù)穩(wěn)定交互,處理好各類系統(tǒng)事件間的關(guān)系。實驗結(jié)果表明,該方法能在多視角和不同攝像環(huán)境下,識別出人體,包括正面部分遮擋、背面、側(cè)面、頭頂4種姿態(tài);動態(tài)人流量統(tǒng)計準(zhǔn)確率達(dá)97.5%。
人流量;百度AI;鑒權(quán);實時監(jiān)測
人流量監(jiān)測是指在一個指定區(qū)域內(nèi)實時統(tǒng)計人員的流動情況。在景區(qū)、車站、商場等人員密集的場所,實時監(jiān)測人流狀況,既有潛在的商業(yè)價值,更是保障公共安全的重要手段之一。傳統(tǒng)的光電傳感器檢測方式,只適合設(shè)置在狹窄的通道處,使其使用范圍受到很大限制。近年來,眾多學(xué)者采用視頻識別技術(shù),監(jiān)測大范圍內(nèi)的人員流動情況,取得了一定成效[1-3]。有的采用基于運(yùn)動檢測的算法、有的采用基于機(jī)器學(xué)習(xí)的算法,在具體場景中,單獨(dú)開發(fā)、實現(xiàn)這些算法需要耗費(fèi)大量人力和資源,并且不便于功能擴(kuò)展和推廣應(yīng)用[4-7]。然而,百度AI(人工智能)平臺提供的API接口很好的解決了這一問題。本文采用C#語言開發(fā)客戶端程序,調(diào)用本地USB攝像機(jī)或者網(wǎng)絡(luò)攝像機(jī),連接百度AI平臺,優(yōu)化程序結(jié)構(gòu)設(shè)計,實現(xiàn)人流量動態(tài)監(jiān)測統(tǒng)計功能。
百度AI平臺提供了人流量統(tǒng)計的動態(tài)版,其主要功能是統(tǒng)計圖像中的人體數(shù)量和流動趨勢。其核心功能包括:(1)靜態(tài)人數(shù)統(tǒng)計:(2)動態(tài)人數(shù)統(tǒng)計和跟蹤:(3)傳入監(jiān)控視頻抓拍圖片序列,進(jìn)行人體追蹤,返回每個人體框的坐標(biāo)和所屬編號;(4)根據(jù)目標(biāo)軌跡判斷進(jìn)出區(qū)域行為,進(jìn)行動態(tài)人流量統(tǒng)計,返回指定區(qū)域進(jìn)出人數(shù)[8]。其提供了API接口,方便開發(fā)人員根據(jù)實際需要做二次開發(fā)。目前,在線訪問的API接口,對于普通用戶,只要在百度AI平臺注冊后,即可免費(fèi)使用。
在百度AI平臺,除了人流量監(jiān)測系統(tǒng)以外,還包含多種人工智能的應(yīng)用,都開放給用戶使用。為了保證各個應(yīng)用的安全和對各用戶訪問權(quán)限的控制,平臺采用訪問令牌(Access Token)的方式實現(xiàn)鑒權(quán)認(rèn)證。因此,用戶需要首先在平臺注冊賬號,申請開通人流量監(jiān)測的應(yīng)用,并取得相應(yīng)的API Key和Secret Key。然后,向授權(quán)服務(wù)器地址發(fā)送請求,并在URL中帶上參數(shù),獲取Access Token。最后,服務(wù)器以JSON格式返回Access Token值以及有效期。
實現(xiàn)動態(tài)人數(shù)統(tǒng)計與跟蹤,要先將本地視頻流做抽幀處理,要求幀率大于2幀/秒,然后,上傳到百度AI平臺。經(jīng)后臺引擎做圖像處理與識別后,返回每個人體框的坐標(biāo)及編號信息,并且可根據(jù)連續(xù)多幀圖像信息,形成運(yùn)動軌跡,從而進(jìn)一步判定指定區(qū)域內(nèi)人員流動情況。作為普通用戶,只需要從視頻流中抽取多幀圖像,百度平臺通過AI算法完成對每幀靜態(tài)圖像的識別與處理,將結(jié)果返回給用戶,多幀連續(xù)處理后,達(dá)到人流量的動態(tài)監(jiān)測的目標(biāo)。
在連接百度平臺時,請求參數(shù)中包含抽幀后的圖像(image)、監(jiān)測區(qū)域(area)等信息。其中,圖像要求進(jìn)行base64編碼后再通過URL編碼加入到http請求中。在C#中實現(xiàn)base64編碼,只需通過FileStream對象讀取圖像,然后以字節(jié)數(shù)組形式逐個轉(zhuǎn)換為base64字符串。處理函數(shù)如下:
public static String getFileBase64 (String file Name)
{
FileStream filestream=new FileStream(fileName, FileMode.Open);
byte[] arr = new byte[filestream.Length];
filestream.Read(arr, 0, (int)filestream.Length);
string baser64 = Convert.ToBase64String(arr);
filestream.Close();
return baser64;
}
在視頻畫面中,有一個監(jiān)測區(qū)域(area)的概念。area是需要上傳的參數(shù)之一,要求按順序依次給出每個頂點(diǎn)的x、y坐標(biāo),形成閉合多邊形區(qū)域。這個多邊形區(qū)域就是監(jiān)測區(qū)域,統(tǒng)計進(jìn)出人流數(shù)量,是以人像是否穿越該區(qū)域為判斷標(biāo)準(zhǔn)。
了解這些上傳參數(shù)的構(gòu)成后,接下來,只需要按照百度AI平臺要求的數(shù)據(jù)格式,發(fā)送請求。采用C#發(fā)送數(shù)據(jù)請求的流程如下;
(1)用HttpWebRequest類實例化一個對象request;
(2)設(shè)置request對象的Method和KeepAlive等屬性;
(3)將圖像、監(jiān)測區(qū)域等參數(shù)寫入buffer數(shù)組;
(4)調(diào)用GetRequestStream()方法獲取用于寫入請求數(shù)據(jù)的 Stream 實例;
(5)將buffer數(shù)組寫入request對象中;
(6)調(diào)用GetResponse()方法獲取響應(yīng)對象response;
(7)通過StreamReader讀取響應(yīng)結(jié)果。
實現(xiàn)人流量的動態(tài)監(jiān)測,需要獲取實時的視頻流數(shù)據(jù),通常的手段是連接本地攝像機(jī)或者網(wǎng)絡(luò)攝像機(jī)獲取數(shù)據(jù),同時,要將視頻顯示到用戶窗體界面中。
本地攝像頭視頻流的獲取,可使用AForge庫中的FilterInfoCollection類實例化對象,輸入?yún)?shù)是FilterCategory類的靜態(tài)屬性VideoInputDevice,其可捕獲與本機(jī)相連的所有視頻輸入設(shè)備。獲取視頻流后再和VideoSourcePlayer綁定實現(xiàn)視頻流實時顯示。其中,AForge庫是一個基于C#設(shè)計的程序框架,它包含機(jī)器視覺與圖像處理以及人工智能等類庫模塊,直接調(diào)用這些庫,可大大提供程序開發(fā)效率。
網(wǎng)絡(luò)攝像機(jī)視頻流的獲取,通過AForge庫中的MJPEGStream類實例化對象后,綁定到VideoSourcePlayer對象上。其關(guān)鍵是作為參數(shù)傳入的URL地址要根據(jù)攝像機(jī)的要求,添加用戶名和密碼信息。URL地址形式為:“http://192.168. 1.35:81/videostream.cgi?user=admin&pwd=888888&.mjpg”。
該地址由IP地址、端口號、用戶名和密碼四部分拼接而成。
在客戶端窗體中監(jiān)視視頻的顯示采用AForge庫的VideoSourcePlayer控件,使用該控件時,操作步驟如下:
(1)實例化對象,并指定VideoSource 屬性,表明視頻流的來源,其類型為IVideoSource;
(2)注冊NewFame事件,每當(dāng)有新的一幀數(shù)據(jù)到來時,觸發(fā)該事件,便于抽幀后做圖形處理;
(3)處理完成后,從時間委托中取消NewFrame,停止視頻采集。
無論是使用本地攝像機(jī)還是網(wǎng)絡(luò)攝像機(jī),客戶端主要完成視頻數(shù)據(jù)采集、顯示、與百度平臺交互數(shù)據(jù),響應(yīng)用戶操作請求幾項工作。那么,主程序的工作流程如下:(1)連接攝像機(jī),判斷視頻數(shù)據(jù)流返回是否成功;(2)如果連接不成功,則提示用戶檢查設(shè)備或網(wǎng)絡(luò);(3)如果連接設(shè)備成功,則綁定視頻流數(shù)據(jù)到VidSoucePlayer對象,用于在界面上顯示視頻以及后續(xù)的數(shù)據(jù)處理結(jié)果;(4)連接百度AI平臺,完成鑒權(quán)操作;(5)如果鑒權(quán)不成功,則拋出異常,其中可能是網(wǎng)絡(luò)故障或者API Key、Secret Key錯誤,在用戶界面給出相應(yīng)提示;(6)鑒權(quán)成功,則啟動用于控制抽幀頻率的定時器。其中,定時時間間隔的設(shè)置應(yīng)比理論計算值略小,系統(tǒng)要求幀率至少2幀/秒,理論時長為500ms,考慮實際的程序響應(yīng)耗時,可將該值設(shè)置為400ms;(7)后續(xù)工作在系統(tǒng)事件響應(yīng)程序中完成。主程序流程圖如圖1所示。
系統(tǒng)事件響應(yīng)程序主要包含由視頻顯示(VideoSoucePlayer)對象產(chǎn)生的3個事件。一是繪圖(Paint)事件。在該事件中,根據(jù)識別到的人體坐標(biāo)位置,繪制跟蹤框到視頻窗口中,同時,將統(tǒng)計的人流量結(jié)果數(shù)據(jù)繪制到視頻中;二是新幀(NewFrame)事件。視頻中每來一個新的幀數(shù)據(jù),則觸發(fā)該事件,在其中要判斷定時時間是否到,如果定時時間到,則抽取當(dāng)前幀的數(shù)據(jù),將其上傳到百度AI平臺處理,并獲取返回的結(jié)果;三是視頻窗口中的鼠標(biāo)單擊(MouseClick)事件。該事件提供給用戶在視頻中通過鼠標(biāo)繪制一個多邊形,
圖1 主程序流程圖
實現(xiàn)自定義監(jiān)測區(qū)域。這三個事件的結(jié)構(gòu)如圖2所示。在系統(tǒng)設(shè)計上,考慮到程序包含有用于與客戶交互的應(yīng)用界面、視頻流數(shù)據(jù)獲取、網(wǎng)絡(luò)數(shù)據(jù)交換等幾項操作。所以,要將不同任務(wù)交給不同線程處理,保證程序運(yùn)行流暢。在響應(yīng)NewFrame事件的處理函數(shù)中,采用定時器每隔400ms抽取一幀圖像來處理,并用線程池ThreadPool創(chuàng)建新的線程完成網(wǎng)絡(luò)數(shù)據(jù)交換工作。
圖2 VideoSoucePlayer對象事件
另外,由百度AI平臺處理后的結(jié)果數(shù)據(jù),作為全局變量存儲,多個事件處理函數(shù)可訪問該數(shù)據(jù),返回的結(jié)果形式為JSON格式的字符串。例如:
{" person_num": 1,
" person_Info ": [{"ID": 58,
"location": {
"width": 160,
"top": 255,
"height": 137,
"left": 300}
}],
"person_count": {"in": 0, "out": 0},
"log_id": 2944060039282210706
}
表示當(dāng)前幀監(jiān)控畫面中有1個人,人體框左上角頂點(diǎn)坐標(biāo)位置在(300,255),寬度160 ,高度137,當(dāng)前幀進(jìn)入?yún)^(qū)域的瞬時人數(shù)為0,當(dāng)前幀離開區(qū)域的瞬時人數(shù)也為0,人體的ID編號為58,幀編號為2944060039282210706。特別注意,返回的進(jìn)出區(qū)域人數(shù)是當(dāng)前幀的瞬時結(jié)果,然而,實際工程中往往需要累計一段時間內(nèi),總的進(jìn)出區(qū)域人數(shù)。實現(xiàn)該功能,只需要在獲取平臺的JSON數(shù)據(jù)后,判斷當(dāng)前幀編號與上次是否發(fā)生變化,如果幀編號發(fā)生改變,則將該幀對應(yīng)的進(jìn)出人數(shù)分別累加到統(tǒng)計的總數(shù)中。
百度AI平臺返回結(jié)果,雖然可以包含跟蹤框渲染后的圖片信息,但直接獲取該結(jié)果,會大大增加網(wǎng)絡(luò)數(shù)據(jù)量,影響系統(tǒng)的整體性能。因此,通常只要求返回人體框的坐標(biāo)和ID信息,然后,在客戶端自己繪制跟蹤框。該功能是在VideoSourcePlayer的Paint事件處理函數(shù)中完成。從全局變量result中取得坐標(biāo)信息,采用繪制多邊形函數(shù)DrawPolygon實時繪制跟蹤框,同時,將進(jìn)出區(qū)域人數(shù)信息繪制到視頻顯示窗體左上角。
客戶端測試界面如圖3所示。左邊區(qū)域是當(dāng)前攝像機(jī)的監(jiān)控畫面,右邊文本框是實時返回的檢測結(jié)果數(shù)據(jù)。根據(jù)用戶需要,提供了連接本地攝像機(jī)或者網(wǎng)絡(luò)攝像機(jī)的選擇。為了方便調(diào)試,讓用戶能實時觀察人體進(jìn)出區(qū)域時的運(yùn)動軌跡,給人體框添加了聚類點(diǎn),當(dāng)聚類點(diǎn)跨過設(shè)定的檢測邊框時,統(tǒng)計的進(jìn)出人體數(shù)量會有相應(yīng)變化。
圖3 客戶端監(jiān)測界面
實驗1:測試人體檢測效果。首先,連接本地USB攝像頭,分辨率640*480,焦距4mm,置于水平角度,對戴口罩的人體正面,背面,側(cè)面3種姿態(tài),經(jīng)多次測試,都能正確檢測。然后,連接網(wǎng)絡(luò)攝像機(jī),分辨率640*480,焦距3.6mm,置于2.8米高度,俯視視角,多測測試,證明同樣能準(zhǔn)確檢測出人體目標(biāo)。其中的一組測試截圖如圖4所示。該實驗說明百度AI平臺人體檢測算法的是通過頭、肩等特征實現(xiàn),具有較好的適應(yīng)性。
圖4 測試人體檢測效果
實驗2:采用實驗1的網(wǎng)絡(luò)攝像頭做動態(tài)監(jiān)測,將監(jiān)控畫面的下半部分指定為監(jiān)測區(qū)域,測試結(jié)果如表1所示。漏檢的主要原因是受網(wǎng)絡(luò)速度影響,導(dǎo)致與百度平臺交互數(shù)據(jù)的過程中,部分幀數(shù)據(jù)延遲,人體穿越監(jiān)測區(qū)域時,沒有形成完整的軌跡。針對這一個問題,有兩種方法改善。一是,在客戶端, 對每幀數(shù)據(jù)的人體框做聚類后,自主開發(fā)軌跡形成和判斷進(jìn)出區(qū)域的算法,只將人體識別算法交給百度AI平臺完成;二是,不使用網(wǎng)絡(luò)在線訪問的方式,而采用百度正在測試的離線SDK開發(fā)包;
表1 動態(tài)監(jiān)測結(jié)果
基于百度AI平臺提供的API接口,采用C#語言開發(fā)人流量監(jiān)測的客戶端程序,是一種實現(xiàn)人流量監(jiān)測統(tǒng)計的高效方案。介紹了采用AForge庫連接攝像機(jī)的方法,以及通過Access Token認(rèn)證后, 與百度平臺交換數(shù)據(jù)的方法。為了保證視頻流暢播放和數(shù)據(jù)交互同步完成,處理好各種系統(tǒng)事件的響應(yīng),采用多線程方式優(yōu)化了程序結(jié)構(gòu)。實驗結(jié)果表明這種開發(fā)方式既能快速實現(xiàn)人流量監(jiān)測功能,又有較高的準(zhǔn)確性。人流量統(tǒng)計準(zhǔn)確率達(dá)97.5%,并且還可通過2種手段進(jìn)一步優(yōu)化提高。另外,采用API方式實現(xiàn)人流量監(jiān)測,也為算法研究者提供了基礎(chǔ),使其能快速掌握項目的業(yè)務(wù)邏輯,也為算法優(yōu)化提供了一個對比的基準(zhǔn)。
[1]楊帆.基于人流量檢測的改進(jìn)CN算法[J]. 計算機(jī)工程與設(shè)計,2020,41(02):411-416.
[2]殷濤,崔佳冬. 視頻監(jiān)控行人流量統(tǒng)計系統(tǒng)的設(shè)計[J].電子科技,2019,32(12):48-52.
[3]Chen L,Lu Y,Sheng Q, et al. Estimating Pedestrian Volume Using Street View Images: a Large-scale Validation Test[J]. Computers, Environment and Urban Systems,2020, 81.
[4]王存娥,楊延寧,任新成,等. 室內(nèi)人流量 監(jiān)測系統(tǒng)設(shè)計[J].自動化儀表, 2018,39(09):49-51.
[5]李佐龍,王幫海,盧增.多尺度特征融合重建的行人檢測方法[J].計算機(jī)工程與應(yīng)用,2020(5):14.
[6]李歡,陳先橋,施輝,等. 基于SSD的行人頭部檢測方法[J].計算機(jī)工程與設(shè)計, 2020,41(03): 827-832.
[7]曹帥,張曉偉,馬健偉.基于跨尺度特征聚合網(wǎng)絡(luò)的多尺度行人檢測[J].北京航空航天大學(xué)學(xué)報,2020(5):69.
[8]百度AI開放平臺.人流量統(tǒng)計動態(tài)版[EB/OL].2019-11-25https://ai.baidu.com/ai-doc/ BODY/wk3cpyyog.
TP391.41
A
1672-1047(2020)06-0143-04
10.3969/j.issn.1672-1047.2020.06.38
2020-10-23
冉涌,男,碩士,講師。研究方向:無線傳感器網(wǎng)絡(luò)、智能信號處理。
[責(zé)任編輯:羅幼平]