PyTorch 表情识别
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 表情识别相关推荐
- 使用OpenVINO加速Pytorch表情识别模型
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 关于模型 OpenVINO自带的表情识别模型是Caffe版本的,这 ...
- 深度学习项目,使用python进行表情识别,pytorch应用
文章目录 前言 一.深度学习是什么? 二.数据的预处理 1.数据分类 2.代码 三.构建模型与训练 1.模型与代码 2.使用方法 四.实时识别 总结 前言 这个项目是以前课设用到的功能之一,参考了其他 ...
- 使用Unity的Barracuda和Pytorch实现表情识别
Barracuda官方文档https://docs.unity3d.com/Packages/com.unity.barracuda@1.0/manual/index.html 表情识别算法来源htt ...
- 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码)
面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 目录 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码) 1.面部表情识别方法 2.面部表情识别数据集 ...
- Pytorch训练表情识别之笑脸识别
Pytorch训练表情识别之笑脸识别 一.数据下载 首先是数据下载,话不多说,直接上百度云链接,这是一个只有笑脸和无表情的数据集: 链接:https://pan.baidu.com/s/11K1C6n ...
- 【项目实战课】AI零基础,人人免费可学!基于Pytorch的SimpleNet人脸表情识别实战...
欢迎大家来到我们的项目实战课,本期内容是<基于SimpleNet的人脸表情识别实战>,本次内容面向任意AI基础的读者,人人皆可免费学习. 所谓项目实战课,就是以简单的原理回顾+详细的项目实 ...
- affectnet数据集_处理表情识别中的坏数据:一篇CVPR 2020及两篇TIP的解读
机器之心分析师网络 作者:周宇 编辑:Joni Zhong 本篇提前看重点关注 CVPR 2020 中的这篇「Suppressing Uncertainties for Large-Scale Fac ...
- UWP通过机器学习加载ONNX进行表情识别
首先我们先来说说这个ONNX ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型.它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互. ...
- 高精度人脸表情识别(附GitHub地址)
编者按:本文原作者吴捷,目前于中山大学就读研究生.研究领域为计算机视觉与自然语言处理.本文原载于知乎,经作者授权发布.欢迎去GitHub给大佬加星. 先放出GitHub地址: https://gith ...
- 课堂考试作弊检测系统,情绪识别、表情识别和人脸识别结合
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 智慧教室 课堂专注度及考试作弊系统.课堂动态点名,情绪识别.表情识别和人脸识别结合 课堂专注度 ...
最新文章
- ViewStub 使用注意事项
- 一个Python小白5个小时爬虫经历
- 互联网跨界营销掘金“大数据”
- 中国国家气象局天气预报信息接口
- ITK:使用写访问权访问图像中的迭代区域
- Silverlight 4 Beta开发版带着许多新特性发布
- DevExpress GridControl 导出为Excel
- 2010.03.13 微软VSTS2008 动手实验室
- history.go(-1)返回页面后,此页面中的input标签隐藏域中的值消失
- vsto java,从Excel VSTO项目打开WPF应用程序
- 几种常用App原型设计工具详解
- 计算机机房空调原理,机房精密空调的工作原理
- 库文件 c语言 编译器,抽取VS文件组成类GCC的编译器,并编译C程序为dll动态链接库...
- 技术文摘11 fang money 技术 资料
- PHP在线横幅广告店标LOGO制作网站源码
- 计算机二级证件领取额,计算机二级证书怎么领
- Springboot自动重启
- 华为2012机试题目及解答程序(仅供参考,版权归华为所有)
- 一种实现个人微信二维码收款接口的方法
- 【论文阅读】Iterative Matching with Recurrent Attention Memory for Cross-Modal Image-Text Retrieval
热门文章
- 软件项目管理 第七章 进度计划
- 自适应中值滤波器(基于OpenCV实现)
- CentOS hping3安装
- 电子基础知识:常用电子元器件和基本工具
- 2048和多地址入口_七天网站成绩查询官网登录入口地址:http://www.7net.cc/
- 如何批量转换图片格式为png?
- 文后参考文献著录规则
- 高一计算机基础知识课程ppt课件,高一计算机基础课件.ppt
- 原理图端口符号_何为电气原理图和接线图?
- 2019最新PHP100项目实战(PHP新手入门教程)