机器学习代码学习(六)->>人脸表情辨识别

人脸表情辨识作为本科毕设的项目,部分代码如下:

人脸表情辨识

下面代码为: .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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laura_Wangzx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值