一文教你使用python+Keras检测年龄和性别
目标
本文的主要目的是通过给定的数据集检测年龄和性别。我们将使用简单的 python 和 Keras 方法来检测年龄和性别。
介绍
将摄像头、卫星、飞机以及日常生活中所拍摄的图像进行升级,称为图像处理。
基于分析的图像处理经历了许多不同的技术和计算。
图片中可获取信息的位置是非常必要的信息。图像包含的信息将被更改和调整以用于发现目的。
在面部识别策略中:面部包含的关节包含大量数据。当一个人与另一个人产生联系时,就会产生大量的想法。
思想的演变有助于确定某些界限。年龄评估是一个多层次的问题。不同年龄的人有不同的面部特征,因此很难将这些图像组合起来。
要确定几个人脸的年龄和性别的程序,后面有几种方法。从神经网络中,特征由卷积网络获取。根据准备好的模型,将图像处理为其中一个年龄段。框架的准备工作将进一步进行。
数据集
UTK 数据集包含 .csv 格式的年龄、性别、图像和像素。根据图像的年龄和性别检测已经研究了很长时间。多年来,人们采用不同的方法来处理这个问题。现在我们开始使用 Python 编程语言识别年龄和性别。
Keras 是 TensorFlow 库的接口。如果你需要一个允许简单快速的原型制作(通过易用性、隐蔽性和可扩展性)的深度学习库,请使用 Keras。Keras支持卷积网络和重复组织,可以在 CPU 和 GPU 上完美运行。
代码
#Import librariesimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsdf=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 arraydf1['pixels'] = df1['pixels'].apply(lambda x: np.reshape(np.array(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.add_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.age[k] im = df.pixels[k] plt.imshow(im, cmap='gray') plt.axis('off') plt.title(f'Gender:{gender}nAge:{age}nEthnicity:{ethnicity}') plt.tight_layout() plt.show()
图 1 通过简单的 Python 进行年龄和性别检测
Keras
Keras 是一个开源的神经网络库。它是用 Python 编写的,非常适合在由 Google 工程师 Francois Chollet 开发的 Theano、TensorFlow 或 CNTK 上运行。它易于理解、可扩展,特别适合于对复杂的神经组织进行更快的实验。
首先,我们将上传数据集所需的所有库。我们将使用 np.array 将所有列转换为数组,并转换为 dtype float。然后我们将数据集拆分为 xTrain、yTrain、yTest 和 xtest。最后,我们将依次应用模型并测试预测。
具体来说,首先,我们使用pandas、read_csv函数读取包含年龄、种族、性别、图像名称和像素五列的CSV文件。前五行是通过使用 DataFrame.head() 方法获得的。我们使用 NumPy 库将列名像素转换为数组,并使用 lambda 函数将它们重塑为 48、48 维。我们还通过相同的 lambda 函数转换了浮点数中的值。
我们将这些值进一步除以 255。
我们分配变量名以获取像素列的第一行。我们通过使用 matplotlib 进一步检查图像是否被看到。
导入库
import kerasimport jsonimport sysimport tensorflow as tffrom keras.layers import Inputimport numpy as npimport argparsefrom keras_applications.resnext import ResNeXt50from keras.utils.data_utils import get_fileimport face_recognitionimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport cv2from PIL import Imagedf=pd.read_csv("age_gender.csv")df.head()df1= pd.DataFrame(df)df1['pixels'] = df1.pixels.apply(lambda x: np.reshape(np.array(x.split(' '),dtype='float32'),(48,48)))df1['pixels']= df1['pixels']/255im = df1['pixels'][0]implt.imshow(im, cmap='gray')plt.axis('off')
图2 重塑后的图像
要将所有值转换为浮点数并对其进行重塑,我们使用了函数 for 和 NumPy。为了将年龄和性别存储在列表中,我们将使用另一个变量 labels_f。
稍后的模型将用于拟合数据并对其进行验证。
#收集所有图像并重塑它们,检查dtype。
X = np.zeros(shape=(23705,48,48))for i in range(len(df1["pixels"])): X[i] = df1["pixels"][i]X.dtypeOutput - dtype('float64')#Ageag = df1['age']ag=ag.astype(float)ag= np.array(ag)ag.shape
输出 - (23705,)
#性别
g= df1['gender']g=np.array(g)g.shape(23705,)labels_f =[]i=0while i (23705, 2, 1) 使用最常用的机器学习库 sklearn,将数据拆分为训练和测试。 #Splitting the data taking data setimport tensorflow as tffrom sklearn.model_selection import train_test_splitX_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 Dropoutfrom tensorflow.keras.layers import Flatten,BatchNormalizationfrom tensorflow.keras.layers import Dense, MaxPooling2D,Conv2Dfrom tensorflow.keras.layers import Input,Activation,Addfrom tensorflow.keras.models import Modelfrom tensorflow.keras.regularizers import l2from tensorflow.keras.optimizers import Adamimport tensorflow as tfdef 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 xdef 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 详细模型汇总 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.array([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 模型的年龄和性别检测。 结论 识别年龄和性别的任务是一个麻烦问题,比许多其他视觉任务更是如此。 这个问题漏洞的根本在于准备这些类型的框架所需的信息。虽然一般的文章发现通常可以处理数千甚至大量的图片以供准备,但具有年龄和性别名称的数据集要广泛得多,通常在大量或最好的情况下,数千Python获取的图像,模型在准确率上做得并不好,模型算法有待改进。
-
一文学会使用CNN进行人脸关键点识别
2021-09-08 -
一文了解均衡的秘密之FFE
2021-09-08 -
Linux从头学:一文理解【任务管理】和【任务切换】
2021-09-08 -
阿里GATNE:一文了解异构图的表示学习
2021-09-06 -
一文教你如何使用自动编码器进行图像去噪
2021-09-03 -
一文了解如何使用CNN进行图像分类
2021-09-02 -
一文带你破解DDOS攻击原理
2021-08-31 -
一文了解电磁兼容设计中的铁氧体EMI抑制器件
2021-08-31 -
一文了解如何在Python中使用自动编码器
2021-08-31 -
一文了解IOT超低功耗设计应用
2021-08-31 -
一文了解均衡的秘密之CTLE
2021-08-28 -
一文教你如何使用OpenCV为图像加水印
2021-08-26 -
一文教你使用OpenCV+CVzone进行实时背景替换
2021-08-25 -
一文带你重新思考BatchNorm中的Batch
2021-08-23 -
一文了解串行总线差分互连之模态转换
2021-08-23