国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于虹軟算法的多人臉目標(biāo)識(shí)別系統(tǒng)實(shí)現(xiàn)

2020-12-28 11:53:14李殊哲丁德紅
電腦知識(shí)與技術(shù) 2020年31期

李殊哲 丁德紅

摘要:為實(shí)現(xiàn)多人臉目標(biāo)的識(shí)別,使用FileWatcher監(jiān)測(cè)文件夾下新生成的圖片,從這些新的圖片中,利用改進(jìn)后的虹軟算法實(shí)現(xiàn)人臉檢測(cè),再提取其人臉特征值,最后與注冊(cè)過(guò)的人臉特征值進(jìn)行對(duì)比。該系統(tǒng)采用.Net Frame框架,簡(jiǎn)化了原demo中對(duì)識(shí)別沒(méi)有幫助的數(shù)據(jù)處理程序,糾正了代碼中導(dǎo)致內(nèi)存泄漏的函數(shù),實(shí)現(xiàn)了多線程并發(fā)的多目標(biāo)識(shí)別。

關(guān)鍵詞:虹軟算法;多人臉目標(biāo);文件監(jiān)控

中圖分類號(hào):TP311.1 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1009-3044(2020)31-0215-04

1 背景

人臉識(shí)別作為一種新興的生物特征識(shí)別技術(shù),依據(jù)人的面部特征對(duì)身份進(jìn)行自動(dòng)鑒別技術(shù)[2]。隨著我國(guó)計(jì)算機(jī)技術(shù)的不斷發(fā)展,我國(guó)在這方面也取得了較好的成就,國(guó)家863項(xiàng)目“面像檢測(cè)與識(shí)別核心技術(shù)”通過(guò)成果鑒定并初步應(yīng)用,就標(biāo)志著我國(guó)在人臉識(shí)別這一當(dāng)今熱點(diǎn)科研領(lǐng)域掌握了一定的核心技術(shù)。

文獻(xiàn)[4]在低像素人臉識(shí)別檢測(cè)的過(guò)程中,首次將單一圖像分辨率重建的SRCNN算法用于提高人臉檢測(cè)率,優(yōu)化改進(jìn)了對(duì)異常值和噪聲的處理,并將MTCNN、S-LBPH以及SRCNN算法結(jié)合應(yīng)用于考勤中取得了較高的考勤率。使用S-LBPH算法克服了傳統(tǒng)LBPH算法不能很好區(qū)分異類間特征的問(wèn)題。文獻(xiàn)[5]中通過(guò)對(duì)視頻圖像多人臉并行檢測(cè)算法和PCA多人臉識(shí)別算法的改進(jìn)大大提高了單幅人臉的檢測(cè)效率,充分利用了視頻圖像幀序列直接的間接信息,在一定條件下提高了人臉識(shí)別的正確率,通過(guò)新建ORL人臉庫(kù)進(jìn)行檢驗(yàn)正確率高達(dá)97.62%。但是,文中也提到該算法雖然在速度方面有明顯的優(yōu)勢(shì),但在處理遠(yuǎn)處人臉或遮擋人臉時(shí)識(shí)別率有待提高。文獻(xiàn)[6]中作者將多人臉識(shí)別應(yīng)用到反恐維穩(wěn)、案件偵破、服務(wù)民生等公共安全領(lǐng)域。并提到在進(jìn)行多人臉識(shí)別算法應(yīng)用平臺(tái)建設(shè)過(guò)程中,我們不僅要注意技術(shù)的創(chuàng)新,也需要將技術(shù)于業(yè)務(wù)有機(jī)結(jié)合才能真正的服務(wù)于社會(huì)。

目前我國(guó)各大企業(yè)都給出了自己的免費(fèi)人臉識(shí)別算法。雖然,各企業(yè)都盡可能地簡(jiǎn)化了他們的算法接口,但由于其本身的復(fù)雜性,大多數(shù)人在使用時(shí)仍然會(huì)遇到大量的問(wèn)題。而且他們的代碼在使用時(shí)也并不完全安全,例如:某些代碼在使用時(shí)會(huì)造成內(nèi)存泄漏、某些對(duì)象不可以多線程調(diào)用。這些問(wèn)題官方在文檔中并沒(méi)有標(biāo)識(shí),如果要開(kāi)發(fā)者自行摸索通常需要很長(zhǎng)時(shí)間。因此,我們撰寫(xiě)了此文,總結(jié)一年以來(lái)我們使用虹軟算法開(kāi)發(fā)的經(jīng)驗(yàn),提醒后續(xù)研究者避免相同的錯(cuò)誤。

