人脸表情识别——fer2013

一、实验环境

深度学习框架:Keras
实验平台:
Windows10(笔记本)
Anaconda3, Python3.6
keras

数据集: Kaggle fer2013

参考文献:
A Real-time Facial Expression Recongnizer using Deep Neural Network

二、实验过程

1、准备数据集

下载fer2013之后,解压出的是csv格式的数据,我们需要先将数据转换成图片。
​​
​​​​在这里插入图片描述
在这里插入图片描述

step 1: 从fer2013.csv中提取出训练集、验证集和测试集

在这里插入图片描述
convert_fer2013.py:

# -*- coding: utf-8 -*-
import csv
import os

database_path = r'F:\Datasets\fer2013'
datasets_path = r'.\datasets'
csv_file = os.path.join(database_path, 'fer2013.csv')
train_csv = os.path.join(datasets_path, 'train.csv')
val_csv = os.path.join(datasets_path, 'val.csv')
test_csv = os.path.join(datasets_path, 'test.csv')


with open(csv_file) as f:
    csvr = csv.reader(f)
    header = next(csvr)
    rows = [row for row in csvr]

    trn = [row[:-1] for row in rows if row[-1] == 'Training']
    csv.writer(open(train_csv, 'w+'), lineterminator='\n').writerows([header[:-1]] + trn)
    print(len(trn))

    val = [row[:-1] for row in rows if row[-1] == 'PublicTest']
    csv.writer(open(val_csv, 'w+'), lineterminator='\n').writerows([header[:-1]] + val)
    print(len(val))

    tst = [row[:-1] for row in rows if row[-1] == 'PrivateTest']
    csv.writer(open(test_csv, 'w+'), lineterminator='\n').writerows([header[:-1]] + tst)
    print(len(tst))
**注意:**在Windows平台中,需要在csv.writer()中加上lineterminator=’\n’不然在生存的csv文件中,每行之间会有空行,影响后续操作。在Linux平台中不需要这样做。
step 2: 将csv中的数据转化成图片

convert_csv2gray:

# -*- coding: utf-8 -*-
import csv
import os
from PIL import Image
import numpy as np


datasets_path = r'.\datasets'
train_csv = os.path.join(datasets_path, 'train.csv')
val_csv = os.path.join(datasets_path, 'val.csv')
test_csv = os.path.join(datasets_path, 'test.csv')

train_set = os.path.join(datasets_path, 'train')
val_set = os.path.join(datasets_path, 'val')
test_set = os.path.join(datasets_path, 'test')

for save_path, csv_file in [(train_set, train_csv), (val_set, val_csv), (test_set, test_csv)]:
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    num = 1
    with open(csv_file) as f:
        csvr = csv.reader(f)
        header = next(csvr)
        for i, (label, pixel) in enumerate(csvr):
            pixel = np.asarray([float(p) for p in pixel.split()]).reshape(48, 48)
            subfolder = os.path.join(save_path, label)
            if not os.path.exists(subfolder):
                os.makedirs(subfolder)
            im = Image.fromarray(pixel).convert('L')
            image_name = os.path.join(subfolder, '{:05d}.jpg'.format(i))
            print(image_name)
            im.save(image_name)


生成的数据集目录结构如下:
在这里插入图片描述

2、训练网络

以下是一个简单的Python代码示例,用于在FER2013数据集上训练人脸表情识别模型: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 加载数据 df = pd.read_csv('fer2013.csv') # 将数据拆分为训练、验证和测试集 train_data = df[df['Usage'] == 'Training'] val_data = df[df['Usage'] == 'PublicTest'] test_data = df[df['Usage'] == 'PrivateTest'] # 创建数据生成器 train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1, horizontal_flip=True, fill_mode='nearest') val_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) # 定义批量大小和图像大小 batch_size = 32 img_size = (48, 48) # 创建数据流 train_generator = train_datagen.flow_from_dataframe(train_data, x_col='pixels', y_col='emotion', target_size=img_size, batch_size=batch_size, class_mode='categorical') val_generator = val_datagen.flow_from_dataframe(val_data, x_col='pixels', y_col='emotion', target_size=img_size, batch_size=batch_size, class_mode='categorical') test_generator = test_datagen.flow_from_dataframe(test_data, x_col='pixels', y_col='emotion', target_size=img_size, batch_size=batch_size, class_mode='categorical') # 创建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(128, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(7, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(train_generator, steps_per_epoch=len(train_data) // batch_size, epochs=50, validation_data=val_generator, validation_steps=len(val_data) // batch_size) # 评估模型 test_loss, test_acc = model.evaluate(test_generator, verbose=2) print('\nTest accuracy:', test_acc) ``` 注意:这只是一个简单的示例,并不一定是最优的模型架构或超参数设置。对于FER2013数据集,还有很多其他的模型和技术可以尝试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值