VX:13225601016       获取源码和数据集

实验环境:

硬件环境:CPU i7-6500U,GPU GTX950M

软件环境:python3.7,torch 1.7.0+cu101

实验步骤:

1.训练

数据集

将训练集文件夹train和验证集文件夹val加入到我的训练文件夹mytrain内。测试集文件夹test和我的训练集文件夹mytrain在同一工作目录下。如图1。

图1数据集

训练集和验证集数据加载

在训练数据集下,每种表情的图片均存储在其标签为目录的文件夹下。在这里可以使用torchvision.datasets.ImageFolder()方法来加载这种组织方式的数据集。如图2。验证集组织形式同训练集,数据加载方式相同。

图2训练集的组织形式

data_dir = './mytrain'data_transforms = transforms.Compose([transforms.ToTensor(),transforms.Grayscale(num_output_channels=1)])#数据加载成tensor,加载灰度图像train_dataset = torchvision.datasets.ImageFolder(root = os.path.join(data_dir, 'train'), transform = data_transforms)val_dataset = torchvision.datasets.ImageFolder(root = os.path.join(data_dir, 'val'), transform = data_transforms)train_dataloader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True)val_dataloader = DataLoader(dataset=val_dataset, batch_size=128, shuffle=True)

卷积神经网络的定义

使用卷积神经网络对数据集进行训练。卷积层分为三层,输入图像每一层均以3*3卷积核进行训练,每次经过卷积操作后进行归一化,通过激活函数后在进行下采样。线性层将卷积层得到的输出作为输入,输出向量的维度等于类别数目7。网络结构如图3。

图3 网络结构图

# 参数初始化def gaussian_weights_init(m):classname = m.__class__.__name__# 字符串查找find,找不到返回-1,不等-1即字符串中含有该字符if classname.find('Conv') != -1:m.weight.data.normal_(0.0, 0.04)class CNN(nn.Module):# 初始化网络结构def __init__(self):super(CNN, self).__init__()# 第一次卷积、池化self.conv1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1), # 卷积层nn.BatchNorm2d(num_features=64), # 归一化nn.RReLU(inplace=True), # 激活函数nn.MaxPool2d(kernel_size=2, stride=2), # 最大值池化)# 第二次卷积、池化self.conv2 = nn.Sequential(nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(num_features=128),nn.RReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),)# 第三次卷积、池化self.conv3 = nn.Sequential(nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(num_features=256),nn.RReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),)# 参数初始化self.conv1.apply(gaussian_weights_init)self.conv2.apply(gaussian_weights_init)self.conv3.apply(gaussian_weights_init)# 全连接层self.fc = nn.Sequential(nn.Dropout(p=0.2),nn.Linear(in_features=256 * 6 * 6, out_features=4096),nn.RReLU(inplace=True),nn.Dropout(p=0.5),nn.Linear(in_features=4096, out_features=1024),nn.RReLU(inplace=True),nn.Linear(in_features=1024, out_features=256),nn.RReLU(inplace=True),nn.Linear(in_features=256, out_features=7),)# 前向传播def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)# 数据扁平化x = x.view(x.shape[0], -1)y = self.fc(x)return y

网络的训练

训练步骤一共有100个epoch。batch_size=512。损失函数使用交叉熵损失函数,使用Adam方法对学习率进行优化。每进行5个epoch,分别在训练集和验证集上进行验证,将验证集上正确率大于先前正确率的model进行存储。

