人脸表情辨识作为本科毕设的项目,部分代码如下:
人脸表情辨识
下面代码为: .ipynb文件, 可以在Jupyter上运行
题目为:
给了2个.csv文件(一个训练,一个预测)
求:人脸表情是哪种
import numpy as np#处理矩阵
import pandas as pd#资料处理(读csv文件)
import tensorflow as tf
import matplotlib.pyplot as plt#画图
#读入文件
%matplotlib inline
train_data= pd.read_csv('/Users/liyixin/Desktop/AI/fourth/train.csv')#训练
test_data= pd.read_csv('/Users/liyixin/Desktop/AI/fourth/test.csv')#测试
# print(train_data['feature'])#里面为数据
# print(test_data['feature'])
#对train_data进行处理: 将[’feature‘]每行分隔开 ,并存为矩阵形式
train_data['feature']=train_data['feature'].apply(lambda im: np.fromstring(im,sep=' '))
x_train=np.vstack(train_data['feature'].values)#所有的train_data图片
print(x_train)
#用于显示图片
x_train1=x_train.reshape(-1,48,48)
# y_train=train_data['label']
# print(y_train)
# print(x_train.shape)
import matplotlib.pyplot as plt
def plot_image(image): #显示一张图片
fig = plt.gcf()
fig.set_size_inches(2,2)
plt.imshow(image, cmap='binary') # cmap='binary' 參數設定以黑白灰階顯示.
# plt.imshow(image)
plt.show()
#显示第0张图片
plot_image(x_train1[0])
from keras.utils import to_categorical
# 对train_data进行处理: 将['label']存成array 并进行onehot编码
y_train_label=np.array(train_data['label'])
print(y_train_label)
# print(y_train.shape)
#one-hot编码
y_train_onehot= to_categorical(y_train_label)
print(y_train_onehot)
#对train_data进行处理后的shape:
x_train.shape,y_train_onehot.shape
#对train_data进行处理,前5000作为测试,后面用于训练
x_valid_image=x_train[0:5000,:]#测试
x_train_image=x_train[5000:,:]#训练
y_valid_onehot=y_train_onehot[0:5000,:]
y_train_onehot=y_train_onehot[5000:,:]
#用于显示图片
x_valid1_image=x_valid_image.reshape(-1,48,48)#测试图片的显示
print(x_valid_image.shape,y_valid_onehot.shape)
print(x_train_image.shape,y_train_onehot.shape)
label_dict={0:"angry",1:"disgust",2:"fear",3:"happy",4:"sad",5:"suprise",6:"neutral" }
import matplotlib.pyplot as plt
def plot_images_labels_predict(images, labels, prediction, idx, num=10):
fig = plt.gcf()
fig.set_size_inches(12, 14)
for i in range(0, num):
ax=plt.subplot(5,5, 1+i)
ax.imshow(images[idx], cmap='binary')
title = str(i)+'——'+label_dict[labels[idx]]
if len(prediction) > 0:
title+='-->'+label_dict[prediction[idx]]
ax.set_title(title, fontsize=10)
ax.set_xticks([]); ax.set_yticks([])
idx+=1
plt.show()
plot_images_labels_predict(x_train1,y_train_label,[],0,num=10)
from keras.utils import to_categorical
#对test进行处理: 将[’feature‘] 并存为矩阵形式
test_data['feature']=test_data['feature'].apply(lambda im: np.fromstring(im,sep=' '))
x_test=np.vstack(test_data['feature'].values)
print(x_test)
print(x_test.shape)
#用于显示图片
x_test1=x_test.reshape(-1,48,48)
# 对test_data进行处理: 将['id']存成array
y_test_id=np.array(test_data['id'])
print(y_test_id)
# feature reshape
# 用于显示图片
# x_valid1=x_valid.reshape(-1,48,48)
# print(x_valid1.shape)
# x_train=x_train.reshape(-1,48,48,1)
# x_test1=x_test.reshape(-1,48,48,1)
#train_data中的数据和test_data中的数据 reshape 格式转换(float) 标准化
x_valid_image_norm=x_valid_image.reshape(-1,48,48,1).astype('float32') / 255
x_train_image_norm=x_train_image.reshape(-1,48,48,1).astype('float32') / 255
x_test_image_norm=x_test.reshape(-1,48,48,1).astype('float32') / 255
print(x_valid_image_norm.shape,x_train_image_norm.shape,x_test_image_norm.shape)
print(x_valid_image_norm[0])
#
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
model = Sequential()
# Create CN layer 1
model.add(Conv2D(filters=16,kernel_size=(3,3),padding='same',input_shape=(48, 48, 1),activation='relu'))
# Create Max-Pool 1
model.add(MaxPooling2D(pool_size=(2,2)))
# Create CN layer 2
model.add(Conv2D(filters=36,kernel_size=(3,3),padding='same',activation='relu'))
# Create Max-Pool 2
model.add(MaxPooling2D(pool_size=(2,2)))
# Create CN layer 3
model.add(Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu'))
# Create Max-Pool 3
model.add(MaxPooling2D(pool_size=(2,2)))
# # Add Dropout layer
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
model.summary()
print("")
from keras import optimizers
# 定義訓練方式
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 開始訓練
train_history = model.fit(x=x_train_image_norm,y=y_train_onehot, validation_split=0.2,epochs=200, batch_size=300, verbose=1)
import matplotlib.pyplot as plt
def show_train_history(train_history, train, validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')
plt.ylabel(train)
plt.xlabel('Epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
show_train_history(train_history,'acc','val_acc')
show_train_history(train_history,'loss','val_loss')
scores = model.evaluate(x=x_valid_image_norm,#model.evaluate检测(100笔数据)->用于测试准确度(0.81)
y=y_valid_onehot)
print(scores[1])
prediction = model.predict_classes(x_valid_image_norm) # Making prediction and save result to prediction
# print(prediction)
print("\t[Info] Show 10 prediction result (From valid image):")
print("%s\n" % (prediction[0:10]))
#显示valid图片的 原label和 预测后的label
plot_images_labels_predict(x_valid1_image,y_train_label[0:5000],prediction,0,num=10)
print("\t[Info] Display Confusion Matrix:")#混淆矩陣 (Confusion matrix)
import pandas as pd
print("%s\n" % pd.crosstab(y_train_label[0:5000], prediction, rownames=['label'], colnames=['predict']))
import matplotlib.pyplot as plt
def show_predict_probability(x_image,y,prediction,predicted_probability, i):
print(i,'valid_image','label:',label_dict[y[i]],'predict',label_dict[prediction[i]])
plt.figure(figsize=(2,2))
plt.imshow(x_image[i])
plt.show()
for j in range(7):
print(label_dict[j]+' probability:%1.9f'%(predicted_probability[i][j]))
prediction_probability = model.predict(x_valid_image_norm)#第0张图片
show_predict_probability(x_valid1_image,y_train_label,prediction,prediction_probability,0)
import matplotlib.pyplot as plt
def show_images_predict(images,prediction, idx, num=10):
fig = plt.gcf()
fig.set_size_inches(12, 14)
for i in range(0, num):
# plt.figure(figsize=(6,6))
plt.imshow(images[i])
ax=plt.subplot(5,5,1+i)
ax.imshow(images[idx], cmap='binary')
title='predict'+'-->'+label_dict[prediction[idx]]
ax.set_title(title, fontsize=10)
ax.set_xticks([]); ax.set_yticks([])
idx+=1
plt.show()
predict_result=model.predict_classes(x_test_image_norm)
print("%s\n" % (predict_result[0:10]))
#显示test图片前十张 的 预测后的label
show_images_predict(x_test1,predict_result[0:10],0,num=10) s=({"id":test_data["id"],"Label":predict_result})
submit=pd.DataFrame(data=s)
submit.to_csv('/Users/liyixin/Desktop/AI/fourth/result.csv',index=False)