人脸表情识别 (1) 下载fer2013数据集和数据的处理

最近做了有关人脸表情识别的实验,还是挺有意思的,所以想在博客上记录这个过程,既是给自己做个记录,也想把这个过程分享给大家,如果能对你有一些帮助我会感到挺开心的,模型,数据集之类的我都会陆续上传,有需要的可以自己获取。

先说在之后的文章会用到的东西,Ubuntu 16.04环境,Python 3.6.5,Keras框架,tensorflow框架,OpenCV,像一些Python中做科学计算的包比如numpy和画图的包matplotlib也都是需要的,当然也不要被吓到了,这些东西基本没什么难的,按照我的博客应该不需要对上述东西有太深的了解。

接下来,我会完整记录整个过程,从数据的获取,数据的处理,数据的增广,模型的建立,模型的训练,到数据的分析。我的模型目前在fer2013数据集的测试数据上的预测精度为62%左右,这个为单个模型的预测精度,组合模型的预测精度能够达到68%,和kaggle竞赛上的第一名的精度比较接近,他是71%。

我的CPU是i5-4200H,GPU是英伟达的gtx950M,训练一个完整的模型大概需要一个多小时,时间上还可以接受,如果你没有很好的硬件平台的话,也可以使用云平台,我自己现在在用的是易学智能的GPU云平台,大公司的云平台太贵了真的用不起,如果你也想用易学智能的云平台的话可以点击我的推广链接,易学智能-GPU云|GPU资源租赁|技术培训|人工智能技术分享 - 易学开发平台|易学在线课堂|易学智能论坛,我的推广码是 4fINaqRVmpzokbEx,你点这个推广链接注册就直接送你10个币,能用一个GTX 1080Ti显卡跑俩小时,或者用GTX 1050Ti运行5个小时,足够你试用了,如果你充钱的话,每充100就送你10个币,当然我也能得到5个币,具体还是看你需求了,没需要就不用注册了,我也真不差这五个币。

接下来我会介绍如何获取到这个数据集,也会介绍如何把数据集中的数据变为我们的程序容易使用的数据形式,这篇博客就是个开胃菜,精彩的还在后面呢。

想要获取到数据集有很多方法,首先你可以去kaggle上获取,https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data,只要注册一个账号就能进行下载,但是我嫌麻烦,所以我不是这样下载的,我是通过别人分享的百度云链接下载的https://pan.baidu.com/s/1qaEnso8INU1it5TJvxphzg?pwd=r8si 。下载完数据你会发现这是一个csv文件,名字叫fer2013.csv,现在,我们需要把数据转化为程序比较方便利用的形式。首先,训练集,验证集和测试集要分开了。使用一下这段代码即可,路径什么的自己修改一下。处理结束后,我们就有了train.csv,val.csv和test.csv这三个文件,接着就是把这三个文件转化为图片,并且每个类型的图片需要在它自己的文件夹中。

# -*- 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))

使用以下代码即可完成将这三个csv文件都转化为图片, 同样,路径什么的需要你自己改,这个我帮不了你。

# -*- 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)

处理结束后我们又多了三个文件夹,分别叫train,val和test,每个文件夹中又有七个文件夹,分别为0-6,对应它的7个类别,一共有28709张训练图片。0对应anger,1对应disgust,2对应fear,3对应happy,4对应sad,5对应surprised,6对应normal。每个类别的训练数据量差别比较大,我做了一张柱状图作为对比。能够很明显地看出,类别1的disgust情绪数量只有436张训练图片,和其他类别相比真是少的可怜。我还做了一个模型对各情绪的预测精度对比柱状图。这两幅图一对比就能很明显地看出,某一情绪的预测精度和训练集中这个情绪的图片数量呈现正相关关系,最明显的还是disgust情绪,训练集中数据量最少,预测精度同时也是最低的,仅为0.33左右,所以当前首要的任务是把数据量搞均匀了,没有一个比较合理的训练数据是不可能得到一个性能良好的模型的,数据增强我会放在下一节详细讲述。这一节的内容就到这。

  • 60
    点赞
  • 274
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值