2 系統(tǒng)整體設(shè)計(jì)

如下圖1,該程序的設(shè)計(jì)類圖如下:

Form類,這個(gè)類表示的是系統(tǒng)中的所有界面類,根據(jù)行業(yè)慣例簡(jiǎn)化類圖,我們將他們統(tǒng)一放在一個(gè)類中表示。

DBOparetor負(fù)責(zé)提供數(shù)據(jù)庫(kù)操作有關(guān)的接口,避免類與數(shù)據(jù)庫(kù)直接接觸,也可以減少訪問(wèn)數(shù)據(jù)庫(kù)所需編寫(xiě)的代碼量。這個(gè)類與Loader的區(qū)別在于它包含的最底層的數(shù)據(jù)庫(kù)操作,而Loader則是將他的操作組合起來(lái)再封裝一次以簡(jiǎn)化外部模塊調(diào)用時(shí)的復(fù)雜度。

Comparer類負(fù)責(zé)將照片與數(shù)據(jù)庫(kù)中的特征碼比對(duì),其結(jié)果會(huì)傳回到調(diào)用模塊。這個(gè)類的技術(shù)難點(diǎn)在于識(shí)別所需的計(jì)算量巨大,該類必須大量采用多線程與異步的技術(shù)來(lái)提升識(shí)別速度與避免堵塞UI線程。

FileWatcher類負(fù)責(zé)調(diào)用FileSystemWatcher來(lái)控制Comparer對(duì)圖像的識(shí)別。FileSystemWatcher是微軟提供給開(kāi)發(fā)者的文件監(jiān)測(cè)類,它可以監(jiān)控指定文件夾內(nèi)一個(gè)甚至多個(gè)指定類型或指定名稱的文件的生成、修改和刪除。它通過(guò)Windows的消息機(jī)制來(lái)實(shí)現(xiàn),我們只需要編寫(xiě)回調(diào)函數(shù)并訂閱其相應(yīng)事件設(shè)定好響應(yīng)功能就可以。對(duì)于這個(gè)類的介紹在下面還會(huì)詳細(xì)描述。我們的程序使用這個(gè)類監(jiān)控文件夾內(nèi)的照片類型文件的生成,這樣一旦有照片放入文件夾內(nèi)就會(huì)調(diào)用執(zhí)行函數(shù)讓Comparer類對(duì)其進(jìn)行掃描。此外我們還可以一些異常處理的方法來(lái)提高程序的可靠性。

Loader類負(fù)責(zé)從數(shù)據(jù)庫(kù)加載數(shù)據(jù)。由于在該程序中可能需要在多個(gè)表之間查詢,而且還需要有多種查詢模式,因此我們將加載單獨(dú)作為一個(gè)功能集成了起來(lái)。當(dāng)外部模塊需要查詢數(shù)據(jù)時(shí)不會(huì)直接調(diào)用DBOparetor類,而是統(tǒng)一使用Loader來(lái)獲取數(shù)據(jù)。

Submiter類負(fù)責(zé)提交數(shù)據(jù)。在Comparer類完成數(shù)據(jù)比對(duì)之后,主控模塊通過(guò)該類來(lái)將數(shù)據(jù)傳至Web服務(wù)器或數(shù)據(jù)庫(kù)服務(wù)器。Submiter會(huì)直接與DBOparetor交互而不經(jīng)過(guò)Loader,因?yàn)樗枰臄?shù)據(jù)庫(kù)操作并不是獲取信息而時(shí)提交信息,但是目前Submiter已經(jīng)不會(huì)直接向數(shù)據(jù)庫(kù)提交信息了。這是早期程序提交考勤記錄的方法。那時(shí)我們的系統(tǒng)還沒(méi)有建立專門(mén)管理考勤數(shù)據(jù)Web服務(wù)器,現(xiàn)在有了Web服務(wù)之后比對(duì)程序的考勤記錄會(huì)提交給Web服務(wù)器由它來(lái)負(fù)責(zé)管理數(shù)據(jù)庫(kù)。本文僅討論對(duì)比算法的使用Web服務(wù)器的相關(guān)事項(xiàng)不再詳細(xì)介紹。

