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内容请搜索靠谱客的其他文章。
发表评论 取消回复