基于深度学习的人脸表情识别(附代码)
本文介绍了一个基于深度学习的人脸表情识别系统。该系统采用YOLO进行人脸检测,并使用Mobilenet或ResNet等网络进行表情分类。数据集包含5种表情(愤怒、恐惧、快乐、悲伤、惊讶),共18000张训练图片和2000张测试图片。训练过程支持GPU加速,通过30个epoch的冻结训练和100个epoch的完整训练,最终准确率达到91%。系统提供多种测试功能,包括单独的表情识别、人脸检测+表情识别
本项目基于深度学习实现的人脸表情识别算法。使用目标检测(YOLO)先对人脸进行检测,再利用分类网络(支持Mobilenet、ResNet)对检测到的人脸进行表情识别。
环境说明
torch==1.7
torchvision==0.8.0
opencv==4.4.0.44
numpy==1.21.6
loguru==0.5.3
pandas==1.1.4
Pillow==9.5.0
tensorboardX==2.6.2.2
tqdm>=4.62.2
matplotlib==3.4.3
数据集
数据集链接:
通过网盘分享的文件:face_expression.zip 链接: https://pan.baidu.com/s/1PaWRp88K1IM0DjoN3FFY0A?pwd=yypn 提取码: yypn
本数据集来自于kaggle,共有5个表情:Angry、Fear、Happy、Sad、Suprise。
数据集分train与test,数据集每类分布情况如下:
| Angry | Fear | Happy | Sad | Suprise | |
|---|---|---|---|---|---|
| train | 8118 | 7785 | 14749 | 10042 | 6581 |
| test | 2030 | 1947 | 3688 | 2511 | 1646 |
数据集目录形式:
datasets |-- test | |-- Angry | |-- Fear | |-- Happy | |-- Sad | `-- Suprise `-- train |-- Angry |-- Fear |-- Happy |-- Sad `-- Suprise
训练
1.在model_data文件下,新建一个cls_classes.txt,里面内容如下:
Angry Fear Happy Sad Suprise
2.图像标签和路径处理:修改txt_annotation.py中的classes为如下,并运行代码。
classes = ["Angry", "Fear","Happy","Sad","Suprise"]
运行完上述代码后,会在项目中生成cls_train.txt和cls_test.txt文件。
完成上述两个步骤就可以着手训练了。
3.输入命令开启训练:
python train.py --classes_path model_data/cls_classes.txt model_data/mobilenet_v2-b0353104.pth --batch_size 16
传入参数说明:根据自己的需求开启训练
--cuda:是否采用GPU训练,默认为True
--classes_path: classes txt path
--input_shape:输入大小,默认为224x224
--backbone:默认为mobilenet,支持vit,resnet50,vgg16,alexnet
--model_path:预训练权重路径
--Freeze:是否开启冻结训练,默认为True
--annatation_path:训练集的txt路径,默认为cls_train.txt
--num_wokers:线程数量,默认为4
--init_epoch:初始的epoch,默认为0,表示从第0个epoch开始
--Freeze_epoch:冻结训练的epoch数量,默认30,表示前30个epoch为冻结训练
--epoch:总的epoch数量,默认为100
--lr:初始学习率,默认为1e-3
--batch_size:batch size大小,根据自己的显存情况设置batch 大小
根据参数传入进行训练,当出现下面打印说明训练已经开始:
num_classes:5 device_ids: [0] Loading weights into state dict... <All keys matched successfully> number of train datasets: 18000 number of val datasets: 2000 start freeze train 2024-04-17 22:19:34.595 | INFO | utils.utils_fit:fit_one_epoch:25 - Start Train Epoch 1/30: 1%|█ | 55/4500 [00:32<44:16, 1.67it/s, accuracy=0.827, lr=0.001, total_loss=0.465]
训练期间的tensorboard和ROC以及模型会保存在logs文件夹中
我这仅训练了50个epoch,5个类,ACC:91%。
tensorboard的使用
在使用tensorboard前请确保你已安装相关环境。
在训练期间或者训练后可以利用tensorboard实时观看训练中的ACC、loss、lr等。
训练中的tensorboard相关信息会保存在logs/tensorboard_logs文件下,文件名为events.out.tfevents.xxxx的格式。
进入logs/,打开cmd(激活你的pytorch),然后输入以下命令开启tensorboard。
tensorboard --logdir=./
输入命令后将会出现以下信息:
此时我们只需要打开浏览器,在浏览器输入下面的网址http://localhost:6006即可
TensorFlow installation not found - running with reduced feature set. Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all TensorBoard 2.4.1 at http://localhost:6006/ (Press CTRL+C to quit)
图像检测
当我们训练好后就可以开启图像测试了
仅进行表情识别
如果你只需要进行表情识别,也就是不用做目标检测进行人脸检测,命令如下:
python detect.py --weights your weights path --model_name mobilenet --img_path your image path
检测后图像将会保存在output文件下
人脸检测+表情识别
推荐这种方法!(可做视频检测)
开启命令如下:
python predict.py --source your image or video path --yolo_weight yolov5s_face.pt --face_weights your weights
检测效果如下:


测试
比如要测试一下top-1和top-5的acc测试结果,只需要运行以下命令即可,以top-1为例:
python eval_top1.py --weights your weight path
特征可视化
本项目还新增了在检测中进行特征可视化功能,用于模型的分析。
python detect.py --weights 权重路径 --img_path 图像路径 --visualize
特征可视化效果图会保存在feat文件中
注:代码有偿提供
更多推荐
所有评论(0)