广西民族大学高级人工智能课程—头歌实践教学实践平台-目标定位

代码文件

import os

import numpy as np  # linear algebra
np.random.seed(2022)
import pandas as pd  # data processing
from sklearn.model_selection import train_test_split

id_lookup_table = "facial-keypoints-detection/IdLookupTable.csv"
sample_Submission = "facial-keypoints-detection/SampleSubmission.csv"

# 读取数据集
train_df = pd.read_csv('training.csv')
idLookupTable = pd.read_csv(id_lookup_table)
sampleSumission = pd.read_csv(sample_Submission)

# 缺失值填充
train_df.fillna(method='ffill', inplace=True)

# 处理训练数据
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.append(img)
x_train = np.array(imageArr, dtype='float')
x_train = x_train.reshape(-1, 96, 96, 1)
print(x_train.shape)

keypoints_df = train_df.drop('Image', axis=1)
y_train = np.array(keypoints_df, dtype='float')
print(y_train.shape)

x_train, x_test, y_train, y_test = train_test_split(x_train, y_train)

from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D, BatchNormalization, Flatten, Dense, Dropout
from keras.layers.advanced_activations import LeakyReLU

# 构建模型
model = Sequential()
model.add(Convolution2D(32, (3, 3), padding='same', use_bias=False, input_shape=(96, 96, 1)))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Convolution2D(32, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

########## Begin ##########
# 卷积层,卷积核数为 64,卷积核大小为 (3, 3),padding 为 same,use_bias 设置为 False
model.add(Convolution2D(64, (3, 3), padding='same', use_bias=False))

# 激活函数层
model.add(LeakyReLU(alpha=0.1))

# 批标准化层
model.add(BatchNormalization())
########## End ##########

model.add(Convolution2D(64, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(96, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Convolution2D(96, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(128, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Convolution2D(128, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(256, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Convolution2D(256, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(512, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Convolution2D(512, (3, 3), padding='same', use_bias=False))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())

model.add(Flatten())
########## Begin ##########
# 全连接层,神经元数为 512 个,激活函数为 relu
model.add(Dense(512, activation='relu'))

# 随机将 10% 的神经元的失去活性
model.add(Dropout(0.1))

# 全连接层,神经元数为 30 个
model.add(Dense(30))

########## End ##########

model.summary()
# 加载模型
model.load_weights('model_weights.h5')

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)
# model.save_weights('model_weights.h5')


########## Begin ##########
# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
########## End ##########

题目描述

任务描述

本关任务:使用 CNN 完成人脸定位案例。

相关知识

为了完成本关任务,你需要掌握:

  1. 算法介绍
  2. 程序和编程
  3. 人脸定位的应用
算法介绍

利用卷积神经网络和计算机视觉技术进行人脸关键点检测,对人脸的重要区域(如眼睛、嘴角和鼻子)进行标记,这些区域与各种任务(如人脸滤波、情感识别和姿势识别)相关。

它需要预测特定面部的面部关键点坐标,例如鼻尖、眼睛中心等。为了识别面部关键点,我们使用基于卷积神经网络的模型使用自动编码器。

卷积神经网络 (CNN) 具有深层结构,允许它们提取高级信息并在识别每个重要点时提供更好的精度。卷积网络旨在同时预测所有点。

图 1-1

程序和编程

导入 NumPy 和 pandas 库:

 
  1. import numpy as np # linear algebra
  2. import pandas as pd # data processing
  3. import os
  4. for directoryname, _, filenames in os.walk('/kaggle/input'):
  5. for filename in filenames:
  6. print(os.path.join(directoryname, filename))

你写入当前目录的任何输出都会被存储。

下一步是为训练和测试数据的每个文件设置路径,

 
  1. train_zip_path = "../input/facial-keypoints-detection/training.zip"
  2. test_zip_path = "../input/facial-keypoints-detection/test.zip"
  3. id_lookup_table = "../input/facial-keypoints-detection/IdLookupTable.csv"
  4. sample_Submission = "../input/facial-keypoints-detection/SampleSubmission.csv"

让我们使用 zip 文件解压 zip 文件,然后加载数据集。

 
  1. import zipfile
  2. with zipfile.ZipFile(train_zip_path,'r') as zip_ref:
  3. zip_ref.extractall('')
  4. with zipfile.ZipFile(test_zip_path,'r') as zip_ref:
  5. zip_ref.extractall('')
  6. train_df = pd.read_csv('training.csv')
  7. test_df = pd.read_csv('test.csv')
  8. idLookupTable = pd.read_csv(id_lookup_table)
  9. sampleSumission = pd.read_csv(sample_Submission)

加载数据集后,我们可以使用 pandas 的库查看数据框,并列出数据集的头部。

 
  1. train_df.info()

图 1-2

填充 Nan 值并分离和重塑输入值(x_train)

 
  1. train_df.fillna(method='ffill',inplace=True)

在训练数据集中分离和重塑输入值(x_train):

使用图像创建一个数组,keypoints:关键点将是我们数据集的一个样本。我们的数据集将接受一个可选的参数转换,允许我们对样本执行任何必要的处理。

 
  1. image_df = train_df['Image']
  2. imageArr = []
  3. for i in range(0,len(image_df)):
  4. img = image_df[i].split()
  5. img = ['0' if x == '' else x for x in img]
  6. imageArr.append(img)
  7. x_train = np.array(imageArr,dtype='float')
  8. x_train = x_train.reshape(-1,96,96,1)
  9. print(x_train.shape)

创建一个以图片为输入输出关键点的CNN:

输入图片大小为 224 * 224 px(由 transform 决定),输出类分数为 136,即 136/2 = 68。(我们想要的 68 个关键点)和分离目标值。

 
  1. keypoints_df = train_df.drop('Image',axis = 1)
  2. y_train = np.array(keypoints_df,dtype='float')
  3. print(y_train.shape)
 
  1. def visualizeWithNoKeypoints(index):
  2. plt.imshow(x_train[index].reshape(96,96),cmap='gray')
  3. def visualizeWithKeypoints(index):
  4. plt.imshow(x_train[index].reshape(96,96),cmap='gray')
  5. for i in range(1,31,2):
  6. plt.plot(y_train[0][i-1],y_train[0][i],'ro')

在我们编写了可视化函数之后,接下来,我们可以使用函数调用来可视化每个图像。

 
  1. import matplotlib.pyplot as plt
  2. fig = plt.figure(figsize=(8,4))
  3. fig.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)
  4. plt.subplot(1,2,1)
  5. visualizeWithNoKeypoints(1)
  6. plt.subplot(1,2,2)
  7. visualizeWithKeypoints(1)

图 1-3

数据已经预处理完毕。现在是创建训练模型的时候了。

为了创建我们的 CNN 模型,我们将使用 Keras 框架。

 
  1. from keras.models import Sequential, Model
  2. from keras.layers import Activation, Convolution2D,MaxPooling2D,BatchNormalization, Flatten, Dense, Dropout
  3. from keras.layers.advanced_activations import LeakyReLU

最初只从一两个 epoch 开始,以快速评估你的模型是如何训练的,并确定你是否应该改变其结构或超参数。

在训练时跟踪模型的损失如何随时间变化:它是否首先快速减少,然后减速?

在训练多个时期并创建最终模型之前,使用这些初始观察对模型进行更改并决定最佳架构。

 
  1. model = Sequential()
  2. model.add(Convolution2D(32,(3,3),padding='same',use_bias=False, input_shape=(96,96,1)))
  3. model.add(LeakyReLU(alpha = 0.1))
  4. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(32,(3,3),padding='same',use_bias = False))
  2. model.add(LeakyReLU(alpha=0.1))
  3. model.add(BatchNormalization())
  4. model.add(MaxPooling2D(pool_size=(2,2)))
 
  1. model.add(Convolution2D(64,(3,3),padding='same',use_bias = False))
  2. model.add(LeakyReLU(alpha=0.1))
  3. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(64, (3,3), padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
  4. model.add(MaxPooling2D(pool_size=(2, 2)))
 
  1. model.add(Convolution2D(96, (3,3), padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(96, (3,3), padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
  4. model.add(MaxPooling2D(pool_size=(2, 2)))
  5. model.add(Convolution2D(128, (3,3),padding='same', use_bias=False))
  6. # model.add(BatchNormalization())
  7. model.add(LeakyReLU(alpha = 0.1))
  8. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(128, (3,3),padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
  4. model.add(MaxPooling2D(pool_size=(2, 2)))
 
  1. model.add(Convolution2D(256, (3,3),padding='same',use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(256, (3,3),padding='same',use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
  4. model.add(MaxPooling2D(pool_size=(2, 2)))
 
  1. model.add(Convolution2D(512, (3,3), padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
 
  1. model.add(Convolution2D(512, (3,3), padding='same', use_bias=False))
  2. model.add(LeakyReLU(alpha = 0.1))
  3. model.add(BatchNormalization())
 
  1. model.add(Flatten())
 
  1. model.add(Dense(512,activation='relu'))
  2. model.add(Dropout(0.1))
  3. model.add(Dense(30))
 
  1. model.summary()

图 1-4

下一步是配置模型:

 
  1. model.compile(optimizer='adam',loss='mean_squared_error',metrics=['mae','acc'])
 
  1. model.fit(x_train,y_train,batch_size=256,epochs=45,validation_split=2.0)

训练输出示例:

图 1-5

在整个训练数据集中执行了总共 50 次迭代。

已经学习了如何简单地使用 CNN 来训练深度学习模型。

现在是时候使用数据收集对模型进行测试了。

我们必须首先准备我们的测试集。

x_test:分离和重塑输入测试值。

 
  1. image_df = test_df['Image']
  2. keypoints_df = test_df.drop('Image', axis=1)
  3. imageArr = []
  4. for i in range(0, len(image_df)):
  5. img = image_df[i].split()
  6. img = ['0' if x == '' else x for x in img]
  7. imageArr.append(img)
 
  1. x_test = np.array(imageArr, dtype='float')
  2. x_test = x_test.reshape(-1, 96, 96, 1)
  3. print(x_test.shape)

我们知道要在测试数据集中分离目标值 (y_test)。

 
  1. y_test = np.array(keypoints_df, dtype='float')
  2. print(y_test.shape)

现在,是时候预测训练模型的结果了:

 
  1. pred = model.predict(x_test)
 
  1. idLookupTable.head()

图 1-6

人脸定位的应用

该技术的适用性是多种多样的。以下只是当今企业界中一些更有趣的面部识别应用。

脸部视频特效

用有趣的东西覆盖人脸照片的面部过滤器越来越受欢迎。它们通常出现在社交媒体平台上。此过滤器应用程序中使用了面部关键点(或“关键点”)检测技术。

可以评估一个人的面部表情(以及情绪)的面部重要区域被称为面部关键点。它们对于开发实时应用程序以检测困倦、评估生物特征和读取人们的情绪至关重要。

图 1-7

虚拟现实和增强现实 (AR)

几个流行的智能手机应用程序中使用了面部关键点识别。Instagram、Snapchat 和 LINE 上的面部过滤器就是一些众所周知的例子。AR 软件可以通过识别用户面部关键点,实时将图片滤镜正确叠加在用户面部上。

图 1-8

编程要求

根据提示,在右侧编辑器补充代码,使用 CNN 构建人脸定位模型并使用模型预测测试数据的类别。

测试说明

平台会对你编写的代码进行测试:

预期输出:

 
  1. _________________________________________________________________
  2. Layer (type) Output Shape Param #
  3. =================================================================
  4. conv2d_1 (Conv2D) (None, 96, 96, 32) 288
  5. _________________________________________________________________
  6. leaky_re_lu_1 (LeakyReLU) (None, 96, 96, 32) 0
  7. _________________________________________________________________
  8. batch_normalization_1 (Batch (None, 96, 96, 32) 128
  9. _________________________________________________________________
  10. conv2d_2 (Conv2D) (None, 96, 96, 32) 9216
  11. _________________________________________________________________
  12. leaky_re_lu_2 (LeakyReLU) (None, 96, 96, 32) 0
  13. _________________________________________________________________
  14. batch_normalization_2 (Batch (None, 96, 96, 32) 128
  15. _________________________________________________________________
  16. max_pooling2d_1 (MaxPooling2 (None, 48, 48, 32) 0
  17. _________________________________________________________________
  18. conv2d_3 (Conv2D) (None, 48, 48, 64) 18432
  19. _________________________________________________________________
  20. leaky_re_lu_3 (LeakyReLU) (None, 48, 48, 64) 0
  21. _________________________________________________________________
  22. batch_normalization_3 (Batch (None, 48, 48, 64) 256
  23. _________________________________________________________________
  24. conv2d_4 (Conv2D) (None, 48, 48, 64) 36864
  25. _________________________________________________________________
  26. leaky_re_lu_4 (LeakyReLU) (None, 48, 48, 64) 0
  27. _________________________________________________________________
  28. batch_normalization_4 (Batch (None, 48, 48, 64) 256
  29. _________________________________________________________________
  30. max_pooling2d_2 (MaxPooling2 (None, 24, 24, 64) 0
  31. _________________________________________________________________
  32. conv2d_5 (Conv2D) (None, 24, 24, 96) 55296
  33. _________________________________________________________________
  34. leaky_re_lu_5 (LeakyReLU) (None, 24, 24, 96) 0
  35. _________________________________________________________________
  36. batch_normalization_5 (Batch (None, 24, 24, 96) 384
  37. _________________________________________________________________
  38. conv2d_6 (Conv2D) (None, 24, 24, 96) 82944
  39. _________________________________________________________________
  40. leaky_re_lu_6 (LeakyReLU) (None, 24, 24, 96) 0
  41. _________________________________________________________________
  42. batch_normalization_6 (Batch (None, 24, 24, 96) 384
  43. _________________________________________________________________
  44. max_pooling2d_3 (MaxPooling2 (None, 12, 12, 96) 0
  45. _________________________________________________________________
  46. conv2d_7 (Conv2D) (None, 12, 12, 128) 110592
  47. _________________________________________________________________
  48. leaky_re_lu_7 (LeakyReLU) (None, 12, 12, 128) 0
  49. _________________________________________________________________
  50. batch_normalization_7 (Batch (None, 12, 12, 128) 512
  51. _________________________________________________________________
  52. conv2d_8 (Conv2D) (None, 12, 12, 128) 147456
  53. _________________________________________________________________
  54. leaky_re_lu_8 (LeakyReLU) (None, 12, 12, 128) 0
  55. _________________________________________________________________
  56. batch_normalization_8 (Batch (None, 12, 12, 128) 512
  57. _________________________________________________________________
  58. max_pooling2d_4 (MaxPooling2 (None, 6, 6, 128) 0
  59. _________________________________________________________________
  60. conv2d_9 (Conv2D) (None, 6, 6, 256) 294912
  61. _________________________________________________________________
  62. leaky_re_lu_9 (LeakyReLU) (None, 6, 6, 256) 0
  63. _________________________________________________________________
  64. batch_normalization_9 (Batch (None, 6, 6, 256) 1024
  65. _________________________________________________________________
  66. conv2d_10 (Conv2D) (None, 6, 6, 256) 589824
  67. _________________________________________________________________
  68. leaky_re_lu_10 (LeakyReLU) (None, 6, 6, 256) 0
  69. _________________________________________________________________
  70. batch_normalization_10 (Batc (None, 6, 6, 256) 1024
  71. _________________________________________________________________
  72. max_pooling2d_5 (MaxPooling2 (None, 3, 3, 256) 0
  73. _________________________________________________________________
  74. conv2d_11 (Conv2D) (None, 3, 3, 512) 1179648
  75. _________________________________________________________________
  76. leaky_re_lu_11 (LeakyReLU) (None, 3, 3, 512) 0
  77. _________________________________________________________________
  78. batch_normalization_11 (Batc (None, 3, 3, 512) 2048
  79. _________________________________________________________________
  80. conv2d_12 (Conv2D) (None, 3, 3, 512) 2359296
  81. _________________________________________________________________
  82. leaky_re_lu_12 (LeakyReLU) (None, 3, 3, 512) 0
  83. _________________________________________________________________
  84. batch_normalization_12 (Batc (None, 3, 3, 512) 2048
  85. _________________________________________________________________
  86. flatten_1 (Flatten) (None, 4608) 0
  87. _________________________________________________________________
  88. dense_1 (Dense) (None, 512) 2359808
  89. _________________________________________________________________
  90. dropout_1 (Dropout) (None, 512) 0
  91. _________________________________________________________________
  92. dense_2 (Dense) (None, 30) 15390
  93. =================================================================
  94. Total params: 7,268,670
  95. Trainable params: 7,264,318
  96. Non-trainable params: 4,352
  97. _________________________________________________________________
  98. Test score: 1.7251816006864396
  99. Test accuracy: 0.8401128589532217

开始你的任务吧,祝你成功!

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值