基于Python+Keras+OpenCV實(shí)現(xiàn)實(shí)時(shí)人臉活體檢測(cè)
你在互聯(lián)網(wǎng)上找到的大多數(shù)人臉識(shí)別算法和研究論文都會(huì)遭受照片攻擊。這些方法在檢測(cè)和識(shí)別來(lái)自網(wǎng)絡(luò)攝像頭的圖像、視頻和視頻流中的人臉?lè)矫媸欠浅S行,但是他們無(wú)法區(qū)分現(xiàn)實(shí)生活中的面孔和照片上的面孔。這種無(wú)法區(qū)別現(xiàn)實(shí)人臉的現(xiàn)象是由于這些算法是在二維幀上工作的,F(xiàn)在讓我們?nèi)ピ囅胍幌拢覀儗?shí)現(xiàn)一個(gè)人臉識(shí)別系統(tǒng),該系統(tǒng)可以很好地區(qū)分已知面孔和未知面孔,以便只有授權(quán)人員才能訪問(wèn),盡管如此,一個(gè)心懷不軌的人只要出示授權(quán)人的照片也能訪問(wèn)。至此一個(gè)3D人臉的識(shí)別系統(tǒng),類(lèi)似于蘋(píng)果的FaceID,應(yīng)運(yùn)而生了,但如果我們沒(méi)有3D探測(cè)器該怎么辦呢?
本文的目標(biāo)是實(shí)現(xiàn)一種基于眨眼檢測(cè)的人臉活體檢測(cè)算法,以抵抗照片攻擊。該算法通過(guò)網(wǎng)絡(luò)攝像頭實(shí)時(shí)工作,通過(guò)檢測(cè)眨眼來(lái)區(qū)分現(xiàn)實(shí)生活中的面孔和照片上的面孔。通俗地說(shuō),程序運(yùn)行如下:在網(wǎng)絡(luò)攝像頭生成的每個(gè)幀中檢測(cè)人臉。對(duì)于每個(gè)檢測(cè)到的臉,檢測(cè)眼睛。對(duì)于每個(gè)檢測(cè)到的眼睛,檢測(cè)眼睛是否睜開(kāi)或關(guān)閉。如果在某個(gè)時(shí)候檢測(cè)到眼睛是睜開(kāi)的,然后是閉著的,然后是睜開(kāi)的,我們就斷定此人已經(jīng)眨了眼睛,并且程序顯示他的名字(如果是人臉識(shí)別開(kāi)門(mén)器,我們將授權(quán)此人進(jìn)入)。對(duì)于人臉的檢測(cè)和識(shí)別,你需要安裝face_recognition庫(kù),它提供了非常有用的深度學(xué)習(xí)方法來(lái)查找和識(shí)別圖像中的人臉,特別是,face_locations、face_encodings和compare_faces函數(shù)是最有用的3個(gè)函數(shù)。人臉定位方法可以用兩種方法來(lái)檢測(cè)人臉:方向梯度直方圖(HoG)和卷積神經(jīng)網(wǎng)絡(luò)(CNN),由于時(shí)間限制,選擇了HoG方法。face_encodings函數(shù)是一個(gè)預(yù)先訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò),能夠?qū)D像編碼成128哥元素的一維特征向量,這個(gè)嵌入向量包含足夠的特征信息來(lái)區(qū)分兩個(gè)不同的人,最后,compare_faces計(jì)算兩個(gè)嵌入向量之間的距離。它將允許算法識(shí)別從攝像頭幀中提取的人臉,并將其嵌入向量與我們數(shù)據(jù)集中所有編碼的人臉進(jìn)行比較,距離最近的向量對(duì)應(yīng)于同一個(gè)人。1. 已知人臉數(shù)據(jù)集編碼在我的例子中,算法能夠識(shí)別我和奧巴馬,我為每個(gè)人挑選了大約10張照片。下面是處理和編碼已知人臉數(shù)據(jù)庫(kù)的代碼。def process_and_encode(images):
known_encodings = [] known_names = [] print("[LOG] Encoding dataset ...")
for image_path in tqdm(images): # 加載圖片 image = cv2.imread(image_path) # 將其從BGR轉(zhuǎn)換為RGB image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 檢測(cè)圖像中的臉并獲取其位置(方框坐標(biāo)) boxes = face_recognition.face_locations(image, model='hog')
# 將人臉編碼為128維嵌入向量 encoding = face_recognition.face_encodings(image, boxes)
# 人物名稱(chēng)是圖像來(lái)源文件夾的名稱(chēng) name = image_path.split(os.path.sep)[-2]
if len(encoding) > 0 : known_encodings.a(chǎn)ppend(encoding[0]) known_names.a(chǎn)ppend(name)
return {"encodings": known_encodings, "names": known_names}現(xiàn)在我們知道了每個(gè)想識(shí)別的人的編碼,我們可以嘗試通過(guò)網(wǎng)絡(luò)攝像頭識(shí)別人臉,然而,在轉(zhuǎn)到這一部分之前,我們需要區(qū)分一張人臉照片和一張活人的臉。2.人臉活體檢測(cè)我們的目標(biāo)是在某個(gè)點(diǎn)上檢測(cè)出一個(gè)睜閉的睜眼模式。我訓(xùn)練了一個(gè)卷積神經(jīng)網(wǎng)絡(luò)來(lái)分類(lèi)眼睛是閉著的還是睜著的,所選擇的模型是LeNet-5,它已經(jīng)在Closed Eyes In The Wild (CEW)數(shù)據(jù)集上進(jìn)行了訓(xùn)練,它由大約4800張24x24大小的眼睛圖像組成。Closed Eyes In The Wild (CEW)數(shù)據(jù)集地址:http://parnec.nuaa.edu.cn/xtan/data/ClosedEyeDatabases.htmlfrom keras.models
import Sequentialfrom keras.layers import Conv2Dfrom keras.layers import AveragePooling2Dfrom keras.layers import Flattenfrom keras.layers import Densefrom keras.preprocessing.image
import ImageDataGenerator
IMG_SIZE = 24def train(train_generator, val_generator): STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size STEP_SIZE_VALID=val_generator.n//val_generator.batch_size
model = Sequential()
model.a(chǎn)dd(Conv2D(filters=6, kernel_size=(3, 3), activation='relu', input_shape=(IMG_SIZE,IMG_SIZE,1))) model.a(chǎn)dd(AveragePooling2D())
model.a(chǎn)dd(Conv2D(filters=16, kernel_size=(3, 3), activation='relu')) model.a(chǎn)dd(AveragePooling2D())
model.a(chǎn)dd(Flatten())
model.a(chǎn)dd(Dense(units=120, activation='relu'))
model.a(chǎn)dd(Dense(units=84, activation='relu'))
model.a(chǎn)dd(Dense(units=1, activation = 'sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print('[LOG] Training CNN')
model.fit_generator(generator=train_generator,steps_per_epoch=STEP_SIZE_TRAIN,validation_data=val_generator,validation_steps=STEP_SIZE_VALID, epochs=20 ) return model在評(píng)估模型時(shí),我達(dá)到了94%的準(zhǔn)確率。每次我們檢測(cè)到一只眼睛,我們就用我們的模型來(lái)預(yù)測(cè)它的狀態(tài),并跟蹤每個(gè)人的眼睛狀態(tài),因此,檢測(cè)眨眼變得非常容易,它試圖在眼睛狀態(tài)歷史中找到一個(gè)閉眼-睜眼-閉眼的過(guò)程。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
圖片新聞
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車(chē)母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
-
小米汽車(chē)研發(fā)中心重磅落地,寶馬家門(mén)口“搶人”
最新活動(dòng)更多
-
即日-9.16點(diǎn)擊進(jìn)入 >> 【限時(shí)福利】TE 2025國(guó)際物聯(lián)網(wǎng)展·深圳站
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開(kāi)發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專(zhuān)題
- 1 先進(jìn)算力新選擇 | 2025華為算力場(chǎng)景發(fā)布會(huì)暨北京xPN伙伴大會(huì)成功舉辦
- 2 人形機(jī)器人,正狂奔在批量交付的曠野
- 3 宇樹(shù)機(jī)器人撞人事件的深度剖析:六維力傳感器如何成為人機(jī)安全的關(guān)鍵屏障
- 4 解碼特斯拉新AI芯片戰(zhàn)略 :從Dojo到AI5和AI6推理引擎
- 5 AI版“四萬(wàn)億刺激”計(jì)劃來(lái)了
- 6 騰訊 Q2 財(cái)報(bào)亮眼:AI 已成第二增長(zhǎng)曲線
- 7 2025年8月人工智能投融資觀察
- 8 9 Manus跑路,大廠掉線,只能靠DeepSeek了
- 10 a16z最新AI百?gòu)?qiáng)榜:硅谷頂級(jí)VC帶你讀懂全球生成式AI賽道最新趨勢(shì)