加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

【EsDA應(yīng)用】10分鐘快速實(shí)現(xiàn)人臉識(shí)別

2023/06/03
1878
閱讀需 16 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

人臉識(shí)別是一種高安全性的生物識(shí)別技術(shù),在安防、身份驗(yàn)證等領(lǐng)域被廣泛應(yīng)用。本文主要介紹如何基于EsDA設(shè)計(jì)的人臉特征值提取節(jié)點(diǎn)和特征值比對(duì)節(jié)點(diǎn),快速實(shí)現(xiàn)人臉識(shí)別功能。

簡(jiǎn)介

人臉識(shí)別是一種高安全性的生物識(shí)別技術(shù),在安防、身份驗(yàn)證等領(lǐng)域被廣泛應(yīng)用。本文在《【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)圖像人臉檢測(cè)》的基礎(chǔ)上,使用M6G2C核心板,簡(jiǎn)單介紹如何基于EsDA設(shè)計(jì)的人臉特征值提取節(jié)點(diǎn)和特征值比對(duì)節(jié)點(diǎn),快速實(shí)現(xiàn)人臉特征值提取和比對(duì)識(shí)別。

前期準(zhǔn)備

若是剛開(kāi)始接觸EsDA,可先閱讀EsDA其他系列文章,從零開(kāi)始搭建環(huán)境和掌握基本開(kāi)發(fā)流程,已有基礎(chǔ)的可以跳過(guò):

EsDA?MPC-ZC1?入門(一)——?軟件安裝

EsDA?MPC-ZC1入門(二)——?LED控制

【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)攝像頭圖像采集

【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)圖像人臉檢測(cè)

1. 硬件準(zhǔn)備

1.1 準(zhǔn)備一個(gè)攝像頭,這里我們以O(shè)V7725攝像頭為例,搭配轉(zhuǎn)接板使用。

1.2 準(zhǔn)備一塊LCD顯示屏(非必須)。

1.3 準(zhǔn)備一張SD卡,用于存放人臉模型。

1.4 準(zhǔn)備一塊M6G2C核心板和EPC-6G2C-L評(píng)估板,并按照下圖所示連接好硬件。其中,eth0網(wǎng)口用于下載流圖,并連接LCD顯示屏接口、電源,以及將OV7725攝像頭通過(guò)轉(zhuǎn)接板連接到開(kāi)發(fā)板背面的CSI接口上。

2. 其它準(zhǔn)備

將人臉檢測(cè)和特征值提取相關(guān)的模型參數(shù)文件存放到SD卡中。

節(jié)點(diǎn)介紹

這里我們需要使用到攝像頭、圖像格式轉(zhuǎn)換以及人臉檢測(cè)、特征值提取、特征值比對(duì)相關(guān)的AWFlow節(jié)點(diǎn),包括在《【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)攝像頭圖像采集》中介紹的camera_video節(jié)點(diǎn)、camera配置節(jié)點(diǎn)、lcd_display節(jié)點(diǎn),在《【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)圖像人臉檢測(cè)》中介紹的image_format_convert轉(zhuǎn)換節(jié)點(diǎn)、face_detection人臉檢測(cè)節(jié)點(diǎn),以及本文介紹的用于人臉特征值提取的face_character_extract節(jié)點(diǎn)和用于特征值比對(duì)的face_character_compare節(jié)點(diǎn)。

1. face_character_extract節(jié)點(diǎn)

face_character_extract是人臉的特征值提取節(jié)點(diǎn),該節(jié)點(diǎn)對(duì)輸入的人臉圖像數(shù)據(jù)進(jìn)行特征值提取,并輸出提取的特征值信息。后級(jí)節(jié)點(diǎn)可以將這個(gè)特征值進(jìn)行存儲(chǔ),也可以與已有的特征值信息進(jìn)行比對(duì)和匹配識(shí)別。