def train(train_dataset, val_dataset, batch_size, epochs, learning_rate, wt_decay):train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)val_loader = DataLoader(dataset=val_dataset, batch_size=batch_size, shuffle=True)model = CNN().to(device)loss_function = nn.CrossEntropyLoss().to(device)optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=wt_decay)# scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.8)max_acc = 0for epoch in range(epochs):loss_rate = 0model.train() # 模型训练for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()output = model.forward(images)loss_rate = loss_function(output, labels)loss_rate.backward()optimizer.step()print('After {} epochs , the loss_rate is : '.format(epoch + 1), loss_rate.item())with SummaryWriter(comment='mynet') as w:#tensorboard --logdir C:\Users\29290\Desktop\2020CV表情识别实验\runsw.add_scalar('scalar/train',loss.item(),epoch+1)w.add_graph(net,inputs)if epoch % 5 == 0:model.eval() # 模型评估acc_train = validate(model, train_dataset, batch_size)acc_val = validate(model, val_dataset, batch_size)print('After {} epochs , the acc_train is : '.format(epoch + 1), acc_train)print('After {} epochs , the acc_val is : '.format(epoch + 1), acc_val)if acc_val > max_acc:max_acc = acc_valtorch.save(model.state_dict(),'model.pth')

main函数

def main():data_dir = './mytrain'data_transforms = transforms.Compose([transforms.ToTensor(),transforms.Grayscale(num_output_channels=1)])train_dataset = torchvision.datasets.ImageFolder(root = os.path.join(data_dir, 'train'), transform = data_transforms)val_dataset = torchvision.datasets.ImageFolder(root = os.path.join(data_dir, 'val'), transform = data_transforms)train(train_dataset, val_dataset, batch_size = 512, epochs=150, learning_rate=0.001, wt_decay=0)

2.测试

数据加载

测试集文件组织形式与训练集,验证集不同如图4。因此需要自定义数据加载。

图4 测试数据集

class Dataset(data.Dataset):# 初始化def __init__(self, root, transform):super(Dataset, self).__init__()self.root = rootself.files = os.listdir(self.root)self.transform = transformdef __getitem__(self, index):# 获取数据集样本个数img = Image.open(os.path.join(self.root,self.files[index]))img = self.transform(img)return imgdef __len__(self):return len(self.files)

定义测试函数

def test(model, dataset, batch_size):test_loader = data.DataLoader(dataset, batch_size)predict = []for images in test_loader:images = images.to(device)pred = model.forward(images)pred = np.argmax(pred.data.cpu().numpy(), axis=1)predict.extend(list(pred))return predict

main函数

将预测值对应的label写入prediction.csv。

def main():data_dir = './test'label_list = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'sad', 'surprise']data_transforms = transforms.Compose([transforms.Grayscale(num_output_channels=1),transforms.ToTensor()])test_dataset = Dataset(data_dir ,data_transforms)test_loader = torch.utils.data.DataLoader(test_dataset,batch_size=8)model = torch.load('model_MyNet.pkl')predict = test(model, test_dataset, 128)predict_label = [label_list[i] for i in predict]image = list(os.listdir(data_dir))df = pd.DataFrame({'image':image,'lable':predict_label})df.to_csv('prediction.csv', index=False)

实验结果:

实验在训练集上准确率可以达到99%,而在验证集上只能达到57%。实验将loss,train_acc,val_acc进行可视化,如图5.

图5 网络损失和正确率曲线

import numpy as npimport matplotlib.pyplot as pltloss = np.load('loss.npy')epoch1 = np.arange(len(loss))train_acc = np.load('train_acc.npy')val_acc = np.load('val_acc.npy')epoch2 = 5*np.arange(len(train_acc))plt.plot(epoch1, loss, label='loss')plt.plot(epoch2, train_acc, label='train_acc')plt.plot(epoch2, val_acc, label='val_acc')plt.xlabel('epoch')plt.ylabel('loss')plt.legend()plt.show()