3 文件監(jiān)控模塊

要進(jìn)行人臉識(shí)別就必須有輸入的圖片,本系統(tǒng)通過(guò)調(diào)用微軟提供的FileSystemWatcher類來(lái)監(jiān)控文件夾下的圖片文件。它的主要作用是Listens to the file system change notifications and raises events when a directory, or file in a directory, changes[1].該類可以監(jiān)聽(tīng)指導(dǎo)文件夾內(nèi)的五種操作,而我們通過(guò)監(jiān)控文件夾內(nèi)圖片文件的生成操作,一旦有新的圖片文件進(jìn)入文件夾就會(huì)啟動(dòng)識(shí)別程序?qū)ζ溥M(jìn)行識(shí)別。

FileSystemWatcher有六個(gè)事件,其中五個(gè)是當(dāng)指定文件發(fā)生某種操作時(shí)的響應(yīng)事件,而Error則是FileSystemWatcher本身發(fā)生異常時(shí)的響應(yīng)事件。通過(guò)這五個(gè)事件我們可以順利的完成對(duì)指定文件的所有活動(dòng)進(jìn)行處理,當(dāng)然在本系統(tǒng)里只用到了Created事件。

上面我們講解了如何指定響應(yīng)函數(shù)和要響應(yīng)的文件操作,接下來(lái)讀者可以通過(guò)我們的監(jiān)測(cè)開(kāi)始函數(shù)及其注釋來(lái)了解FileSystemWatcher的監(jiān)控目標(biāo)的設(shè)置。如下FileWatch中的開(kāi)始函數(shù)。

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

public void WatcherStart(string StrWarcherPath, string FilterType, bool IsEnableRaising, bool IsInclude)

{

Task.Run(() =>

{

watcher = new FileSystemWatcher();

watcher.Filter = FilterType;

watcher.IncludeSubdirectories = IsInclude;

watcher.NotifyFilter = NotifyFilters.FileName;

watcher.Path = StrWarcherPath;

watcher.Created += Watch_created;

watcher.Error += WatcherError;

watcher.EnableRaisingEvents = false;

watcher.EnableRaisingEvents = IsEnableRaising;

});

}

開(kāi)始前我們需要一些系列的屬性設(shè)置,包括:指定文件夾、選定監(jiān)聽(tīng)函數(shù)等。這里需要額外強(qiáng)調(diào)的是函數(shù)上方需要添加權(quán)限注解,否則監(jiān)控可能會(huì)無(wú)法開(kāi)啟。

Watch_created就是Created事件觸發(fā)時(shí)對(duì)應(yīng)的相應(yīng)函數(shù),它的代碼如下:

private void Watch_created(object sender, FileSystemEventArgs e)

{

List indexes;

Task> t = compare.GetIndex(image, MainWindow.pEngine);

FileInfo fileInfo = new FileInfo(e.FullPath);

indexes = t.Result;

foreach (int index in indexes) {

if (parent.stus[index].time == null || DateTime.Now - parent.stus[index].time >= parent.TimeSpan)

{

parent.stus[index].time = DateTime.Now;

_ = parent.ShowName(parent.stus[index].name);

parent.Log(parent.stus[index].name + "到勤");

});

}

else{

parent.Log(parent.stus[index].name + "五分鐘內(nèi)多次出現(xiàn)");

}

}

在省略一部分用于處理異常的函數(shù)后可以看到在這個(gè)函數(shù)中,我們將調(diào)用對(duì)比模塊對(duì)其進(jìn)行識(shí)別。由于C#的事件機(jī)制本身是多線程模式的,所以我們可以直接在函數(shù)中等待識(shí)別結(jié)果,而不用擔(dān)心阻塞主線程。獲取到照片的結(jié)果時(shí),我們要對(duì)結(jié)果進(jìn)行判斷,如果該結(jié)果五分鐘內(nèi)未被識(shí)別到過(guò)判斷為有效考勤,如果五分鐘內(nèi)出現(xiàn)過(guò)就判斷為無(wú)效考勤。