1.1?屬性

    • 名稱:節(jié)點(diǎn)的名稱;顯示名稱:節(jié)點(diǎn)在畫布中顯示的名稱;模型和參數(shù)路徑:特征值提取相關(guān)的模型和參數(shù)文件的路徑。

1.2?輸入

image:需要進(jìn)行特征值提取的人臉圖像數(shù)據(jù)緩沖區(qū),一般由face_detection檢測(cè)節(jié)點(diǎn)提供輸入,face_detection檢測(cè)到圖像中存在人臉時(shí),才將數(shù)據(jù)輸入到這里進(jìn)行特征值提取(通常這正是我們想要的)。

1.3?輸出

    character:人臉的特征值。人臉信息一般都會(huì)提取成一段特定大小的特征值,方便我們進(jìn)行存儲(chǔ)(錄入)和比對(duì)(識(shí)別)。

2. face_character_compare節(jié)點(diǎn)

face_character_compare是人臉的特征值比對(duì)節(jié)點(diǎn),該節(jié)點(diǎn)一般由face_character_extract節(jié)點(diǎn)提供特征值輸入,并從文件/數(shù)據(jù)庫(kù)中獲取已經(jīng)錄入信息的特征值集合。

2.1?屬性

比對(duì)閾值:比對(duì)閾值是一個(gè)0.1~0.9范圍內(nèi)的數(shù)字,數(shù)字越大,對(duì)特征值的匹配程度要求就越高,識(shí)別的準(zhǔn)確度也越高;

2.2?輸入

character:待比對(duì)的人臉特征值,一般由face_character_extract節(jié)點(diǎn)提供特征值輸入;

character_target:比對(duì)的目標(biāo)特征值集合,一般是由我們已經(jīng)錄入/注冊(cè)的特征值文件/數(shù)據(jù)庫(kù)提供;

target_num:目標(biāo)特征值集合的特征值數(shù)量。

2.3?輸出

result:比對(duì)結(jié)果,如果輸入中的character與character_target中的某一個(gè)匹配成功的話,輸出1;都不匹配則輸出0;

id:匹配成功的話,輸出第一個(gè)匹配的特征值在特征值集合character_target中的序號(hào),匹配失敗輸出-1。

業(yè)務(wù)處理

本應(yīng)用主要實(shí)現(xiàn)如下功能:

采集攝像頭圖像,并在LCD顯示屏上進(jìn)行顯示(顯示可選);

將攝像頭輸出的原始數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換后,輸入到face_detection節(jié)點(diǎn)中進(jìn)行人臉檢測(cè);

將檢測(cè)結(jié)果輸入到face_character_extract節(jié)點(diǎn)提取特征值;

通過(guò)face_character_compare節(jié)點(diǎn)進(jìn)行特征值比對(duì)識(shí)別;

注冊(cè)特征值,這里我們?yōu)榱朔奖阊菔?,只是?jiǎn)單地通過(guò)face_data_write節(jié)點(diǎn)將特征值保存到文件中;

通過(guò)GPIO輸入來(lái)控制特征值錄入。

具體實(shí)現(xiàn)如下:

1. 添加節(jié)點(diǎn)并連線

首先,我們添加流圖左上角的部分,主要完成圖像的輸入和人臉的檢測(cè);左下部分我們簡(jiǎn)單地通過(guò)一個(gè)IO輸入來(lái)控制是否將特征值進(jìn)行注冊(cè);然后,添加一個(gè)特征值提取節(jié)點(diǎn);右下部分主要完成兩個(gè)功能,分別是特征值的注冊(cè),以及特征值的比對(duì)識(shí)別。

2. 配置節(jié)點(diǎn)2.1 圖像輸入和人臉檢測(cè)本應(yīng)用左上部分的六個(gè)節(jié)點(diǎn)主要完成圖像采集輸入和人臉的檢測(cè)部分,其配置方式與【EsDA應(yīng)用】5分鐘快速實(shí)現(xiàn)圖像人臉檢測(cè) 4.2 配置節(jié)點(diǎn)?部分完全相同,請(qǐng)參考之。