PyTorch 表情识别相关推荐

  1. 使用OpenVINO加速Pytorch表情识别模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 关于模型 OpenVINO自带的表情识别模型是Caffe版本的,这 ...

  2. 深度学习项目,使用python进行表情识别,pytorch应用

    文章目录 前言 一.深度学习是什么? 二.数据的预处理 1.数据分类 2.代码 三.构建模型与训练 1.模型与代码 2.使用方法 四.实时识别 总结 前言 这个项目是以前课设用到的功能之一,参考了其他 ...

  3. 使用Unity的Barracuda和Pytorch实现表情识别

    Barracuda官方文档https://docs.unity3d.com/Packages/com.unity.barracuda@1.0/manual/index.html 表情识别算法来源htt ...

  4. 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)

    面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 目录 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 1.面部表情识别方法 2.面部表情识别数据集 ...

  5. Pytorch训练表情识别之笑脸识别

    Pytorch训练表情识别之笑脸识别 一.数据下载 首先是数据下载,话不多说,直接上百度云链接,这是一个只有笑脸和无表情的数据集: 链接:https://pan.baidu.com/s/11K1C6n ...

  6. 【项目实战课】AI零基础,人人免费可学!基于Pytorch的SimpleNet人脸表情识别实战...

    欢迎大家来到我们的项目实战课,本期内容是<基于SimpleNet的人脸表情识别实战>,本次内容面向任意AI基础的读者,人人皆可免费学习. 所谓项目实战课,就是以简单的原理回顾+详细的项目实 ...

  7. affectnet数据集_处理表情识别中的坏数据:一篇CVPR 2020及两篇TIP的解读

    机器之心分析师网络 作者:周宇 编辑:Joni Zhong 本篇提前看重点关注 CVPR 2020 中的这篇「Suppressing Uncertainties for Large-Scale Fac ...

  8. UWP通过机器学习加载ONNX进行表情识别

    首先我们先来说说这个ONNX ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型.它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互. ...

  9. 高精度人脸表情识别(附GitHub地址)

    编者按:本文原作者吴捷,目前于中山大学就读研究生.研究领域为计算机视觉与自然语言处理.本文原载于知乎,经作者授权发布.欢迎去GitHub给大佬加星. 先放出GitHub地址: https://gith ...

  10. 课堂考试作弊检测系统,情绪识别、表情识别和人脸识别结合

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 智慧教室 课堂专注度及考试作弊系统.课堂动态点名,情绪识别.表情识别和人脸识别结合 课堂专注度 ...

最新文章

  1. ViewStub 使用注意事项
  2. 一个Python小白5个小时爬虫经历
  3. 互联网跨界营销掘金“大数据”
  4. 中国国家气象局天气预报信息接口
  5. ITK:使用写访问权访问图像中的迭代区域
  6. Silverlight 4 Beta开发版带着许多新特性发布
  7. DevExpress GridControl 导出为Excel
  8. 2010.03.13 微软VSTS2008 动手实验室
  9. history.go(-1)返回页面后,此页面中的input标签隐藏域中的值消失
  10. vsto java,从Excel VSTO项目打开WPF应用程序
  11. 几种常用App原型设计工具详解
  12. 计算机机房空调原理,机房精密空调的工作原理
  13. 库文件 c语言 编译器,抽取VS文件组成类GCC的编译器,并编译C程序为dll动态链接库...
  14. 技术文摘11 fang money 技术 资料
  15. PHP在线横幅广告店标LOGO制作网站源码
  16. 计算机二级证件领取额,计算机二级证书怎么领
  17. Springboot自动重启
  18. 华为2012机试题目及解答程序(仅供参考,版权归华为所有)
  19. 一种实现个人微信二维码收款接口的方法
  20. 【论文阅读】Iterative Matching with Recurrent Attention Memory for Cross-Modal Image-Text Retrieval

热门文章

  1. 软件项目管理 第七章 进度计划
  2. 自适应中值滤波器(基于OpenCV实现)
  3. CentOS hping3安装
  4. 电子基础知识:常用电子元器件和基本工具
  5. 2048和多地址入口_七天网站成绩查询官网登录入口地址:http://www.7net.cc/
  6. 如何批量转换图片格式为png?
  7. 文后参考文献著录规则
  8. 高一计算机基础知识课程ppt课件,高一计算机基础课件.ppt
  9. 原理图端口符号_何为电气原理图和接线图?
  10. 2019最新PHP100项目实战(PHP新手入门教程)