概述
2018年06月15日 14:41:17
阅读数:403
此次分享的项目是利用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网络对其进行训练了。
最后
以上就是动人果汁为你收集整理的tensorflow 表情识别1的全部内容,希望文章能够帮你解决tensorflow 表情识别1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复