前言
本文是对kaggle上的Facial Keypoints Detection数据进行训练,通过简单的cnn网络以预测面部关键点,顺便看看还能做点啥.
代码
先贴代码,都是比较基础的
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
df = pd.read_csv("./data/training.csv")
df.columns
df.head(3).T
df.info()
df.shape[0] - df.isnull().any(axis=1).sum()
df.fillna(method='ffill', inplace=True)
# df.dropna()
img = df['Image'].iloc[0]
points = y[0]
plt.imshow(img, cmap='gray')
plt.scatter(points[::2], points[1::2], c='red')
plt.show()
数据预览
df.columns
可以看到数据集一共有31维,前30列是每个特征点的坐标,共15个特征点,最后一列是图像的数据
Index(['left_eye_center_x', 'left_eye_center_y', 'right_eye_center_x',
'right_eye_center_y', 'left_eye_inner_corner_x',
'left_eye_inner_corner_y', 'left_eye_outer_corner_x',
'left_eye_outer_corner_y', 'right_eye_inner_corner_x',
'right_eye_inner_corner_y', 'right_eye_outer_corner_x',
'right_eye_outer_corner_y', 'left_eyebrow_inner_end_x',
'left_eyebrow_inner_end_y', 'left_eyebrow_outer_end_x',
'left_eyebrow_outer_end_y', 'right_eyebrow_inner_end_x',
'right_eyebrow_inner_end_y', 'right_eyebrow_outer_end_x',
'right_eyebrow_outer_end_y', 'nose_tip_x', 'nose_tip_y',
'mouth_left_corner_x', 'mouth_left_corner_y', 'mouth_right_corner_x',
'mouth_right_corner_y', 'mouth_center_top_lip_x',
'mouth_center_top_lip_y', 'mouth_center_bottom_lip_x',
'mouth_center_bottom_lip_y', 'Image'],
dtype='object')
df.head(3).T
df.info()
数据集总共7049个样本,其中一些数据的特征点并不完整,可能是侧脸导致,或者是数据缺失,也就是说,完整的数据最多2225个,检验下
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7049 entries, 0 to 7048
Data columns (total 31 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 left_eye_center_x 7039 non-null float64
1 left_eye_center_y 7039 non-null float64
2 right_eye_center_x 7036 non-null float64
3 right_eye_center_y 7036 non-null float64
4 left_eye_inner_corner_x 2271 non-null float64
5 left_eye_inner_corner_y 2271 non-null float64
6 left_eye_outer_corner_x 2267 non-null float64
7 left_eye_outer_corner_y 2267 non-null float64
8 right_eye_inner_corner_x 2268 non-null float64
9 right_eye_inner_corner_y 2268 non-null float64
10 right_eye_outer_corner_x 2268 non-null float64
11 right_eye_outer_corner_y 2268 non-null float64
12 left_eyebrow_inner_end_x 2270 non-null float64
13 left_eyebrow_inner_end_y 2270 non-null float64
14 left_eyebrow_outer_end_x 2225 non-null float64
15 left_eyebrow_outer_end_y 2225 non-null float64
16 right_eyebrow_inner_end_x 2270 non-null float64
17 right_eyebrow_inner_end_y 2270 non-null float64
18 right_eyebrow_outer_end_x 2236 non-null float64
19 right_eyebrow_outer_end_y 2236 non-null float64
20 nose_tip_x 7049 non-null float64
21 nose_tip_y 7049 non-null float64
22 mouth_left_corner_x 2269 non-null float64
23 mouth_left_corner_y 2269 non-null float64
24 mouth_right_corner_x 2270 non-null float64
25 mouth_right_corner_y 2270 non-null float64
26 mouth_center_top_lip_x 2275 non-null float64
27 mouth_center_top_lip_y 2275 non-null float64
28 mouth_center_bottom_lip_x 7016 non-null float64
29 mouth_center_bottom_lip_y 7016 non-null float64
30 Image 7049 non-null object
dtypes: float64(30), object(1)
memory usage: 1.7+ MB
完整样本数量
相比于样本总数,完整样本的数量只有不到3分之一
df.shape[0] - df.isnull().any(axis=1).sum()
# print
2140
数据预处理
缺失值处理
两种方法,一种填充,一种去掉,尝试填充
df.fillna(method='ffill', inplace=True)
# df.dropna()
获取样本 X
df['Image'] = df['Image'].apply(lambda x: np.fromstring(x, dtype=int, sep=' ').reshape(96, 96))
X = np.asarray([df['Image']], dtype=np.uint8).reshape(-1,96,96,1)
X.shape
# print
(7049, 96, 96, 1)
获取输出 y
y = df.drop(['Image'], axis=1).to_numpy()
y.shape
# print
(7049, 30)
查看图像和特征点
画出人脸并画上特征点
img = df['Image'].iloc[0]
points = y[0]
plt.imshow(img, cmap='gray')
plt.scatter(points[::2], points[1::2], c='red')
plt.show()
另外,这是有缺失的人脸