2.2?配置face_character_extract節(jié)點(diǎn)

使用人臉特征值提取節(jié)點(diǎn)需要將相關(guān)的模型文件存放到文件系統(tǒng)中,并在節(jié)點(diǎn)中指定模型存放的路徑,這里我們存放到SD卡中,并指定路徑。

2.3?face_character_compare節(jié)點(diǎn)

face_character_compare節(jié)點(diǎn)我們只需要指定比對(duì)閾值即可,這里我們?cè)O(shè)置為0.7。

2.4?face_data_write和face_data_read

這兩個(gè)節(jié)點(diǎn)是為了方便演示。face_data_write節(jié)點(diǎn)簡(jiǎn)單地將特征值保存到文件,而face_data_read從文件中讀取特征值,我們指定特征值文件路徑即可。

2.5?gpio_in

為了方便演示,本應(yīng)用簡(jiǎn)單地通過(guò)IO引腳電平高低來(lái)控制是否錄入人臉特征值。這里我們選擇了EPC-6G2C-L評(píng)估板的RX8引腳,其對(duì)應(yīng)編號(hào)為90,并將其設(shè)置為默認(rèn)下拉模式,當(dāng)輸入高電平時(shí)進(jìn)行人臉信息的錄入。

2.6?fscript節(jié)點(diǎn)

其余的五個(gè)節(jié)點(diǎn)均為fscript節(jié)點(diǎn),分別用于控制本應(yīng)用的邏輯以及輸出結(jié)果。demo流圖中對(duì)這些fscript進(jìn)行了編號(hào),它們的內(nèi)容分別如下:

2.6.1?是否錄入人臉信息

這個(gè)節(jié)點(diǎn)判斷gpio_in輸入的IO電平狀態(tài),通過(guò)設(shè)置全局標(biāo)志位來(lái)控制是否進(jìn)行人臉?shù)浫?。這里我們?cè)O(shè)置當(dāng)處于低電平狀態(tài)時(shí),進(jìn)行人臉識(shí)別;而在輸入高電平狀態(tài)時(shí),錄入人臉信息。

if(msg.payload == 0) {     global.face_recognition = 1     global.face_register = 0} else {    print("......錄入人臉信息中......")    global.face_register = 1    global.face_recognition = 0}

2.6.2?register_chk

register_chk判斷前面設(shè)置的標(biāo)志,當(dāng)不需要錄入人臉信息時(shí)(即IO處于低電平),通過(guò)aborted=1放棄向后面的節(jié)點(diǎn)傳遞數(shù)據(jù);否則(此時(shí)IO處于高電平)設(shè)置一個(gè)命令給face_data_write節(jié)點(diǎn)。

if (global.face_register == 0) {    aborted = 1;} else {    msg.register_cmd = "register";}

2.6.3?recognition_chk如果此時(shí)正在錄入人臉信息(IO處于高電平),則通過(guò)aborted放棄后面的特征值比對(duì)環(huán)節(jié)。

if (global.face_recognition == 0) {    aborted = 1;}

2.6.4?錄入人臉信息結(jié)果

我們?cè)趂ace_data_write節(jié)點(diǎn)后面添加打印信息,當(dāng)face_data_write成功將特征值錄入到文件中后,會(huì)告訴我們當(dāng)前錄入的是第幾個(gè)人臉信息。

print("特征值注冊(cè)成功,當(dāng)前是第 " + msg.id + "個(gè)");

2.6.5?特征值比對(duì)結(jié)果

打印特征值比對(duì)的結(jié)果,如果比對(duì)成功的話,打印出與之匹配的人臉I(yè)D。

print("特征值比對(duì)結(jié)果:" + msg.result);if(msg.result == 1) {    print("特征值比對(duì)成功,匹配的人臉I(yè)D是:" + msg.id);} else {    print("特征值比對(duì)失敗,請(qǐng)先注冊(cè)人臉信息");}

