tensorflow实战小项目——面部表情识别(1)

此次分享的项目是利用tensorflow构建一个CNN网络来对fer2013数据集进行训练以实现面部表情识别的小项目。

首先,我们需要现在官网上下载fer2013数据集,将数据集进行解压,会生成一个fer2013.csv文件,我们首先要对这个.csv文件进行简单的处理。

fer2013数据集将表情大致分为7类,fer2013.csv中分别标注了每张图片的标签,特征值和分类。我们首先根据分类将数据集划分为train, test和val。

# 项目数据集使用了表情识别的fer2013数据集
# 该数据集下载下来是.csv格式,需要先对数据集进行分割,得到train.csv, test.csv, val.csv
import csv
import os


database_path = '  '#数据集的路径
datasets_path = 'D:/fer2013'
#将路径组合后返回
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:
    #使用csv中的reader()打开.csv文件
    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))

之后,我们需要将根据其特征值将其还原为48*48的灰度图像:

#将.csv文件还原为48*48的8位灰度图
import csv
import os
from PIL import Image
import numpy as np


datasets_path = 'D:/fer2013'
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)
        #使用enumerate遍历csvr中的标签(label)和特征值(pixel)
        for i, (label, pixel) in enumerate(csvr):
            #将特征值的数组转化为48*48的矩阵
            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)
            #将该矩阵转化为RGB图像,再通过convert转化为8位灰度图像,L指灰度图模式,L=R*299/1000+G*587/1000+B*114/1000
            im = Image.fromarray(pixel).convert('L')
            image_name = os.path.join(subfolder, '{:05d}.jpg'.format(i))
            print(image_name)
            im.save(image_name)

在这之后,我们就可以对数据集构建batch和CNN网络对其进行训练了。

后续内容,请见下次更新。

猜你喜欢

转载自blog.csdn.net/labpqsdr/article/details/80704969