Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
文地址:https://www.cnblogs.com/view12138/p/13185907.html
NET 人臉識(shí)別庫 ViewFaceCore
這是基于 SeetaFace6 人臉識(shí)別開發(fā)的 .NET 平臺(tái)下的人臉識(shí)別庫這是一個(gè)使用超簡單的人臉識(shí)別庫這是一個(gè)基于 .NET Standard 2.0 開發(fā)的庫這個(gè)庫已經(jīng)發(fā)布到 NuGet ,你可以一鍵集成到你的項(xiàng)目此項(xiàng)目可以免費(fèi)商業(yè)使用
開源協(xié)議:Apache-2.0GitHub地址: ViewFaceCore十分感謝您的小星星
示例項(xiàng)目地址:WinForm 攝像頭人臉檢測示例項(xiàng)目效果:
一分鐘在你的項(xiàng)目里集成人臉識(shí)別
1. 創(chuàng)建你的 .NET 應(yīng)用
.NET Standard >=2.0.NET Core >=2.0.NET Framework >=4.6.1^2
2. 使用 Nuget 安裝 ViewFaceCore
此 Nuget 包會(huì)自動(dòng)添加依賴的 C++ 庫,以及最精簡的識(shí)別模型。如果需要其它場景的識(shí)別模型,請下載 SeetaFace6 模型文件。
3. 在項(xiàng)目中編寫你的代碼
簡單的調(diào)用示例
ViewFaceCore 使用示例
三、說明
命名空間:ViewFaceCore.Sharp : 人臉識(shí)別類所在的命名空間
屬性名稱類型說明默認(rèn)值ModelPathstring獲取或設(shè)置模型路徑 [ 如非必要,請勿修改 ]./model/FaceTypeFaceType獲取或設(shè)置人臉類型FaceType.LightMarkTypeMarkType獲取或設(shè)置人臉關(guān)鍵點(diǎn)類型MarkType.LightDetectorSettingDetectorSetting獲取或設(shè)置人臉檢測器設(shè)置new DetectorSetting()
1 using System.Drawing;
2 using ViewFaceCore.Sharp;
3 using ViewFaceCore.Sharp.Model;
4
5 // 識(shí)別 bitmap 中的人臉,并返回人臉的信息。
6 FaceInfo[] FaceDetector(Bitmap);
7
8 // 識(shí)別 bitmap 中指定的人臉信息 info 的關(guān)鍵點(diǎn)坐標(biāo)。
9 FaceMarkPoint[] FaceMark(Bitmap, FaceInfo);
10
11 // 提取人臉特征值。
12 float[] Extract(Bitmap, FaceMarkPoint[]);
13
14 // 計(jì)算特征值相似度。
15 float Similarity(float[], float[]);
16
17 // 判斷相似度是否為同一個(gè)人。
18 bool IsSelf(float);
四、實(shí)現(xiàn)
此項(xiàng)目受到了 SeetaFaceEngine.NET 項(xiàng)目的啟發(fā)
這個(gè)項(xiàng)目本質(zhì)上來說還是調(diào)用了 SeetaFace 的 C++ 類庫來實(shí)現(xiàn)的人臉識(shí)別功能。針對本人遇到過的相關(guān)的類庫的使用都不太方便,而且使用的 SeetaFace 的版本較老,故萌生了自己重新開發(fā)的想法。
本項(xiàng)目在開發(fā)完成之后為了方便調(diào)用,采用了 Nuget 包的形式,將所有需要的依賴以及最小識(shí)別模型一起打包。在使用時(shí)非常簡單,只需要 nuget 安裝,編寫代碼,運(yùn)行即可,不需要多余的操作。
首先查看 SeetaFace ,已經(jīng)更新到了v3(v6即v3)(上面前輩的項(xiàng)目是基于v1開發(fā)的),最新版本暫時(shí)沒有開源,但是可以免費(fèi)商用。然后是根據(jù)以前的經(jīng)驗(yàn)和 SeetaFace6 文檔的指導(dǎo),以及前輩的項(xiàng)目,做了以下操作。
1.對SeetaFace6 的接口進(jìn)行了 C++ 形式的封裝。
目前主要實(shí)現(xiàn)了 人臉檢測,關(guān)鍵點(diǎn)提取,特征值提取,特征值對比幾個(gè)人臉識(shí)別中的基礎(chǔ)接口。有了這幾個(gè)接口,可以完整的實(shí)現(xiàn)一套人臉識(shí)別和驗(yàn)證的流程。
C++ 封裝層
2.采用 C# 對上訴接口進(jìn)行了導(dǎo)入。
因?yàn)镃++的項(xiàng)目測CPU架構(gòu)區(qū)分x86和x64,所以C# 層也需要區(qū)分架構(gòu)封裝
C# 導(dǎo)入層
3.采用 C# 的面向?qū)ο蟮姆庋b
因?yàn)镃#的項(xiàng)目默認(rèn)都是 AnyCPU,所以為了簡化調(diào)用,在這一層封裝的時(shí)候增加了架構(gòu)判斷,當(dāng)在你的項(xiàng)目中引用的時(shí)候,不用做任何修改。
且因?yàn)镃++的C#導(dǎo)入方法在和原生的C#寫法略有差異,且數(shù)據(jù)的轉(zhuǎn)換和傳遞比較麻煩,所以類庫中對外隱藏了 C# 導(dǎo)入層。并使用大家都更熟悉的C#的面向?qū)ο蟮姆绞竭M(jìn)行進(jìn)一步的封裝和簡化。
C# 面向?qū)ο髮?/p>
五、也許…
想起 GitHub 密碼,持續(xù)更新… 刪除代碼倉庫跑路…
在 GitHub 報(bào)告Bug… 向我 發(fā)送郵件
源:中國僑網(wǎng)
中國僑網(wǎng)3月25日電 據(jù)中國駐斐濟(jì)大使館微信公眾號(hào)消息,根據(jù)統(tǒng)一部署,中國駐斐濟(jì)大使館已于2021年8月31日啟用“中國領(lǐng)事”APP受理護(hù)照、旅行證業(yè)務(wù),相比傳統(tǒng)申請方式更加便捷,受到同胞們歡迎。現(xiàn)結(jié)合近期出現(xiàn)的問題,對2021年12月12日布的《駐斐濟(jì)使館關(guān)于啟用“中國領(lǐng)事”APP護(hù)照、旅行證在線辦理功能的通知(更新)》進(jìn)一步修訂如下:
一、下載注冊
“中國領(lǐng)事”APP可通過蘋果應(yīng)用商店、騰訊應(yīng)用寶商店、小米應(yīng)用商店、華為應(yīng)用商店或掃描下圖中的二維碼下載。下載完成后打開APP,使用中國國內(nèi)手機(jī)號(hào)或個(gè)人電子郵箱進(jìn)行注冊,根據(jù)提示完成實(shí)名認(rèn)證后即可登陸使用。
二、業(yè)務(wù)辦理流程
(一)信息填報(bào):登陸APP后,選擇“護(hù)照/旅行證”業(yè)務(wù)模塊(適用于申請護(hù)照或旅行證頒發(fā)、換發(fā)或補(bǔ)發(fā)人員),根據(jù)提示要求逐步、完整、準(zhǔn)確地填寫個(gè)人基本信息,在線簽字確認(rèn)《國籍狀況聲明書》,按要求格式上傳證件照片、現(xiàn)持護(hù)照資料頁等材料。駐斐濟(jì)使館僅受理在斐濟(jì)、瑙魯、圖瓦盧的中國公民通過“中國領(lǐng)事”APP提交的有關(guān)申請,不受理其他跨國申請。注意:申請換發(fā)護(hù)照人員,一般要求當(dāng)前所持護(hù)照有效期不足1年,如申請?zhí)崆皳Q發(fā),請將理由一并上傳;申請補(bǔ)發(fā)護(hù)照人員請按照系統(tǒng)提示上傳情況說明。另外,“國外聯(lián)系電話”欄,請務(wù)必填寫申請人在中國境外的有效聯(lián)系電話。
其中,證件照將直接用于護(hù)照制作,請務(wù)必上傳本人6個(gè)月內(nèi)近照,拍照時(shí)穿戴整齊、頭部及肩頸正直且居中、眼睛自然睜開、不露牙齒、不化濃妝,背景要求為白色或接近白色,無邊框。如選擇使用“中國領(lǐng)事”APP自帶拍照功能,建議請他人協(xié)助拍攝,不要露出自拍手臂、不要出現(xiàn)高低肩、低頭、眼睛看向下方、頭部歪斜等情況。請勿翻拍本人紙質(zhì)照片,此類照片清晰度不夠,無法制證。有關(guān)電子護(hù)照人像照片規(guī)格詳細(xì)要求請點(diǎn)擊鏈接:ppt.mfa.gov.cn/appo/page/instruction.html。
此外,如申請人耳朵較小,系統(tǒng)可能提示“證件照檢測不合格”,遇此情況,申請人可繼續(xù)申請,后臺(tái)審批時(shí)將進(jìn)行人工確認(rèn)。
(二)身份驗(yàn)證:為確保相關(guān)證件申請人系本人操作,APP將對申請人進(jìn)行人臉識(shí)別。人臉識(shí)別失敗不影響申請人提交申請,但請務(wù)必由申請人本人完成人臉識(shí)別。如后臺(tái)審批時(shí),認(rèn)定人臉識(shí)別失敗系非本人出鏡所致,將發(fā)起視頻面審,影響辦理進(jìn)度。
(三)提交訂單:完成上述步驟并成功提交訂單后,相關(guān)申請將提交使館審核。申請人可在“我的訂單”或“消息中心”跟蹤辦證進(jìn)度,使館工作人員將及時(shí)反饋審核進(jìn)展,視情在APP中留言要求補(bǔ)充上傳材料。
所有上傳材料不合格、不完整的申請,都將被退回補(bǔ)充材料,請申請人按退回理由補(bǔ)充或替換有關(guān)材料,并再次提交申請。如不按要求進(jìn)行修改,直接再次提交,申請將被退回,不予通過。
(四)視頻面審:如申請人為16周歲以下未成年人,或人臉識(shí)別未通過,或需進(jìn)一步核實(shí)有關(guān)信息,使館會(huì)要求與申請人通過APP進(jìn)行視頻面審。請申請人關(guān)注訂單狀態(tài),及時(shí)選擇預(yù)約時(shí)間,目前僅開放周二上午、周四上午兩個(gè)時(shí)間段。請申請人于選定時(shí)間段內(nèi)進(jìn)入視頻面試大廳,使館工作人員僅能夠?qū)σ堰M(jìn)入視頻面試大廳的申請者按順序發(fā)起視頻邀請。視頻面談過程中,請申請人配合使館工作人員進(jìn)行截圖操作,并回答相關(guān)提問。
16周歲以下未成年人應(yīng)在一位法定監(jiān)護(hù)人(父親/母親/其他法定監(jiān)護(hù)人)陪同下,與使館工作人員通過APP進(jìn)行視頻面談。
(五)郵寄材料:
所有申請換發(fā)護(hù)照/旅行證人員:請?jiān)贏PP訂單狀態(tài)顯示“復(fù)審中”后,盡快將當(dāng)前所持證照送遞或郵寄至使館。地址:Chinese Embassy(back gate), 183 Queen Elizabeth Drive, SUVA,Ph: 00679-7137727。來館遞送人員,請?zhí)崆皩⒆C件包好,交給使館后門崗?fù)ぁW⒁猓鹤?022年3月29日起(以訂單顯示“復(fù)審中”時(shí)間計(jì)算)未收到申請人當(dāng)前所持護(hù)照/旅行證前,證照換發(fā)程序?qū)和!?/p>
換發(fā)(含頒發(fā)、補(bǔ)發(fā))旅行證人員,還需請將申請人紙質(zhì)證件照片3張(2寸白底、正面免冠、頭部占比勿過大)一并送至使館。
申請補(bǔ)發(fā)、頒發(fā)護(hù)照人員:無需送遞、郵寄任何材料。但證照補(bǔ)發(fā)周期長于換發(fā),且流程不同,請勿盲目辦理補(bǔ)發(fā)業(yè)務(wù)。
(六)交費(fèi)取證
當(dāng)前,每本護(hù)照/旅行證辦理收費(fèi)均為38斐幣,建議待APP辦證進(jìn)度顯示為“制證完成,待取證”后再繳費(fèi)。使館領(lǐng)事證件賬戶設(shè)于西太銀行(WESTPAC BANK),帳戶名:Chinese Embassy,賬戶號(hào):9802407073,請通過銀行柜臺(tái)存款或網(wǎng)銀轉(zhuǎn)賬繳費(fèi)。
如在銀行柜臺(tái)辦理,請要求銀行收費(fèi)員在“Narrative”一欄填寫“中國領(lǐng)事”App中顯示的訂單號(hào)最后8位數(shù)(App中顯示的訂單號(hào)為18位字母加數(shù)字組合,例如:FJIAA3VNSE10289589,最后8位為10289589),取證時(shí)請務(wù)必?cái)y帶銀行收費(fèi)憑條原件。
如通過網(wǎng)銀轉(zhuǎn)賬,請自行備注訂單號(hào)最后8位數(shù),截圖并打印轉(zhuǎn)賬憑證,取證時(shí)攜帶。
當(dāng)前受新冠肺炎疫情影響,使館領(lǐng)事接案大廳有限開放。每月最后一周,使館將通過中國駐斐濟(jì)大使館官網(wǎng)“重要通知”欄目和“駐斐濟(jì)使館”微信公眾號(hào),同時(shí)發(fā)布下月領(lǐng)事接案大廳開放時(shí)間。所有APP辦證進(jìn)度顯示為“制證完成,待取證”且完成繳費(fèi)的訂單,均可于接案大廳開放期間取證。取證時(shí)請持繳費(fèi)憑證,使館將現(xiàn)場注銷并退還此前收到的舊證照、同時(shí)發(fā)放新證照。
三、注意事項(xiàng)
(一)受疫情影響,所有護(hù)照、旅行證業(yè)務(wù)均請通過“中國領(lǐng)事”APP申請辦理,確有特殊困難無法使用APP申請人員,請發(fā)送郵件至:bjclfj@gmail.com,使館將酌情遠(yuǎn)程指導(dǎo)或協(xié)調(diào)領(lǐng)事協(xié)助志愿者上門指導(dǎo)。
(二)APP實(shí)名認(rèn)證注冊目前僅支持中國普通護(hù)照或身份證號(hào)碼(后續(xù)可能增加其他認(rèn)證方式)。如無上述證件,可使用他人已實(shí)名認(rèn)證的賬號(hào)辦理。
(三)所有“復(fù)審中”并已收到舊證照的訂單,一般將于15-25天內(nèi)收到“制證完成,待取證”信息提示。申請人如對辦理進(jìn)展有疑問,請發(fā)送郵件至bjclfj@gmail.com咨詢。
(四)當(dāng)前,通過“中國領(lǐng)事”APP申辦的護(hù)照不包括申請人指紋信息。無指紋不影響護(hù)照正常使用,僅在入境中國時(shí)無法自助通關(guān),須走人工通道
(五)當(dāng)前,“中國領(lǐng)事”APP僅開通普通護(hù)照辦理功能。需要辦理公務(wù)護(hù)照、香港特區(qū)護(hù)照等其他國際旅行證件人員,請發(fā)送郵件至bjclfj@gmail.com咨詢。
(六)使館不會(huì)要求申請人到西太銀行(WESTPAC BANK)以外的銀行或網(wǎng)上支付費(fèi)用,請謹(jǐn)防假借使館名義的各類電信詐騙。
超市、地鐵、車站等很多場景中,人臉識(shí)別已經(jīng)被廣泛應(yīng)用,但是這個(gè)功能究竟是怎么實(shí)現(xiàn)的?
在本文中,將以 pico.js 庫為例,分享實(shí)現(xiàn)輕量級人臉識(shí)別功能的具體開發(fā)過程 。
pico.js 是一個(gè)只有 200 行純 JavaScript 代碼的人臉檢測庫,具備實(shí)時(shí)檢測功能(在實(shí)際環(huán)境中可達(dá)到200+ FPS),壓縮后僅 2kB 。
開源代碼地址:https://github.com/tehnokv/picojs;
簡介
本文將介紹pico.js,這一由JavaScript編寫的用于人臉檢測的代碼庫,并展示其工作原理。盡管現(xiàn)已有類似的項(xiàng)目,但我們的目標(biāo)是提供更小、計(jì)算效率更高的替代方案。
在深入考究其細(xì)節(jié)前,建議各位用計(jì)算機(jī)的網(wǎng)絡(luò)攝像頭體驗(yàn)一下人臉檢測的實(shí)時(shí)演示(也適用于移動(dòng)設(shè)備)。注意,所有進(jìn)程都是在客戶端完成的,即不向服務(wù)端發(fā)送圖像。因此,各位無需擔(dān)心在運(yùn)行這段代碼時(shí)的隱私問題。
在接下來的篇幅里,我將闡述pico.js的理論背景及其工作原理。
Pico對象監(jiān)測框架
2013年,Markus團(tuán)隊(duì)在一個(gè)技術(shù)報(bào)告中介紹了這一由JavaScript實(shí)現(xiàn)的pico.js代碼庫。它是參考C語言實(shí)現(xiàn)的,我們可在GitHub上獲取其源碼:https://github.com/nenadmarkus/pico。我們密切關(guān)注其實(shí)現(xiàn)方法,因?yàn)槲覀儾淮蛩銖?fù)制學(xué)習(xí)過程,而僅關(guān)注它的運(yùn)行。這背后的原因是,我們最好學(xué)習(xí)帶有官方代碼的檢測器,將其加載到JavaScript中并執(zhí)行進(jìn)程,如此就帶有獨(dú)特的優(yōu)勢(比如跨操作系統(tǒng)與設(shè)備的強(qiáng)大的可移植性)。
Pico對象檢測框架是流行的Viola-Jones方法的一個(gè)改進(jìn)。
Viola-Jones方法是基于區(qū)域分類的概念。這意味著在圖像的每個(gè)合理位置和尺度上都使用分類器。這個(gè)區(qū)域枚舉過程的可視化如下圖所示:
該分類器試圖判斷當(dāng)前區(qū)域是否存在人臉。最后,獲取到的人臉區(qū)域?qū)⒏鶕?jù)重疊程度進(jìn)行聚類。鑒于每張圖像都有很多區(qū)域,在這實(shí)時(shí)進(jìn)程中有兩個(gè)小技巧:
分類級聯(lián)由一系列分類器組成。這些分類器中的每一個(gè)都能正確識(shí)別幾乎所有的人臉,并丟棄一小部分非人臉區(qū)域。如果一個(gè)圖像區(qū)域通過了級聯(lián)的所有成員,那么它就被認(rèn)定為人臉。通過(設(shè)計(jì))序列中靠前的分類器比靠后的分類器更簡單,這種效果得到了進(jìn)一步放大。級聯(lián)分類算法如下圖所示:
每個(gè)階段包括一個(gè)分類器Cn,它既可以拒絕圖像區(qū)域(R),也可以接受圖像區(qū)域(A)。一旦被拒絕,該區(qū)域?qū)⒉粫?huì)進(jìn)入下一級聯(lián)成員。如果沒有一個(gè)分類器拒絕該區(qū)域,我們認(rèn)為它是一張人臉。
在Viola-Jones框架中,每個(gè)分類器Cn都基于Haar-like特性。這使得每個(gè)區(qū)域可通過名為積分圖像的預(yù)算結(jié)構(gòu)來進(jìn)行O(1)計(jì)算時(shí)間。
然而,積分圖像也有一些缺點(diǎn)。最明顯的缺點(diǎn)是,這種數(shù)據(jù)結(jié)構(gòu)需要額外的內(nèi)存來儲(chǔ)存:通常是unit8輸入圖像的4倍。另外一個(gè)問題是構(gòu)建一個(gè)完整的圖像所需的時(shí)間(也與輸入的像素?cái)?shù)有關(guān))。在功能有限的小型硬件上處理大的圖像也可能會(huì)有問題。這種方法的一個(gè)更微妙的問題是它的優(yōu)雅性:隨之而來的問題是我們是否能夠創(chuàng)建一個(gè)不需要這種結(jié)構(gòu)、并且具有所有重要屬性的框架。
Pico框架對每個(gè)分類器Cn用像素對比測試取代了Haar-like特性,形式如下:
其中R是一個(gè)圖像區(qū)域,(Xi,Yi)表示用于比較像素值的位置。注意,這種測試可以應(yīng)用于各種尺寸的區(qū)域,而不需要任何專門的數(shù)據(jù)結(jié)構(gòu),這與Haar-like的特性不同。這是通過將位置(Xi,Yi)存儲(chǔ)在標(biāo)準(zhǔn)化坐標(biāo)中(例如,(Xi,Yi)在[?1,1]×[?1,1]中),并乘以當(dāng)前區(qū)域的比例。這就是pico實(shí)現(xiàn)多尺度檢測功能的思路。
由于此類測試很簡單,又因混疊和噪聲而存在潛在問題,我們有必要將大量測試應(yīng)用于該區(qū)域,以便對其內(nèi)容進(jìn)行推理。在pico框架中,這是通過
這可以用數(shù)學(xué)符號(hào)表示,如下:
其中Tt(R)表示決策樹Tt在輸入?yún)^(qū)域R上生成的標(biāo)量輸出。由于每個(gè)決策樹都由若干個(gè)像素比較測試組成,這些測試可以根據(jù)需要調(diào)整大小,因此運(yùn)行分類階段Cn的計(jì)算復(fù)雜度與區(qū)域大小無關(guān)。
每個(gè)Cn決策樹都是AdaBoost的變體。接下來以這種方式將閾值設(shè)置為Cn的輸出,以獲取期望的真陽率(例如0.995)。所有得分低于這個(gè)閾值的區(qū)域都不認(rèn)為是人臉。添加級聯(lián)的新成員,直到達(dá)到預(yù)期的假陽率。請參閱原出版物學(xué)習(xí)相關(guān)細(xì)節(jié)內(nèi)容。
正如簡介中說的那樣,我們不會(huì)復(fù)制pico的學(xué)習(xí)過程,而僅關(guān)注它的運(yùn)行。如果您想學(xué)習(xí)自定義對象/人臉檢測器,請使用官方的實(shí)現(xiàn)方法。Pico.js能夠加載二進(jìn)制級聯(lián)文件并有效地處理圖像。接下來的小節(jié)將解釋如何使用pico.js來檢測圖像中的人臉。
pico.js的組件
庫的組成部分如下:
通過<script src="pico.js"></script>(或它的壓縮版本) 引入并進(jìn)行一些預(yù)處理后,就可以使用這些工具了。我們將討論對圖像進(jìn)行人臉檢測的JS代碼(GitHub repo中的代碼)。但愿這能詳盡說明使用該庫的方法。實(shí)時(shí)演示也有說明。
實(shí)例化區(qū)域分類器
區(qū)域分類器應(yīng)識(shí)別圖像區(qū)域是否為人臉。其思路是在整個(gè)圖像中運(yùn)行這個(gè)分類器,以獲得其中的所有面孔(稍后詳細(xì)介紹)。Pico.js的區(qū)域分類過程封裝在一個(gè)函數(shù)中,其原型如下:
function(r, c, s, pixels, ldim) { /* ... */} /* ... */ }
前三個(gè)參數(shù)(r、c和s)指定區(qū)域的位置(其中心的行和列)及其大小。pixels陣列包含圖像的灰度強(qiáng)度值。參數(shù)ldim規(guī)定從圖像的一行移動(dòng)到下一行的方式(在諸如OpenCV的庫中稱為stride)。也就是說,從代碼中可以看出(r,c)位置的像素強(qiáng)度為[r*ldim + c]像素。該函數(shù)會(huì)返回一個(gè)浮點(diǎn)值,表示該區(qū)域的得分。如果分?jǐn)?shù)大于或等于0.0,則該區(qū)域認(rèn)定為人臉。如果分?jǐn)?shù)低于0.0,則該區(qū)域認(rèn)定為非人臉,即屬于背景類。
Pico.js中pico.unpack_cascade過程將二進(jìn)制的級聯(lián)作為參數(shù),將其解壓并返回一個(gè)帶有分類過程和分類器數(shù)據(jù)的閉包函數(shù)。我們用它初始化區(qū)域分類過程,以下是詳細(xì)說明。
官方pico的人臉檢測級聯(lián)稱為facefinder。它由近450個(gè)決策樹組成,每個(gè)決策樹的深度為6,它們集成一個(gè)25級聯(lián)。該級聯(lián)將在我們是實(shí)驗(yàn)中用到,它能對正臉圖像以適當(dāng)?shù)臋z測速率進(jìn)行實(shí)時(shí)處理,正如實(shí)時(shí)演示看到的那樣。
facefinder級聯(lián)可以直接從官方的github庫上下載,代碼寫為:
var facefinder_classify_region=function(r, c, s, pixels, ldim) {return -1.0;};var cascadeurl='https://raw.githubusercontent.com/nenadmarkus/pico/c2e81f9d23cc11d1a612fd21e4f9de0921a5d0d9/rnt/cascades/facefinder';fetch(cascadeurl).then(function(response) { response.arrayBuffer().then(function(buffer) { var bytes=new Int8Array(buffer); facefinder_classify_region=pico.unpack_cascade(bytes); console.log('* cascade loaded'); })})function(r, c, s, pixels, ldim) {return -1.0;}; var cascadeurl='https://raw.githubusercontent.com/nenadmarkus/pico/c2e81f9d23cc11d1a612fd21e4f9de0921a5d0d9/rnt/cascades/facefinder'; fetch(cascadeurl).then(function(response) { response.arrayBuffer().then(function(buffer) { var bytes=new Int8Array(buffer); facefinder_classify_region=pico.unpack_cascade(bytes); console.log('* cascade loaded'); }) })
首先,將facefinder_classify_region初始化,即任何圖像區(qū)域先認(rèn)定為非人臉(它總是返回-1.0)。接下來,我們使用Fetch API從cascadeurl URL中獲取級聯(lián)二進(jìn)制數(shù)據(jù)。這是一個(gè)異步調(diào)用,我們不能即刻獲取到數(shù)據(jù)。最后,在獲取到響應(yīng)數(shù)據(jù)后,將其轉(zhuǎn)換為int8數(shù)組并傳遞給pico.unpack_cascade,然后pico.unpack_cascade生成正確的facefinder_classify_region函數(shù)。
將facefinder_classify_region函數(shù)應(yīng)用于圖像中每個(gè)區(qū)域的合理位置和等級以便檢測到所有的人臉。這個(gè)過程將在下一小節(jié)中解釋。
在圖像上運(yùn)行分類器
假定HTML body內(nèi)有一個(gè)canvas元素,一個(gè)image標(biāo)簽和一個(gè)帶有onclick回調(diào)的button標(biāo)簽。用戶一旦點(diǎn)擊了人臉檢測按鈕,檢測過程就開始了。
下面的JS代碼用于繪制內(nèi)容和圖像,并獲取原始像素值(紅、綠、藍(lán)+ alpha的格式):
var img=document.getElementById('image');var ctx=document.getElementById('canvas').getContext('2d');ctx.drawImage(img, 0, 0);var rgba=ctx.getImageData(0, 0, 480, 360).data; // the size of the image is 480x360 (width x height)document.getElementById('image'); var ctx=document.getElementById('canvas').getContext('2d'); ctx.drawImage(img, 0, 0); var rgba=ctx.getImageData(0, 0, 480, 360).data; // the size of the image is 480x360 (width x height)
下面,我們編寫一個(gè)輔助函數(shù),將輸入的RGBA數(shù)組轉(zhuǎn)換為灰度:
function rgba_to_grayscale(rgba, nrows, ncols) { var gray=new Uint8Array(nrows*ncols); for(var r=0; r<nrows; ++r) for(var c=0; c<ncols; ++c) // gray=0.2*red + 0.7*green + 0.1*blue gray[r*ncols + c]=(2*rgba[r*4*ncols+4*c+0]+7*rgba[r*4*ncols+4*c+1]+1*rgba[r*4*ncols+4*c+2])/10; return gray;} var gray=new Uint8Array(nrows*ncols); for(var r=0; r<nrows; ++r) for(var c=0; c<ncols; ++c) // gray=0.2*red + 0.7*green + 0.1*blue gray[r*ncols + c]=(2*rgba[r*4*ncols+4*c+0]+7*rgba[r*4*ncols+4*c+1]+1*rgba[r*4*ncols+4*c+2])/10; return gray; }
現(xiàn)在我們準(zhǔn)備調(diào)用這個(gè)過程,它將在整個(gè)圖像中運(yùn)行facefinder_classify_region函數(shù):
image={ "pixels": rgba_to_grayscale(rgba, 360, 480), "nrows": 360, "ncols": 480, "ldim": 480}params={ "shiftfactor": 0.1, // move the detection window by 10% of its size "minsize": 20, // minimum size of a face "maxsize": 1000, // maximum size of a face "scalefactor": 1.1 // for multiscale processing: resize the detection window by 10% when moving to the higher scale}// run the cascade over the image// dets is an array that contains (r, c, s, q) quadruplets// (representing row, column, scale and detection score)dets=pico.run_cascade(image, facefinder_classify_region, params);"pixels": rgba_to_grayscale(rgba, 360, 480), "nrows": 360, "ncols": 480, "ldim": 480 } params={ "shiftfactor": 0.1, // move the detection window by 10% of its size "minsize": 20, // minimum size of a face "maxsize": 1000, // maximum size of a face "scalefactor": 1.1 // for multiscale processing: resize the detection window by 10% when moving to the higher scale } // run the cascade over the image // dets is an array that contains (r, c, s, q) quadruplets // (representing row, column, scale and detection score) dets=pico.run_cascade(image, facefinder_classify_region, params);
注意,人臉的最小尺寸默認(rèn)設(shè)置為20。這太小了,對于大部分應(yīng)用程序來說都是不必要的。但還需要注意的是,運(yùn)行速度在很大程度上取決于此參數(shù)。對于實(shí)時(shí)應(yīng)用程序,應(yīng)該將此值設(shè)置為100。但是,設(shè)置的最小尺寸需匹配示例圖像。
檢測過程完成后,數(shù)組dets包含表單(r,c,s,q),其中r,c,s指定人臉區(qū)域的位置(行,列)和大小,q表示檢測分?jǐn)?shù)。該地區(qū)得分越高,越有可能是人臉。
我們可以將得到的檢測結(jié)果渲染到畫布上:
qthresh=5.0for(i=0; i<dets.length; ++i) // check the detection score // if it's above the threshold, draw it if(dets[i][3]>qthresh) { ctx.beginPath(); ctx.arc(dets[i][1], dets[i][0], dets[i][2]/2, 0, 2*Math.PI, false); ctx.lineWidth=3; ctx.strokeStyle='red'; ctx.stroke(); }<dets.length; ++i) // check the detection score // if it's above the threshold, draw it if(dets[i][3]>qthresh) { ctx.beginPath(); ctx.arc(dets[i][1], dets[i][0], dets[i][2]/2, 0, 2*Math.PI, false); ctx.lineWidth=3; ctx.strokeStyle='red'; ctx.stroke(); }
我們需要根據(jù)經(jīng)驗(yàn)設(shè)置變量qthresh(5.0剛好,適用于facefinder級聯(lián)和靜止圖像中的人臉檢測)。典型的檢測結(jié)果是這樣的:
我們可以看到每張臉周圍都有多個(gè)探測器。這個(gè)問題用非極大值抑制來解決,在下一小節(jié)中解釋。
原始檢測的非極大值抑制(聚類)
非極大值抑制聚類的目的是將重疊的人臉區(qū)域融合在一起。每個(gè)集群的代表是其中得分最高的一次檢測(該方法因此而得名)。它的分?jǐn)?shù)更新為集群中所有檢測分?jǐn)?shù)的總和。
pico.js中的實(shí)現(xiàn)方式是:
dets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.20.2); // set IoU threshold to 0.2
IoU閾值設(shè)置為0.2。這意味著兩個(gè)重疊大于該值的檢測將合并在一起。
現(xiàn)在的結(jié)果是這樣的:
我們已經(jīng)學(xué)習(xí)了使用pico.js檢測靜止圖像中人臉的基本知識(shí)。值得注意的是,pico方法不如基于深度學(xué)習(xí)的現(xiàn)代人臉檢測器強(qiáng)大。然而,pico非常快,這使得它成為許多應(yīng)用程序的首選,比如那些需要實(shí)時(shí)處理的應(yīng)用程序。
在視頻中使用pico.js進(jìn)行實(shí)時(shí)人臉檢測
由于pico.js產(chǎn)生的檢測噪聲比較大,我們開發(fā)了一種時(shí)間記憶模塊,在處理實(shí)時(shí)視頻時(shí)可減輕少此問題。該方法用于上述實(shí)時(shí)演示中,顯著提高了主觀檢測質(zhì)量。
其思想是將幾個(gè)連續(xù)幀的檢測結(jié)合起來,以準(zhǔn)確判斷給定區(qū)域是否為人臉。這是通過實(shí)例化一個(gè)電路緩沖區(qū)來實(shí)現(xiàn)的,該緩沖區(qū)包含從最后一個(gè)f幀檢測到的信號(hào):
var update_memory=pico.instantiate_detection_memory(5); // f is set to 5 in this example// f is set to 5 in this example
update_memory閉包封裝了電路緩沖區(qū)和刷新數(shù)據(jù)的代碼。返回的數(shù)組包含來自最后f幀的檢測。
現(xiàn)在我們不再從單幀中檢測聚類,而是在聚類之前進(jìn)行累加:
dets=pico.run_cascade(image, facefinder_classify_region, params);dets=update_memory(dets); // accumulates detections from last f framesdets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.2 dets=update_memory(dets); // accumulates detections from last f frames dets=pico.cluster_detections(dets, 0.2); // set IoU threshold to 0.2
最終的分類閾值qthresh會(huì)顯著提高,這會(huì)減少假陽性的數(shù)量,而不會(huì)顯著影響到真陽率。
轉(zhuǎn)載自:https://blog.csdn.net/csdnnews/article/details/92841099
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。