4 數(shù)據(jù)庫(kù)設(shè)計(jì)

在比對(duì)照片前首先需要提取作為標(biāo)準(zhǔn)的特征碼,這些特征碼我們將它們作為記錄保存在數(shù)據(jù)庫(kù)中。由于比對(duì)程序的數(shù)據(jù)庫(kù)十分簡(jiǎn)單,因此在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)做了說(shuō)明但沒(méi)有設(shè)計(jì)具體設(shè)計(jì),這里做一個(gè)補(bǔ)充說(shuō)明。比對(duì)子系統(tǒng)所用到的數(shù)據(jù)只有臉部特征。其數(shù)據(jù)表的具體結(jié)構(gòu)如下表。

程序開(kāi)啟時(shí),主控模塊會(huì)調(diào)用Load類將這些數(shù)據(jù)加載到內(nèi)存中。在之后的比對(duì)過(guò)程中Comparer類直接訪問(wèn)內(nèi)存來(lái)獲取特征碼。

5 比對(duì)算法介紹

本系統(tǒng)采用的人臉識(shí)別算法為虹軟的免費(fèi)算法,其具有離線、快速、識(shí)別率高等特點(diǎn)。在當(dāng)時(shí)選擇算法時(shí)主要考慮到的就是離線或在線的問(wèn)題。由于我們的系統(tǒng)要對(duì)密集人群進(jìn)行考勤,所以在線方式的考勤勢(shì)必大大增加網(wǎng)絡(luò)壓力,而市面上免費(fèi)又離線的人臉識(shí)別算法只有虹軟,因此我們選擇了他們的算法。

5.1 Entity

這個(gè)文件夾中包含了程序中將會(huì)使用到的實(shí)體類,目前這文件夾中只有一個(gè)類ImageInfo。這個(gè)類可以保存圖片的寬高等信息,其中還有一個(gè)IntPtr指針用于保存照片信息。因?yàn)樵搒dk是有C++編寫(xiě),因此在使用時(shí)參數(shù)常常要以非托管內(nèi)存的形式傳入,將圖片轉(zhuǎn)化為這個(gè)類之后可以方便sdk對(duì)其進(jìn)行識(shí)別

5.2 SDKModels

這個(gè)文件夾較為重要是一些sdk所用到數(shù)據(jù)結(jié)構(gòu)。

這里面比較常用的有ASF_MultiFaceInfo類,用于保存多人臉識(shí)別后的函數(shù)返回值。ASF_SingleFaceInfo類,用于保存單人臉識(shí)別后的識(shí)別信息。值得一提的是,這里的函數(shù)返回值并不會(huì)直接是這里的類,因?yàn)楹畿浀乃惴ㄔ臼怯蒀++編寫(xiě)的,實(shí)際上的返回值是一個(gè)C++的結(jié)構(gòu)體。C++的結(jié)構(gòu)體返回到C#中將會(huì)是一個(gè)IntPtr指針,虹軟還另給了函數(shù)將這些IntPtr指針轉(zhuǎn)化為這些實(shí)體類。

這個(gè)文件中的實(shí)體類與Entity十分相似,但這個(gè)文件夾中的實(shí)體類是對(duì)應(yīng)著sdk算法中的實(shí)體類的。也就是動(dòng)態(tài)庫(kù)里C++結(jié)構(gòu)體的C#表達(dá)形式。

5.3 SDKUtils

這個(gè)文件夾中保存的是虹軟識(shí)別算法的函數(shù)入口。這個(gè)文件夾中只有一個(gè)ASFFunctions類,虹軟通過(guò)DllImport注解將dll中由C++編寫(xiě)的函數(shù)的入口導(dǎo)出到這個(gè)類中。如圖5是一個(gè)函數(shù)導(dǎo)入的語(yǔ)法示范,是將名為ASFActivation的函數(shù)從dll中導(dǎo)入。