3. 下載驗(yàn)證因?yàn)镸6G2C開(kāi)發(fā)板是通過(guò)網(wǎng)口去下載流圖,打開(kāi)AWFlow Designer后,AWFlow Designer可以自動(dòng)發(fā)現(xiàn)網(wǎng)絡(luò)上的設(shè)備。選擇當(dāng)前設(shè)備M6G2C,然后點(diǎn)擊下載運(yùn)行即可。

3.1?圖像采集顯

流圖下載完成后,通過(guò)LCD可以看到,我們已經(jīng)成功從攝像頭獲取圖像,并且成功在顯示屏上顯示。

3.2?人臉檢測(cè)、特征值提取比對(duì)

從打印信息中我們可以看到,坐標(biāo)點(diǎn)已經(jīng)被輸出出來(lái)了,所以人臉檢測(cè)功能是正常的。但是,一開(kāi)始我們并沒(méi)有錄入任何人臉信息,因此特征值文件(即/flow/face_data.txt)并不存在,所以提示特征值比對(duì)失敗。

3.3?特征值錄入

當(dāng)我們將RX8接入3.3V后,系統(tǒng)就進(jìn)入了錄入人臉信息的模式。此時(shí)我們可以通過(guò)攝像頭錄入人臉信息。

3.4?特征值比對(duì)識(shí)別

特征值信息錄入完畢后,我們可以將RX8引腳置低,使系統(tǒng)回到特征值比對(duì)識(shí)別模式。現(xiàn)在,我們就可以和已經(jīng)錄入的特征值集合比對(duì)成功了。而沒(méi)有錄入的人臉,依然無(wú)法通過(guò)識(shí)別。

4. 擴(kuò)展應(yīng)用

本應(yīng)用中,當(dāng)特征值比對(duì)完成后,只是簡(jiǎn)單地輸出比對(duì)的結(jié)果,這樣我們可能感受不到它實(shí)際的用處:

print("特征值比對(duì)結(jié)果:" + msg.result);if(msg.result == 1) {    print("特征值比對(duì)成功,匹配的人臉I(yè)D是:" + msg.id);} else {    print("特征值比對(duì)失敗,請(qǐng)先注冊(cè)人臉信息");}

4.1?應(yīng)用1

但是,如果我們簡(jiǎn)單的改造一下,比如在識(shí)別成功后,發(fā)出一個(gè)高電平,或者一條指令,這樣,一個(gè)基于人臉識(shí)別的門禁系統(tǒng),是不是已經(jīng)有了雛形了呢?

//以下內(nèi)容僅供示例print("特征值比對(duì)結(jié)果:" + msg.result);if(msg.result == 1) {    set(flow.gpio_out_ctl_door, 1);    // 讓控制門禁的IO輸出1} else {    set(flow.warn_led, blinking);      // 比對(duì)失敗,可以讓告警燈閃爍等等}

4.2?應(yīng)用2又或者,當(dāng)匹配到一個(gè)已經(jīng)錄入系統(tǒng)中的人臉時(shí),將特征值ID和當(dāng)前時(shí)間記錄到數(shù)據(jù)庫(kù)中,一個(gè)基于人臉識(shí)別的考勤系統(tǒng),其核心功能是不是已經(jīng)實(shí)現(xiàn)了呢?

print("特征值比對(duì)結(jié)果:" + msg.result);if(msg.result == 1) {    var dt = date_time_create();     //獲取當(dāng)前時(shí)間    var str = "ID:" + msg.id + "t" + dt.year + "-" + dt.month + "-" + dt.day + " " + dt.hour + ":" + dt.minute + ":" + dt.second + "n"    print(str);    file_write_append("/flow/attendance_records.txt", str);    //將ID和時(shí)間信息寫入到考勤記錄文件} else {    print("Please try again");        //提示用戶失敗重試}

 

相關(guān)推薦

電子產(chǎn)業(yè)圖譜