一文學(xué)會(huì)使用CNN進(jìn)行人臉關(guān)鍵點(diǎn)識(shí)別
項(xiàng)目概況
該項(xiàng)目的目標(biāo)是預(yù)測(cè)面部圖片上關(guān)鍵點(diǎn)的位置。這可以用作各種應(yīng)用程序中的組件,包括:
圖片和視頻中的人臉識(shí)別。
面部表情的研究。
用于醫(yī)學(xué)診斷,識(shí)別畸形面部癥狀。
識(shí)別面部關(guān)鍵點(diǎn)是一個(gè)很難解決的話題。人與人的面部特征差異很大,即使在一個(gè)人內(nèi),由于 3D 姿勢(shì)、大小、位置、視角和照明環(huán)境,也會(huì)存在很多差異。盡管計(jì)算機(jī)視覺(jué)研究在解決這些問(wèn)題方面取得了長(zhǎng)足的進(jìn)步,但仍有許多可以改進(jìn)的領(lǐng)域。
目錄
介紹
先決條件
程序和編程
面部關(guān)鍵點(diǎn)檢測(cè)的有用應(yīng)用
介紹
利用卷積神經(jīng)網(wǎng)絡(luò)和計(jì)算機(jī)視覺(jué)技術(shù)進(jìn)行人臉關(guān)鍵點(diǎn)檢測(cè),對(duì)人臉的重要區(qū)域(如眼睛、嘴角和鼻子)進(jìn)行標(biāo)記,這些區(qū)域與各種任務(wù)(如人臉濾波、情感識(shí)別和姿勢(shì)識(shí)別)相關(guān)。
它需要預(yù)測(cè)特定面部的面部關(guān)鍵點(diǎn)坐標(biāo),例如鼻尖、眼睛中心等。為了識(shí)別面部關(guān)鍵點(diǎn),我們使用基于卷積神經(jīng)網(wǎng)絡(luò)的模型使用自動(dòng)編碼器。
卷積神經(jīng)網(wǎng)絡(luò) (CNN) 具有深層結(jié)構(gòu),允許它們提取高級(jí)信息并在識(shí)別每個(gè)重要點(diǎn)時(shí)提供更好的精度。卷積網(wǎng)絡(luò)旨在同時(shí)預(yù)測(cè)所有點(diǎn)。

先決條件
因?yàn)樯窠?jīng)網(wǎng)絡(luò)經(jīng)常需要標(biāo)準(zhǔn)化的圖片,所以它們應(yīng)該有一個(gè)恒定的大小,顏色范圍和坐標(biāo)的標(biāo)準(zhǔn)化范圍,并從 NumPy 列表和數(shù)組轉(zhuǎn)換為 Tensor 和 Keras(用于 PyTorch)。因此,需要進(jìn)行一些預(yù)處理。
程序和編程
我正在使用 Kaggle 數(shù)據(jù)集來(lái)訓(xùn)練模型,你可以通過(guò)運(yùn)行 API 命令下載它kaggle competitions download -c facial-keypoints-detection
導(dǎo)入 NumPy 和 pandas 庫(kù):import numpy as np # linear algebra
import pandas as pd # data processing
import os
for directoryname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(directoryname, filename))
你寫(xiě)入當(dāng)前目錄的任何輸出都會(huì)被存儲(chǔ)。下一步是為訓(xùn)練和測(cè)試數(shù)據(jù)的每個(gè)文件設(shè)置路徑,train_zip_path = "../input/facial-keypoints-detection/training.zip"
test_zip_path = "../input/facial-keypoints-detection/test.zip"
id_lookup_table = "../input/facial-keypoints-detection/IdLookupTable.csv"
sample_Submission = "../input/facial-keypoints-detection/SampleSubmission.csv"
讓我們使用 zip 文件解壓 zip 文件,然后加載數(shù)據(jù)集。import zipfile
with zipfile.ZipFile(train_zip_path,'r') as zip_ref:
zip_ref.extractall('')
with zipfile.ZipFile(test_zip_path,'r') as zip_ref:
zip_ref.extractall('')
train_df = pd.read_csv('training.csv')
test_df = pd.read_csv('test.csv')
idLookupTable = pd.read_csv(id_lookup_table)
sampleSumission = pd.read_csv(sample_Submission)
加載數(shù)據(jù)集后,我們可以使用pandas的庫(kù)查看數(shù)據(jù)框,并列出數(shù)據(jù)集的頭部。train_df.info()