///

/// 激活人臉識(shí)別SDK引擎函數(shù)

///

/// SDK對(duì)應(yīng)的AppID

/// SDK對(duì)應(yīng)的SDKKey

/// 調(diào)用結(jié)果

[DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]

public static extern int ASFActivation(string appId, string sdkKey);

這樣這些原本由C++編寫(xiě)的算法就可以在這個(gè)類中被調(diào)用。這個(gè)文件夾中包含了所有虹軟sdk的識(shí)別函數(shù)。下面我們介紹三個(gè)特別重要的函數(shù)。這個(gè)三個(gè)函數(shù)在識(shí)別的過(guò)程中起到了非常重要的作用。

ASFDetectFaces函數(shù),這個(gè)函數(shù)用于監(jiān)測(cè)是否由人臉。其會(huì)通過(guò)out參數(shù)的形式返回一個(gè)對(duì)應(yīng)ASF_MultiFaceInfo的IntPtr指針,拿到這個(gè)返回值后我們就可以得到圖片中的人臉個(gè)數(shù)和具體位置、區(qū)域。

ASFFaceFeatureExtract函數(shù)用于提取某個(gè)區(qū)域的人臉特征。這個(gè)函數(shù)可以通過(guò)out參數(shù)來(lái)返回人臉特征碼以供后續(xù)的比對(duì)函數(shù)使用。

ASFFaceFeatureCompare比對(duì)函數(shù),這個(gè)函數(shù)通過(guò)out參數(shù)返回一個(gè)float類型的值,這個(gè)值指示了兩個(gè)特征碼之間的相似度。

5.4 Utils

Utils文件夾中主要保存了處理照片信息的類和處理非托管內(nèi)存的類。這些類可以將照片和IntPtr指針?lè)謩e處理成易于操作的ImageInfo類或SDKModeles中的類。在識(shí)別中主要起到處理數(shù)據(jù)的作用。

Utils與SDKUtils的區(qū)別在于,SDKUtils中包含的是sdk中的函數(shù),在C#中只是引入而沒(méi)有源碼,這些函數(shù)往往直接與識(shí)別相關(guān)。而Utils則是一些使用C#編寫(xiě)的代碼,可以直接在文件中看到它們的實(shí)現(xiàn)方式,這些函數(shù)通常是做數(shù)據(jù)處理起到輔助識(shí)別的作用。

6 人臉檢測(cè)

在人臉檢測(cè)時(shí)需要有三個(gè)步驟,第一步處理照片,第二步提取人臉區(qū)域,第三步提取區(qū)域特征碼,第四步比對(duì)特征碼。

處理照片:程序通過(guò)FileSystemWatcher檢測(cè)到有文件生成時(shí)會(huì)得到文件的絕對(duì)路徑,然后程序會(huì)通過(guò)該路徑得到相應(yīng)的圖片。由于比對(duì)算法不支持某些比例下的照片,得到照片之后程序會(huì)進(jìn)行一個(gè)寬高比的調(diào)整將寬度統(tǒng)一改為4的整數(shù)倍。然后通過(guò)讀取圖片文件,將文件里的信息讀取到內(nèi)存之中。由于該算法本來(lái)是由C++編寫(xiě),所以這里需要將圖片信息讀取到非托管內(nèi)存中。到這里圖片數(shù)據(jù)的處理就結(jié)束了。

提取特征碼:對(duì)照片數(shù)據(jù)的處理完成后就可以調(diào)用ASFDetectFaces函數(shù)對(duì)照片進(jìn)行照片中的人臉部分進(jìn)行劃分,識(shí)別出人臉在照片中的具體位置,在官方給出的demo中沒(méi)有這一步驟,但是據(jù)我們的測(cè)試這樣做可以有效地降低非本人照片的識(shí)別率,一定程度上的增加總體識(shí)別率。

提取人臉區(qū)域特征碼:調(diào)用ASFFaceFeatureExtract函數(shù)對(duì)指定區(qū)域進(jìn)行特征碼的提取。

比對(duì)特征碼:使用ASFFaceFeatureCompare將特征碼與所有數(shù)據(jù)庫(kù)中的已有特偵碼進(jìn)行比對(duì)得到相似度最高的人臉。

