本项目基于深度学习实现的人脸表情识别算法。使用目标检测(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]

训练期间的tensorboardROC以及模型会保存在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文件中


注:代码有偿提供

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