人脸表情识别——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 = rF:Datasetsfer2013
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=
).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=
).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=
).writerows([header[:-1]] + tst)
    print(len(tst))
**注意:**在Windows平台中,需要在csv.writer()中加上lineterminator=’ ’不然在生存的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、训练网络

经验分享 程序员 微信小程序 职场和发展