一文教你使用python+Keras檢測(cè)年齡和性別
目標(biāo)
本文的主要目的是通過(guò)給定的數(shù)據(jù)集檢測(cè)年齡和性別。我們將使用簡(jiǎn)單的 python 和 Keras 方法來(lái)檢測(cè)年齡和性別。
介紹
將攝像頭、衛(wèi)星、飛機(jī)以及日常生活中所拍攝的圖像進(jìn)行升級(jí),稱為圖像處理。
基于分析的圖像處理經(jīng)歷了許多不同的技術(shù)和計(jì)算。
圖片中可獲取信息的位置是非常必要的信息。圖像包含的信息將被更改和調(diào)整以用于發(fā)現(xiàn)目的。
在面部識(shí)別策略中:面部包含的關(guān)節(jié)包含大量數(shù)據(jù)。當(dāng)一個(gè)人與另一個(gè)人產(chǎn)生聯(lián)系時(shí),就會(huì)產(chǎn)生大量的想法。
思想的演變有助于確定某些界限。年齡評(píng)估是一個(gè)多層次的問(wèn)題。不同年齡的人有不同的面部特征,因此很難將這些圖像組合起來(lái)。
要確定幾個(gè)人臉的年齡和性別的程序,后面有幾種方法。從神經(jīng)網(wǎng)絡(luò)中,特征由卷積網(wǎng)絡(luò)獲取。根據(jù)準(zhǔn)備好的模型,將圖像處理為其中一個(gè)年齡段?蚣艿臏(zhǔn)備工作將進(jìn)一步進(jìn)行。
數(shù)據(jù)集
UTK 數(shù)據(jù)集包含 .csv 格式的年齡、性別、圖像和像素。根據(jù)圖像的年齡和性別檢測(cè)已經(jīng)研究了很長(zhǎng)時(shí)間。多年來(lái),人們采用不同的方法來(lái)處理這個(gè)問(wèn)題,F(xiàn)在我們開始使用 Python 編程語(yǔ)言識(shí)別年齡和性別。
Keras 是 TensorFlow 庫(kù)的接口。如果你需要一個(gè)允許簡(jiǎn)單快速的原型制作(通過(guò)易用性、隱蔽性和可擴(kuò)展性)的深度學(xué)習(xí)庫(kù),請(qǐng)使用 Keras。Keras支持卷積網(wǎng)絡(luò)和重復(fù)組織,可以在 CPU 和 GPU 上完美運(yùn)行。
代碼
#Import libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df=pd.read_csv("age_gender.csv")
df1= pd.DataFrame(df)
plt.xlabel = 'Gender (1= Female, 0-Male)'
plt.figure(figsize=(10,7))
ax=df1.gender.value_counts().plot.bar(x='Gender (1= Female, 0-Male)', y='Count', title='Gender', legend = (1,0, ('Female', 'Male')))
plt.figure(figsize=(10,7))
labels =['White','Black','Indian','Asian','Hispanic']
ax=df1.ethnicity.value_counts().plot.bar()
ax.set_xticklabels(labels)
ax.set_title('Ethinicity')
## Converting pixels into numpy array
df1['pixels'] = df1['pixels'].a(chǎn)pply(lambda x: np.reshape(np.a(chǎn)rray(x.split(), dtype="float32"), (48,48)))
df1.head()
def plot_data(rows, cols, lower_value, upper_value):
fig = plt.figure(figsize=(cols*3,rows*4))
for i in range(1, cols*rows + 1):
k = np.random.randint(lower_value,upper_value)
fig.a(chǎn)dd_subplot(rows, cols, i) # adding sub plot
gender = gender_values_to_labels[df.gender[k]]
ethnicity = eth_values_to_labels[df.ethnicity[k]]
age = df.a(chǎn)ge[k]
im = df.pixels[k]
plt.imshow(im, cmap='gray')
plt.a(chǎn)xis('off')
plt.title(f'Gender:{gender}nAge:{age}nEthnicity:{ethnicity}')
plt.tight_layout()
plt.show()
圖 1 通過(guò)簡(jiǎn)單的 Python 進(jìn)行年齡和性別檢測(cè)
Keras
Keras 是一個(gè)開源的神經(jīng)網(wǎng)絡(luò)庫(kù)。它是用 Python 編寫的,非常適合在由 Google 工程師 Francois Chollet 開發(fā)的 Theano、TensorFlow 或 CNTK 上運(yùn)行。它易于理解、可擴(kuò)展,特別適合于對(duì)復(fù)雜的神經(jīng)組織進(jìn)行更快的實(shí)驗(yàn)。
首先,我們將上傳數(shù)據(jù)集所需的所有庫(kù)。我們將使用 np.a(chǎn)rray 將所有列轉(zhuǎn)換為數(shù)組,并轉(zhuǎn)換為 dtype float。然后我們將數(shù)據(jù)集拆分為 xTrain、yTrain、yTest 和 xtest。最后,我們將依次應(yīng)用模型并測(cè)試預(yù)測(cè)。
具體來(lái)說(shuō),首先,我們使用pandas、read_csv函數(shù)讀取包含年齡、種族、性別、圖像名稱和像素五列的CSV文件。前五行是通過(guò)使用 DataFrame.head() 方法獲得的。我們使用 NumPy 庫(kù)將列名像素轉(zhuǎn)換為數(shù)組,并使用 lambda 函數(shù)將它們重塑為 48、48 維。我們還通過(guò)相同的 lambda 函數(shù)轉(zhuǎn)換了浮點(diǎn)數(shù)中的值。
我們將這些值進(jìn)一步除以 255。
我們分配變量名以獲取像素列的第一行。我們通過(guò)使用 matplotlib 進(jìn)一步檢查圖像是否被看到。
導(dǎo)入庫(kù)
import keras
import json
import sys
import tensorflow as tf
from keras.layers import Input
import numpy as np
import argparse
from keras_applications.resnext import ResNeXt50
from keras.utils.data_utils import get_file
import face_recognition
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import cv2
from PIL import Image
df=pd.read_csv("age_gender.csv")df.head()df1= pd.DataFrame(df)
df1['pixels'] = df1.pixels.a(chǎn)pply(lambda x: np.reshape(np.a(chǎn)rray(x.split(' '),dtype='float32'),(48,48)))
df1['pixels']= df1['pixels']/255
im = df1['pixels'][0]
im
plt.imshow(im, cmap='gray')
plt.a(chǎn)xis('off')
圖2 重塑后的圖像
要將所有值轉(zhuǎn)換為浮點(diǎn)數(shù)并對(duì)其進(jìn)行重塑,我們使用了函數(shù) for 和 NumPy。為了將年齡和性別存儲(chǔ)在列表中,我們將使用另一個(gè)變量 labels_f。
稍后的模型將用于擬合數(shù)據(jù)并對(duì)其進(jìn)行驗(yàn)證。
#收集所有圖像并重塑它們,檢查dtype。
X = np.zeros(shape=(23705,48,48))
for i in range(len(df1["pixels"])):
X[i] = df1["pixels"][i]
X.dtype
Output - dtype('float64')
#Age
ag = df1['age']
ag=ag.a(chǎn)stype(float)
ag= np.a(chǎn)rray(ag)
ag.shape
輸出 - (23705,)
#性別
g= df1['gender']
g=np.a(chǎn)rray(g)
g.shape
(23705,)
labels_f =[]
i=0
while i
label.a(chǎn)ppend([a[i]])
label.a(chǎn)ppend([g[i]])
labels_f.a(chǎn)ppend(label)
i+=1
Both age and gender are combined and stored in labels_f, we will further convert the list into array.
labels_f =np.a(chǎn)rray(labels_f)
labels_f.shape
(23705, 2, 1)
使用最常用的機(jī)器學(xué)習(xí)庫(kù) sklearn,將數(shù)據(jù)拆分為訓(xùn)練和測(cè)試。
#Splitting the data taking data set
import tensorflow as tf
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test= train_test_split(X,a,test_size=0.25)
print(X_test.shape)
print(X_train.shape)
print(Y_test.shape)
print(Y_train.shape)
圖 3 X_train、X_test、Y_train 和 Y_test 的形狀輸出
Y_train_2=[Y_train[:,1],Y_train[:,0]]
Y_test_2=[Y_test[:,1],Y_test[:,0]]
#模型
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten,BatchNormalization
from tensorflow.keras.layers import Dense, MaxPooling2D,Conv2D
from tensorflow.keras.layers import Input,Activation,Add
from tensorflow.keras.models import Model
from tensorflow.keras.regularizers import l2
from tensorflow.keras.optimizers import Adam
import tensorflow as tf
def Convolution(input_tensor,filters):
x = Conv2D(filters=filters,kernel_size=(3, 3),padding = 'same',strides=(1, 1),kernel_regularizer=l2(0.001))(input_tensor)
x = Dropout(0.1)(x)
x= Activation('relu')(x)
return x
def model(input_shape):
inputs = Input((input_shape))
conv_1= Convolution(inputs,32)
maxp_1 = MaxPooling2D(pool_size = (2,2)) (conv_1)
conv_2 = Convolution(maxp_1,64)
maxp_2 = MaxPooling2D(pool_size = (2, 2)) (conv_2)
conv_3 = Convolution(maxp_2,128)
maxp_3 = MaxPooling2D(pool_size = (2, 2)) (conv_3)
conv_4 = Convolution(maxp_3,256)
maxp_4 = MaxPooling2D(pool_size = (2, 2)) (conv_4)
flatten= Flatten() (maxp_4)
dense_1= Dense(64,activation='relu')(flatten)
dense_2= Dense(64,activation='relu')(flatten)
drop_1=Dropout(0.2)(dense_1)
drop_2=Dropout(0.2)(dense_2)
output_1= Dense(1,activation="sigmoid",name='sex_out')(drop_1)
output_2= Dense(1,activation="relu",name='age_out')(drop_2)
model = Model(inputs=[inputs], outputs=[output_1,output_2])
model.compile(loss=["binary_crossentropy","mae"], optimizer="Adam",
metrics=["accuracy"])
return model
Model=model((48,48,1))
Model.summary()
圖 4 詳細(xì)模型匯總
History=Model.fit(X_train,Y_train_2,batch_size=64,validation_data=(X_test,Y_test_2),epochs=5,callbacks=[callback_list])
Model.evaluate(X_test,Y_test_2)
pred=Model.predict(X_test)
pred[1]
#繪制圖像
def test_image(ind,X,Model):
plt.imshow(X[ind])
image_test=X[ind]
pred_1=Model.predict(np.a(chǎn)rray([image_test]))
sex_f=['Female','Male']
age=int(np.round(pred_1[1][0]))
sex=int(np.round(pred_1[0][0]))
print("Predicted Age: "+ str(age))
print("Predicted Sex: "+ sex_f[sex])
test_image(1980,X, Model)
圖 5 模型的年齡和性別檢測(cè)。
結(jié)論
識(shí)別年齡和性別的任務(wù)是一個(gè)麻煩問(wèn)題,比許多其他視覺任務(wù)更是如此。
這個(gè)問(wèn)題漏洞的根本在于準(zhǔn)備這些類型的框架所需的信息。雖然一般的文章發(fā)現(xiàn)通?梢蕴幚頂(shù)千甚至大量的圖片以供準(zhǔn)備,但具有年齡和性別名稱的數(shù)據(jù)集要廣泛得多,通常在大量或最好的情況下,數(shù)千Python獲取的圖像,模型在準(zhǔn)確率上做得并不好,模型算法有待改進(jìn)。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市