7 結(jié)束語(yǔ)

本文詳細(xì)描述了如何使用微軟的FileSystemWatcher類對(duì)指定文件夾下的圖片文件進(jìn)行監(jiān)控,并在新文件出現(xiàn)時(shí)使用虹軟的人臉識(shí)別算法識(shí)別對(duì)比。雖然由于其算法免費(fèi)使用但不開(kāi)源導(dǎo)致我們能施展的空間有限,但是我們還是在這種情況下,利用有限的條件對(duì)識(shí)別的速度和準(zhǔn)確率進(jìn)行改進(jìn)。

1)在數(shù)據(jù)處理方面,我們精簡(jiǎn)了Utils文件夾中的數(shù)據(jù)處理代碼,在不影響識(shí)別率的情況下將速度提升了5-6倍;此外在實(shí)際使用時(shí),我們發(fā)現(xiàn)官方給出的CutImage函數(shù)會(huì)造成內(nèi)存泄漏問(wèn)題,請(qǐng)讀者在自己編程時(shí)務(wù)必自行編寫(xiě)裁剪函數(shù)。

2)通過(guò)識(shí)別前的處理事先得到人臉的進(jìn)一步位置,將出現(xiàn)人臉的位置圖片進(jìn)一步裁剪下來(lái),再提取特征值。這樣減少了特征值的提取范圍,經(jīng)測(cè)試這一操作減少了誤判的概率在一定情況下有效提升了識(shí)別率,而且識(shí)別的速度也有一定的提升。

人臉識(shí)別技術(shù)已經(jīng)成功應(yīng)用到金融、軍工等多個(gè)領(lǐng)域, 行業(yè)發(fā)展優(yōu)勢(shì)明顯[3]。而本系統(tǒng)的代碼實(shí)現(xiàn)簡(jiǎn)潔、高效,并且可以實(shí)現(xiàn)多線程識(shí)別(論文中沒(méi)有提及,但是實(shí)際上現(xiàn)有代碼中已經(jīng)實(shí)現(xiàn)),讀者可以這些代碼和講解為基礎(chǔ)結(jié)合類名進(jìn)一步理解SDK接口,將人臉識(shí)別廣泛地應(yīng)用于各個(gè)領(lǐng)域。

參考文獻(xiàn):

[1]微軟API參考文檔[EB/OL].[2020-05-14].https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?view=netcore-3.1.

[2] 李彬,曲寒,冰靳薇.淺談人臉識(shí)別技術(shù)在智能視頻監(jiān)控中的應(yīng)用與發(fā)展趨勢(shì)[J].中國(guó)安防,2011(3):50-53.

[3] 耿艷萍.淺談人臉識(shí)別技術(shù)及其應(yīng)用[J].科學(xué)之友,2011(7):131-133.

[4] 張玉云.基于MTCNN和S-LBPH算法的多人臉識(shí)別在課堂考勤中的應(yīng)用[D].成都:西南交通大學(xué),2019.

[5] 程戰(zhàn)員.面向智能視頻監(jiān)控的多人臉識(shí)別算法研究[D].武漢:武漢理工大學(xué),2013.

[6] 李仁杰,曾鵬,張龍.多人臉識(shí)別算法和大數(shù)據(jù)融合技術(shù)在公共安全領(lǐng)域的應(yīng)用研究[C].2019年全國(guó)公共安全通信學(xué)術(shù)研討會(huì)優(yōu)秀論文集,2019.

【通聯(lián)編輯:謝媛媛】

福海县| 聊城市| 西宁市| 博客| 麻阳| 德保县| 化隆| 南漳县| 万荣县| 上高县| 晋宁县| 若羌县| 菏泽市| 莱阳市| 保靖县| 永川市| 武强县| 抚顺县| 铁岭县| 乡宁县| 盘山县| 阿勒泰市| 巩留县| 施秉县| 石门县| 平湖市| 静海县| 临沧市| 平阳县| 石河子市| 庐江县| 长阳| 南汇区| 垫江县| 米泉市| 宝山区| 阳谷县| 安阳县| 新郑市| 莲花县| 黄浦区|