填充 Nan 值并分離和重塑輸入值(x_train) train_df.fillna(method='ffill',inplace=True)
在訓(xùn)練數(shù)據(jù)集中分離和重塑輸入值(x_train):使用圖像創(chuàng)建一個(gè)數(shù)組,keypoints:關(guān)鍵點(diǎn)將是我們數(shù)據(jù)集的一個(gè)樣本。我們的數(shù)據(jù)集將接受一個(gè)可選的參數(shù)轉(zhuǎn)換,允許我們對(duì)樣本執(zhí)行任何必要的處理。image_df = train_df['Image']
imageArr = []
for i in range(0,len(image_df)):
img = image_df[i].split()
img = ['0' if x == '' else x for x in img]
imageArr.a(chǎn)ppend(img)
x_train = np.a(chǎn)rray(imageArr,dtype='float')
x_train = x_train.reshape(-1,96,96,1)
print(x_train.shape)
創(chuàng)建一個(gè)以圖片為輸入輸出關(guān)鍵點(diǎn)的CNN:輸入圖片大小為224*224px(由transform決定),輸出類分?jǐn)?shù)為136,即136/2 = 68。(我們想要的68個(gè)關(guān)鍵點(diǎn))和分離目標(biāo)值keypoints_df = train_df.drop('Image',axis = 1)
y_train = np.a(chǎn)rray(keypoints_df,dtype='float')
print(y_train.shape)
def visualizeWithNoKeypoints(index):
plt.imshow(x_train[index].reshape(96,96),cmap='gray')
def visualizeWithKeypoints(index):
plt.imshow(x_train[index].reshape(96,96),cmap='gray')
for i in range(1,31,2):
plt.plot(y_train[0][i-1],y_train[0][i],'ro')
在我們編寫(xiě)了可視化函數(shù)之后,接下來(lái),我們可以使用函數(shù)調(diào)用來(lái)可視化每個(gè)圖像import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,4))
fig.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)
plt.subplot(1,2,1)
visualizeWithNoKeypoints(1)
plt.subplot(1,2,2)
visualizeWithKeypoints(1)

