高熊 孫先松
摘要:為了實現對某一地點的實時監控,并對相關人員進行人臉識別,以滿足特定場合的工作需求,該文對實時圖像的采集和人臉識別做了相應的研究。該研究的硬件系統采用JZ2440開發板作為嵌入式硬件開發平臺,將USB攝像頭采集到的圖像數據通過UDP網絡傳輸協議傳輸給在Ubuntu上搭建的服務器,以實現實時監控,在檢測到人臉時,服務器便通過百度AI提供的人臉識別SDK進行人臉識別,并將人臉識別結果返回給服務器。該研究實現了圖像的采集,傳輸,解碼,顯示及人臉識別,在局域網內進行了軟件的調試和驗證。
關鍵詞:視頻監控;人工智能;人臉識別;嵌入式系統;網絡編程;arm
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2018)28-0182-03
隨著社會的不斷進步,科學技術的迅猛發展,視頻監控已經出現在社會的各個角落,在短短的幾十年的時間里,視頻技術已經發生了天翻地覆的變化,從早期的模擬監控到數字監控再到如今的遠距離視頻監控,可以通過網絡傳將圖像數據傳輸到世界的各個角落。但這已經不能滿足某些特定工作的場合的需求,如:交通、金融、醫療、小區門禁等場所都提出了人臉識別的要求,要求系統能夠自動檢測到圖像畫面中的人臉,并與圖片庫中的人臉進行對比,得到最有可能的身份信息。如今自動人臉識別因為其高可接受性受到社會各個部門的青睞,所以此研究的實用價值較高。
1 系統組成介紹
此系統的組成方式如圖1所示。此設計主要由三個部分組成,分別為圖像數據采集端、本地Linux服務器和百度AI服務器。各個部分的詳細分析如下:
1)圖像數據采集端是一個JZ2440開發板,該開發板的主控芯片是S3C2440,是一款由Samsung半導體公司推出的高性能、低功耗、高集成度并具有工業級溫度范圍和性能的微處理器,該芯片的主頻高達533MHZ,具有較低的內核電壓。此芯片運行速度較快,功耗較低,非常適合此系統設計。攝像頭采用的是UVC攝像頭,該攝像頭輸出是jepg格式的圖片幀對攝像頭的初始化后,開發板就不斷地采集圖像數據,并將采集的圖片數據通過UDP網絡傳輸給本地Linux服務器,同時將采集到的jpeg格式的圖片幀通過libjpeg解碼成RGB565的圖片數據顯示在LCD上。并在進行了人臉識別之后,將人臉識別的結果顯示在LCD上。
2)本地Linux服務器是搭建在Ubuntu16.04上,使用Qt5.5搭建。Qt的良好封裝機制使得Qt的模塊化程度非常高,可重用性較好,對于用戶開發來說是非常方便的,可以快速地搭建起服務器。并且,Qt使用第三方開源庫非常方便,能夠輕松的加入OpenCV庫和使用百度AI的人臉識別的SDK需要的第三方庫:lcurl、lcrypto、ljsoncpp。
此部分主要負責接收開發板傳輸過來的jpeg格式的圖像數據,并通過OpenCV視覺庫將jpeg格式的圖片解碼成RGB888格式的數據并顯示出來。當OpenCV檢測到圖像中有人臉之后便將當前的圖片幀傳給百度AI服務器,百度AI然后將人臉識別的結果返回給本地Linux服務器并顯示,本地Linux服務器同時將人臉識別的結果通過tcp/ip協議傳送給開發板。
3)百度AI提供了一套開放的人臉識別的算法,并提供了SDK,方便開發人員開發。開發人員首先在百度AI創建一個應用,百度AI會提供一個API Key和Secret Key關聯此應用。在進行人臉識別之前首先往這個應用上傳一組人臉庫,在進行人臉識別時便將采集到的人臉和人臉庫中的人臉對比,返回相似度最高的人臉,可以通過返回值中的“scores”來判斷是否為一個人,此值得變化范圍為0到100。
2 系統軟件設計
此系統的軟件設計主要包括兩個部分的軟件設計:數據采集端的軟件設計和本地Linux服務器端的軟件設計。為了實現人機交互界面數據采集端和本地Linux服務器端的軟件設計都是基于Qt編寫的。
2.1 數據采集端的軟件設計
數據采集端的軟件流程如圖2所示,開發板上電后首先便是啟動嵌入式Linux系統,為了能使UVC攝像頭能夠正常運行我們要將UVC驅動編譯進內核,內核版本選用的是linux-3.4.2。為了能夠解碼jpeg格式的圖像數據,我們事先需要交叉編譯libjpeg并移植到開發板上,libjpeg的版本是libjpeg-turbo-1.2.1,交叉編譯工具的版本為arm-linux-gcc4.4.3,移植到開發板的Qt版本為qt-everywhere-opensource-src-5.6.0。
程序執行后,首先便進行了UDP發送端和TCP/IP客戶端的設置,UDP用來發送圖像數據,TCP/IP用來接收本地Linux服務器傳來的人臉識別的結果信息。UDP不提供可靠性的傳輸,但它傳輸速度很快,對于圖像的傳輸來說,傳輸數據量大,對于可靠性要求不嚴,所以我們選用UDP來傳送圖像數據。TCP/IP提供的是可靠的數據傳輸,對于識別結果來說,我們需要其傳輸可靠,所以我們選用TCP/IP傳輸結果信息。
接下來是對攝像頭的初始化工作,為了能減小圖像傳輸占用的帶寬,我們設置攝像頭的輸出的圖片幀大小為320*240,但開發板的LCD大小為270*272,所以還需要將采集大的圖片進行放大處理以實現LCD的全屏顯示,該設計采用的圖像縮放算法為近鄰取樣插值法。
最后便是對圖像的采集、傳輸、解碼、顯示。對于采集到的每一幀圖片,先通過UDP傳輸給本地Linux服務器,然后對這幀圖片進行解碼并顯示在開發板的LCD上。使用開源庫libjpeg對圖片幀進行解碼,需要注意的是,對于從內存中讀取jpeg圖片數據和從文件中讀取jpeg圖片數據使用的是libjpeg庫里兩個不同的函數,分別為jpeg_mem_src()和jpeg_stdio_src(),在此設計中,直接使用的是內存中的數據,所以使用jpeg_mem_src()對圖片進行解碼。
當開發板接收到本地Linux服務器發送的人臉識別的結果時,便暫停在LCD上顯示攝像頭采集的數據,將接收到的結果顯示在LCD上,顯示結果5秒鐘之后便繼續顯示攝像頭采集到的數據。
2.2 本地Linux服務器軟件設計
本地Linux服務器端的軟件流程如圖3所示,此設計中服務器端的軟件需要用到opencv庫和百度AI提供的人臉識別的c++的SDK,而SDK又需要用到另外三個開源庫lcurl、lcrypto、ljsoncpp,所以我們在Linux平臺上安裝好這四個庫,其版本分別為opencv-3.2.0、curl_7.47.0-1ubuntu2.5、OpenSSL_1.0.2g-1ubuntu4.10、jsoncpp-1.6.5。
程序運行時,首先便設置了UDP接收端和TCP/IP服務器端,分別負責接收圖像數據和發送人臉識別的結果。
接下來便是接收來著開發板的圖片幀數據,通過opencv來對jpeg格式的圖片幀進行解碼,解碼成RGB888格式的數據,然后顯示在Qt的QLbale控件上,對于直接從內存中獲得圖片數據,在該設計中使用的是imdecode()函數。
在本程序中有兩種人臉識別的模式,分別是手動操作和自動檢測。程序運行時,Linux服務器端顯示的是某處的實時監控,如果運行在手動模式,當需要進行人臉識別時,由操作者手動操作,調用百度AI人臉識別的SDK來進行人臉識別;當運行在自動模式時,通過opencv來檢測畫面中是否有人臉,如果發現人臉,則自動調用SDK來進行人臉識別,在本設計中使用的是Haar特征分類器來檢測畫面中是否含有人臉,在opencv3中此特征分類器已經被訓練好,可以方便的使用它。為了節約系統資源,提高軟件運行效率,運行在自動模式時并不是對每一幀圖片進行人臉檢測,在此設計中是隔2秒檢測一下圖像中是否含有人臉。
當操作者發現圖像中有人臉或者是opencv檢測到圖片中有人臉掉用了SDK后,本地Linux服務器會接收來自百度AI服務器返回來的消息并顯示出來,同時也會將檢測見過通過TCP/IP協議發送給開發板,供其顯示。
除此主要功能外,服務器端還有對圖像的拍照、錄像功能,對百度AI的人臉庫有增加、刪除、查詢等功能。在百度AI服務端,人臉庫是由“組”組成,“組”又是由各個“人臉”組成,“人臉”又包含“uid”和“user_info”兩個信息。在同一“組”中,是允許兩個同樣“uid”的“人臉”存在的,為了方便的管理人臉庫中的人員信息,防止此種情況的發生,在此設計中將人臉庫的人員信息同樣儲存了一份在本地數據庫中,當要添加人臉庫中的人員時首先查詢本地數據庫是否還有此“uid”,若有,則拒絕添加,同樣,當刪除某一個人員時,若本地數據庫中沒有此“uid”時則拒絕刪除,這里使用的數據庫為sqlite3。
3 結果測試
3.1 當沒有進行人臉識別時,采集端和Linux服務器的顯示
采集端顯示如圖4所示:
本地Linux服務器端的顯示如圖5所示:
在此情況下采集端和本地Linux服務器顯示的是監控處的實時畫面。
3.2 當采集到人臉并進行了人臉識別的顯示如下所示
采集端的顯示如圖6所示:
調用百度AI人臉識別的SDK之后,百度AI會返回人臉庫中與識別人臉相似度最高的人臉信息。在結果中,“log_id”表示每次識別的日志id,每次識別的“log_id”都不一樣;“faceliveness”活體分數,主要用于判斷是否為二次翻拍,限制用戶用翻拍照片來進行識別,百度AI提供的參考閾值為0.393241,當“faceliveness”的值大于此閾值時,則表明檢測到的是活體;“group_id”表示返回的人臉儲存在百度AI人臉庫的哪個組中,在該設計中,將人臉都儲存在組名為“group_1”的組中;“scores”表示返回的人臉和被檢測的人臉的相似程度,此結果的變化范圍為0到100,在實際使用時,到分數高于85時則可判斷為同一個人;“uid”和“user_info”則分別表示,在進行人臉注冊時所填寫的人員id和人員信息。
4 結論與展望
本文主要研究了圖像的傳輸和百度AI人臉識別的相關技術,基本實現了視頻監控和人臉識別的相關功能。但也有不足之處,jpeg格式的圖片數據與rgb格式的圖片數據相比雖然占用更少的空間,不斷傳輸jpeg格式的圖片幀來實現視頻監控依然占用了較大的網絡帶寬,在今后的研究中可以將圖片幀編碼成H.264格式來傳輸視頻流,則會使系統占用更少的帶寬和更加的穩定可靠。
參考文獻:
[1] 余金遙.基于GPRS的圖像數據無線傳輸系統研究[J].電腦知識與技術,2017,13(28):201-203.
[2] 王寶珠,程杰.基于ARM11的視頻監控系統的設計[J].電子與設計工程,2013(3).
[3] 塔娜.基于ARM的人臉識別系統設計與實現[D].長春:東北師范大學,2009.
[4] 劉恒洋,王森.基于ARM的視頻監控系統的設計與實現[J].微計算機信息,2007,23(7).
[5] (美)理查德·史蒂文斯,(美)拉戈.UNIX環境高級編程[M].北京:人民郵電出版社,2015.
[6] 楊樹青,王歡.Linux環境下C編程指南[M].北京:清華大學出版社,2008.
[7] (美)福達.SQL必知必會[M].北京:人民郵電出版社,2013.
[8] 霍亞飛.Qt Creator快速入門[M].北京:北京航空航天大學出版社,2016.
【通聯編輯:唐一東】