梁建勇
(安康學(xué)院電子與信息工程學(xué)院,陜西安康 725000)
隨著監(jiān)控技術(shù)的發(fā)展,當(dāng)前已經(jīng)進(jìn)入網(wǎng)絡(luò)監(jiān)視時(shí)代,并且向高清、智能等方向不斷進(jìn)步。隨著建設(shè)國(guó)家平安城市和科技強(qiáng)警示范城市,智能視頻監(jiān)測(cè)作為首要項(xiàng)目,對(duì)建設(shè)工程做出了重大貢獻(xiàn)。通過(guò)將遍布城市的監(jiān)控點(diǎn)進(jìn)行聯(lián)網(wǎng),充分地優(yōu)化了設(shè)備資源,真正實(shí)現(xiàn)了高效監(jiān)控。
隨著城市化進(jìn)程及經(jīng)濟(jì)的不斷發(fā)展,各大城市內(nèi)的人員集群的時(shí)間、場(chǎng)次越來(lái)越多,聚集人數(shù)也明顯地上升。這一特點(diǎn),對(duì)公共安全造成了一定的威脅。近年來(lái),由于人員過(guò)度密集造成的踩踏等安全事故多有發(fā)生。自新冠疫情爆發(fā)以來(lái),更是對(duì)人員過(guò)度聚集情況提高了關(guān)注,成為了公共衛(wèi)生的焦點(diǎn)問(wèn)題。人員密集度的檢測(cè)已成為安全監(jiān)測(cè)方面的一個(gè)重要部分。然而,現(xiàn)有的攝像頭監(jiān)控技術(shù)往往只具有錄像回放功能,而無(wú)法進(jìn)行深入的數(shù)據(jù)挖掘和信息處理,傳統(tǒng)的人員密集度監(jiān)控大多是人工完成的,既浪費(fèi)人力財(cái)力,又不夠客觀快速。而基于計(jì)算機(jī)視覺(jué)的智能視頻分析,在處理精度和速度上優(yōu)勢(shì)明顯,因此越來(lái)越受到研究者的重視[1-4]。
深度學(xué)習(xí)在人群檢測(cè)領(lǐng)域有一定應(yīng)用成果。Girshick 提出的R-CNN(Regions with CNN Features)奠定了目標(biāo)檢測(cè)網(wǎng)絡(luò)的基礎(chǔ)。Ren 等提出基于候選區(qū)域生成網(wǎng)絡(luò)的實(shí)時(shí)檢測(cè)算法,以Faster R-CNN 完成端到端檢測(cè)。在2016 年,Joseph Redmon 用單一卷積網(wǎng)絡(luò)YOLO(You Only Look Once)實(shí)現(xiàn)候選區(qū)域的目標(biāo)分類和位置回歸,提高檢測(cè)速度,簡(jiǎn)化檢測(cè)過(guò)程[5];之后,Joseph Redmon 針對(duì)YOLO 網(wǎng)絡(luò)模型進(jìn)行改進(jìn)得到Y(jié)OLOv2[6],引入了先驗(yàn)框概念,檢測(cè)精度得到提升;2018 年Joseph Redmon 提出網(wǎng)絡(luò)模型YOLOv3[7],實(shí)現(xiàn)多尺度預(yù)測(cè),很好地平衡了檢測(cè)精度與速度。隨著網(wǎng)絡(luò)攝像頭的廣泛布設(shè),基于視頻識(shí)別的人員密集度檢測(cè)引起了眾多研究者的興趣,由于存在場(chǎng)景復(fù)雜、人員遮擋等問(wèn)題,仍需進(jìn)一步完善技術(shù)方案[8-10]。文中使用精度與速度兼顧的YOLOv3算法,進(jìn)行人員密集度的檢測(cè)系統(tǒng)設(shè)計(jì),實(shí)驗(yàn)結(jié)果表明系統(tǒng)能夠完成對(duì)人員密集度的有效識(shí)別與判斷。
人員密集度檢測(cè)系統(tǒng)主要運(yùn)用攝像頭對(duì)監(jiān)控場(chǎng)景進(jìn)行視頻捕獲,通過(guò)一系列的圖像運(yùn)算來(lái)判斷區(qū)域內(nèi)密集度。其功能要求有以下幾個(gè)方面:
1)只檢測(cè)目標(biāo)區(qū)域內(nèi)的人員狀況,對(duì)目標(biāo)區(qū)域外的人員不加以反映;
2)對(duì)人員的檢測(cè)要保證實(shí)時(shí)性,在攝像頭開(kāi)啟之后,要根據(jù)攝像頭所展示出來(lái)的視頻實(shí)現(xiàn)動(dòng)態(tài)的實(shí)時(shí)檢測(cè);
3)保存功能:對(duì)檢測(cè)的結(jié)果可以做到截圖保存,圖像信息以jpg 格式保存在本地,方便管理人員對(duì)所需信息進(jìn)行后續(xù)查詢和研究分析;
4)運(yùn)行顯示功能:根據(jù)攝像頭的檢測(cè)畫(huà)面,系統(tǒng)在處理之后要以文字顯示方式表示出運(yùn)行結(jié)果,方便管理人員及時(shí)判斷。
系統(tǒng)通過(guò)所獲取的視頻,完成視頻內(nèi)人員的實(shí)時(shí)檢測(cè)、人數(shù)顯示、密集度判斷。根據(jù)事先確定的閾值,對(duì)所檢測(cè)區(qū)域內(nèi)的視頻進(jìn)行自動(dòng)截圖保存,完成敏感事件或重要事件的信息保留,這對(duì)特定事件的查詢與研究分析有重要的現(xiàn)實(shí)意義。自動(dòng)監(jiān)測(cè)的實(shí)時(shí)性和準(zhǔn)確性得以明顯提高,大大減少了無(wú)端聚集事件的發(fā)生。
系統(tǒng)工作流程如圖1 所示,首先需要打開(kāi)攝像頭或者本地圖片,讓系統(tǒng)完成信息的采集,然后對(duì)所得到的信息進(jìn)行預(yù)處理,根據(jù)特定的檢測(cè)要求,完成人數(shù)的統(tǒng)計(jì)以及密集度判斷,與所設(shè)定閾值進(jìn)行比較,依據(jù)比較結(jié)果作出是否超限的判斷,從而在運(yùn)行畫(huà)面中顯示不同的輸出情況。
圖1 系統(tǒng)工作流程
文中側(cè)重于特定區(qū)域內(nèi)人員分布情況的檢測(cè),故圖像的獲取環(huán)節(jié)顯得尤為重要。無(wú)論是靜態(tài)圖片,還是動(dòng)態(tài)的攝像頭捕捉到的畫(huà)面都需計(jì)算機(jī)進(jìn)行識(shí)別。因此前期要做好圖片的調(diào)用和視頻的導(dǎo)入等必要的準(zhǔn)備工作,方便完成后續(xù)環(huán)節(jié)。
該文所實(shí)現(xiàn)的功能以動(dòng)態(tài)實(shí)時(shí)監(jiān)測(cè)為主,靜態(tài)分析為輔。動(dòng)態(tài)檢測(cè)用于對(duì)各種人員密集場(chǎng)合的實(shí)時(shí)情況進(jìn)行監(jiān)測(cè)與把控,以避免事故發(fā)生,保障人身安全。靜態(tài)分析則主要作為后期調(diào)查事故原因或改進(jìn)人員把控措施,提高相關(guān)場(chǎng)合安全水平的參考憑證。動(dòng)態(tài)檢測(cè)與靜態(tài)分析相結(jié)合是一種更為科學(xué)、高效的人員密集度檢測(cè)手段。
1)靜態(tài)圖片的采集
該文運(yùn)用OpenCV 中的cv2 模塊進(jìn)行圖片的讀取識(shí)別,所獲取的圖片保存在本地文件夾image 下。程序段如下:
該程序段沒(méi)有利用圖片的絕對(duì)地址來(lái)讀取某一張圖片,而是直接打開(kāi)圖片所在的文件夾,這樣可以任意選取文件夾中的圖片進(jìn)行訪問(wèn),從而避免了每打開(kāi)一張新圖片就要修改一次絕對(duì)地址的操作,大大提高了程序的執(zhí)行效率及用戶體驗(yàn)。
2)動(dòng)態(tài)視頻的采集
該文使用OpenCV 調(diào)用電腦自帶的攝像頭來(lái)進(jìn)行動(dòng)態(tài)視頻流的獲取。視頻的獲取路徑可以通過(guò)程序中攝像頭的地址(0 或1)來(lái)判斷使用的是本機(jī)自帶的攝像頭還是外接攝像頭。程序段如下:
其中,self.cap=cv2.VideoCapture()是使用OpenCV庫(kù)來(lái)打開(kāi)視頻或者攝像頭時(shí)的接口函數(shù),而self.CAM_NUM=0 就是打開(kāi)指定的攝像頭。
在獲取到需要處理的圖像后,要進(jìn)行預(yù)處理,該文主要是進(jìn)行歸一化處理以及將圖像轉(zhuǎn)為數(shù)組[11-13]。將得到的圖像使用new_image_size 函數(shù)調(diào)整到合適的大小后轉(zhuǎn)化為array 數(shù)組格式。array 數(shù)組類型就是把相同類型的元素組合在一起的數(shù)據(jù),作用是在搜索時(shí)對(duì)于每一個(gè)元素都可以執(zhí)行單獨(dú)的查詢。然后使用image_data=np.expand_dims 函數(shù)數(shù)組擴(kuò)充成指定輸入格式的數(shù)組。
1)YOLOv3 目標(biāo)檢測(cè)
文中進(jìn)行的人員檢測(cè),需要讓機(jī)器識(shí)別人這一特定類,需要對(duì)機(jī)器進(jìn)行訓(xùn)練,讓其進(jìn)行深度學(xué)習(xí)。在一次次的訓(xùn)練中不斷完善,訓(xùn)練出自己的模型后,便能夠準(zhǔn)確地檢測(cè)和識(shí)別人體[14-16]。
目標(biāo)檢測(cè)就是要找出圖片中物體的bounding box(邊界框),并判定框內(nèi)物體的類別。如果圖中有更多的物體,需要全部框出來(lái),此時(shí)不僅要輸出某個(gè)物體的預(yù)測(cè),還要輸出其他物體的預(yù)測(cè)。此時(shí)模型的輸出維度無(wú)法固定,圖片中存在的物體越多,模型輸出的維度就越大。故需要設(shè)計(jì)一個(gè)固定維度大小的輸出,并且輸出的維度足夠大,足以囊括圖像中的所有物體。這種情況可利用YOLOv3 把模型的輸出劃分成網(wǎng)格形狀,每個(gè)網(wǎng)格中的cell(格子)都可以輸出物體的類別和bounding box 的坐標(biāo)。接下來(lái)通過(guò)設(shè)置模型的訓(xùn)練目標(biāo)來(lái)選擇預(yù)測(cè)的物體,具體操作方式為:將輸入圖像按照模型的輸出網(wǎng)格(比如7×7 大小)進(jìn)行劃分,劃分后生成許多cell,觀察圖片中物體的中心落在哪一個(gè)cell中。落在哪一個(gè)cell,就由這個(gè)cell預(yù)測(cè)物體。如圖2所示,狗的中心位于虛線cell 內(nèi),則這個(gè)cell 負(fù)責(zé)預(yù)測(cè)狗。
圖2 網(wǎng)格輸出
預(yù)測(cè)過(guò)程分訓(xùn)練和測(cè)試兩個(gè)階段。
訓(xùn)練階段:該階段如果物體中心落在某個(gè)cell,就給該cell 打上此物體的label(包括xywh 和類別)。通過(guò)這種方式來(lái)設(shè)置訓(xùn)練的label,從而達(dá)到教會(huì)cell預(yù)測(cè)圖像中哪個(gè)物體的目的。
測(cè)試階段:由于在訓(xùn)練階段已經(jīng)教會(huì)了cell 去預(yù)測(cè)中心落在該cell 中的物體,cell 便會(huì)以訓(xùn)練時(shí)的方式進(jìn)行操作。
2)目標(biāo)檢測(cè)的實(shí)現(xiàn)
該設(shè)計(jì)對(duì)于人體的訓(xùn)練,使用YOLOv3 目標(biāo)檢測(cè)在TensorFlow 框架下實(shí)現(xiàn)。YOLO 是一個(gè)開(kāi)創(chuàng)性的研究成果,通過(guò)對(duì)圖像劃分多個(gè)網(wǎng)格,并對(duì)網(wǎng)格的物體進(jìn)行預(yù)測(cè),在速度上大大領(lǐng)先其他的物體檢測(cè)算法,如Regional CNN,F(xiàn)aster RCNN 等。
文中所做的目標(biāo)檢測(cè)訓(xùn)練,以GitHub 網(wǎng)站上提供的訓(xùn)練算法為基礎(chǔ)進(jìn)行針對(duì)性訓(xùn)練,結(jié)果如圖3所示,操作流程如下:
圖3 訓(xùn)練結(jié)果測(cè)試
①下載文件包
②安裝依賴項(xiàng)
③將加載的COCO 權(quán)重導(dǎo)出為T(mén)F checkpoint(yolov3.ckpt)和frozen graph(yolov3_gpu_nms.pb)。
④運(yùn)行腳本
⑤區(qū)分訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)
修改dataset.txt 為兩個(gè)文件,train.txt 存放訓(xùn)練數(shù)據(jù),test.txt 存放測(cè)試數(shù)據(jù),Demo 中存放數(shù)據(jù)比例為9∶1,200 個(gè)數(shù)據(jù)中訓(xùn)練數(shù)據(jù)為180,測(cè)試數(shù)據(jù)為20。
⑥讀取并轉(zhuǎn)化YOLOv3 的預(yù)訓(xùn)練weights 文件后進(jìn)行訓(xùn)練。
3)人員數(shù)目檢測(cè)的實(shí)現(xiàn)
人員數(shù)目檢測(cè)實(shí)現(xiàn)程序段如下:
對(duì)于YOLOv3 目標(biāo)檢測(cè),在訓(xùn)練的數(shù)據(jù)集中可以檢測(cè)出80 多種目標(biāo),對(duì)多種目標(biāo)進(jìn)行判斷就可篩選出人體目標(biāo)。首先,人員數(shù)目初始化為0,使用for循環(huán)對(duì)目標(biāo)集合classes 進(jìn)行遍歷,當(dāng)檢測(cè)到目標(biāo)標(biāo)簽不是人時(shí),則退出本次循環(huán),未檢測(cè)到人,人員數(shù)目不變;當(dāng)檢測(cè)到目標(biāo)標(biāo)簽是人時(shí),則人員數(shù)目加1,對(duì)檢測(cè)到的人標(biāo)識(shí)矩形框顯示標(biāo)簽和置信度。人員數(shù)目檢測(cè)的效果如圖4 所示。以上過(guò)程只檢測(cè)人這一特定類別,對(duì)于檢測(cè)環(huán)境中的其余目標(biāo)不加反映。
圖4 人員數(shù)目檢測(cè)效果
該文關(guān)于區(qū)域內(nèi)密集度的檢測(cè),首先檢測(cè)這片區(qū)域內(nèi)的人員數(shù)目,計(jì)算這片區(qū)域內(nèi)的人數(shù)總和,并事先設(shè)定一個(gè)判定人員密集度的閾值,當(dāng)人數(shù)總和大于當(dāng)前設(shè)置的閾值時(shí),則判斷人員密集度為“many people”;否則當(dāng)前人員密集度為“it is ok”。
上述程序段是對(duì)于圖像的一種處理,也是對(duì)該文密集度的一種判定。測(cè)算出所要檢測(cè)圖像的人員數(shù)目,然后再與程序中所設(shè)定的一個(gè)上限閾值作比較,按照比較結(jié)果的不同輸出不同的結(jié)果(“many people”或者”it is ok”)。比較結(jié)果顯示在程序運(yùn)行畫(huà)面中,可以實(shí)時(shí)觀看。靜態(tài)的圖片檢測(cè)出來(lái)的是固定值,而攝像頭的實(shí)時(shí)監(jiān)測(cè)則會(huì)根據(jù)監(jiān)測(cè)區(qū)域的人員變動(dòng),不斷地變化,運(yùn)行界面顯示動(dòng)態(tài)結(jié)果。
實(shí)現(xiàn)功能使用了PyQt,設(shè)計(jì)面向?qū)ο筇峁┝舜翱诮缑鏄?gòu)建集合,完成了識(shí)別人員密集度的驗(yàn)證系統(tǒng)。比起python 自帶的Tkinter 設(shè)計(jì)更方便,運(yùn)行感覺(jué)更好,操作性比較強(qiáng)。如圖5 所示,界面的主要功能有打開(kāi)圖片、打開(kāi)攝像頭、截圖、打開(kāi)視頻。
圖5 界面顯示
設(shè)計(jì)界面共有4 個(gè)功能按鈕:“打開(kāi)圖片”、“打開(kāi)攝像頭”、“截圖”、“打開(kāi)視頻”。
使用getOpenFileName()函數(shù)調(diào)用圖片,連接按鈕函數(shù)實(shí)現(xiàn)點(diǎn)擊按鈕打開(kāi)圖片進(jìn)行人員密集度檢測(cè)。
讀取攝像頭采集視頻并預(yù)處理,然后調(diào)用utils.py程序?qū)z測(cè)的標(biāo)簽類型進(jìn)行判斷,輸出person 類標(biāo)簽個(gè)數(shù),實(shí)現(xiàn)密集度檢測(cè)。
使用getOpenFileName()函數(shù),連接按鈕函數(shù)實(shí)現(xiàn)點(diǎn)擊按鈕打開(kāi)視頻進(jìn)行人員密集度檢測(cè)。
攝像頭打開(kāi)后,系統(tǒng)運(yùn)行畫(huà)面中可顯示出拍攝區(qū)域內(nèi)的人員數(shù)量,以及當(dāng)前狀態(tài)下對(duì)人員密集度的判斷結(jié)果。該設(shè)計(jì)所作的密集度檢測(cè),是根據(jù)預(yù)先設(shè)定的人員檢測(cè)上限閾值,作出是否超限的判斷,從而在運(yùn)行界面上輸出密集度正常與否。
系統(tǒng)檢測(cè)后的結(jié)果會(huì)顯示出人員個(gè)數(shù)和密集度的判定。不同顯示結(jié)果的對(duì)比如圖6 所示。根據(jù)設(shè)定的密集度閾值,攝像頭狀態(tài)下可以判斷出人員密集度分為密集度正常和密集度異常兩種狀態(tài)。
圖6 檢測(cè)結(jié)果對(duì)比
文中對(duì)攝像頭獲取的視頻流進(jìn)行處理與識(shí)別,通過(guò)YOLOv3 算法等圖像處理技術(shù),進(jìn)行分析處理,最后得出人員的密集度情況。當(dāng)視頻中的人數(shù)超過(guò)系統(tǒng)所設(shè)定的閾值時(shí),顯示出不同的標(biāo)識(shí)。經(jīng)實(shí)驗(yàn)驗(yàn)證,可以有效識(shí)別人員聚集情況,具有一定應(yīng)用價(jià)值。