數(shù)據(jù)已經(jīng)預(yù)處理完畢。現(xiàn)在是創(chuàng)建訓(xùn)練模型的時(shí)候了。為了創(chuàng)建我們的 CNN 模型,我們將使用 Keras 框架。from keras.models import Sequential, Model
from keras.layers import Activation, Convolution2D,MaxPooling2D,BatchNormalization, Flatten, Dense, Dropout
from keras.layers.a(chǎn)dvanced_activations import LeakyReLU
最初只從一兩個(gè) epoch 開(kāi)始,以快速評(píng)估你的模型是如何訓(xùn)練的,并確定你是否應(yīng)該改變其結(jié)構(gòu)或超參數(shù)。在訓(xùn)練時(shí)跟蹤模型的損失如何隨時(shí)間變化:它是否首先快速減少,然后減速?在訓(xùn)練多個(gè)時(shí)期并創(chuàng)建最終模型之前,使用這些初始觀察對(duì)模型進(jìn)行更改并決定最佳架構(gòu)。model = Sequential()
model.a(chǎn)dd(Convolution2D(32,(3,3),padding='same',use_bias=False, input_shape=(96,96,1)))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(32,(3,3),padding='same',use_bias = False))
model.a(chǎn)dd(LeakyReLU(alpha=0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(MaxPooling2D(pool_size=(2,2)))
model.a(chǎn)dd(Convolution2D(64,(3,3),padding='same',use_bias = False))
model.a(chǎn)dd(LeakyReLU(alpha=0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(64, (3,3), padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(MaxPooling2D(pool_size=(2, 2)))
model.a(chǎn)dd(Convolution2D(96, (3,3), padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(96, (3,3), padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(MaxPooling2D(pool_size=(2, 2)))
model.a(chǎn)dd(Convolution2D(128, (3,3),padding='same', use_bias=False))
# model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(128, (3,3),padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(MaxPooling2D(pool_size=(2, 2)))
model.a(chǎn)dd(Convolution2D(256, (3,3),padding='same',use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(256, (3,3),padding='same',use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(MaxPooling2D(pool_size=(2, 2)))
model.a(chǎn)dd(Convolution2D(512, (3,3), padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Convolution2D(512, (3,3), padding='same', use_bias=False))
model.a(chǎn)dd(LeakyReLU(alpha = 0.1))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Flatten())
model.a(chǎn)dd(Dense(512,activation='relu'))
model.a(chǎn)dd(Dropout(0.1))
model.a(chǎn)dd(Dense(30))
model.summary()

下一步是配置模型:model.compile(optimizer='adam',loss='mean_squared_error',metrics=['mae','acc'])
model.fit(x_train,y_train,batch_size=256,epochs=45,validation_split=2.0)
示例輸出:

在整個(gè)訓(xùn)練數(shù)據(jù)集中執(zhí)行了總共 50 次迭代。我們已經(jīng)學(xué)會(huì)了如何簡(jiǎn)單地使用 CNN 來(lái)訓(xùn)練深度學(xué)習(xí)模型。現(xiàn)在是時(shí)候使用我們的數(shù)據(jù)收集對(duì)模型進(jìn)行測(cè)試了。我們必須首先準(zhǔn)備我們的測(cè)試集。test_df.isnull().a(chǎn)ny()
x 測(cè)試:分離和重塑輸入測(cè)試值image_df = test_df['Image']
keypoints_df = test_df.drop('Image',axis = 1)
imageArr = []
for i in range(0,len(image_df)):
img = image_df[i].split()
img = ['0' if x=='' else x for x in img]
imageArr.a(chǎn)ppend(img)
x_test = np.array(imageArr,dtype='float')
x_test = x_test.reshape(-1,96,96,1)
print(x_test.shape)
我們知道要在測(cè)試數(shù)據(jù)集中分離目標(biāo)值 (y_test)y_test = np.array(keypoints_df,dtype='float')
print(y_test.shape)
現(xiàn)在,是時(shí)候預(yù)測(cè)訓(xùn)練模型的結(jié)果了:pred = model.predict(x_test)
idLookupTable.head()
我們已經(jīng)學(xué)習(xí)了如何簡(jiǎn)單地使用 CNN 構(gòu)建深度學(xué)習(xí)面部關(guān)鍵點(diǎn)檢測(cè)模型。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

落地?zé)o錫!京東首個(gè)物流機(jī)器人超級(jí)工廠來(lái)了
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
最新活動(dòng)更多
-
即日-5.20立即下載>> 【限時(shí)免費(fèi)】物理場(chǎng)仿真助力生物醫(yī)學(xué)領(lǐng)域技術(shù)創(chuàng)新
-
精彩回顧立即查看>> 【直播】 智測(cè)未來(lái)·2026海克斯康春季產(chǎn)品創(chuàng)新日
-
精彩回顧立即查看>> 【線下論壇】新唐科技×芯唐南京 2026 年度研討會(huì)
-
精彩回顧立即查看>> OFweek 2026(第十五屆)中國(guó)機(jī)器人產(chǎn)業(yè)大會(huì)
-
精彩回顧立即查看>> 維科杯· OFweek 2025中國(guó)機(jī)器人行業(yè)年度評(píng)選
-
精彩回顧立即查看>> 【在線會(huì)議】液冷服務(wù)器信號(hào)完整性及冷卻液關(guān)鍵電參數(shù)測(cè)試
推薦專題
- 1 AI狂歡遇上油價(jià)破百,全球股市還能漲多久? | 產(chǎn)聯(lián)看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實(shí)測(cè):中文穩(wěn)、細(xì)節(jié)炸,設(shè)計(jì)師慌了
- 3 6000億美元估值錨定:字節(jié)跳動(dòng)的“去單一化”突圍與估值重構(gòu)
- 4 Tesla AI5芯片最新進(jìn)展總結(jié)
- 5 連夜測(cè)了一波DeepSeek-V4,我發(fā)現(xiàn)它可能只剩“審美”這個(gè)短板了
- 6 熱點(diǎn)丨AI“瑜亮之爭(zhēng)”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤(pán):9秒刪庫(kù)跑路,全員被封號(hào),還繼續(xù)扣錢(qián)!
- 8 2026,人形機(jī)器人只贏了面子
- 9 DeepSeek降價(jià)90%:價(jià)格屠夫不是身份,是戰(zhàn)略
- 10 AI Infra產(chǎn)業(yè)鏈卡在哪里了?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市







分享





