本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果,因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章)
基于yolov5的人脸关键点检测:人脸关键点检测
环境说明
torch>=1.5.0
数据集
这里使用的人脸数据集为WIDER FACE。
该数据集共有12880张图像
引用说明:
@inproceedings{yang2016wider, Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou}, Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, Title = {WIDER FACE: A Face Detection Benchmark}, Year = {2016}}
下载数据集并解压至datasets,images中是图像,labels中是对应标签文件(已经做了归一化)
其中train_bak.txt是所有图像的相对路径(注意此时还没有划分真正的训练集、验证机和测试集),格式为:
./images/xxx.jpg
数据集百度云:
链接:https://pan.baidu.com/s/1O7pgjy77ur21jMm4lwwuQw
提取码:yypn
数据集划分脚本
tran_bak.txt包含了12880张图像的相对路径
该脚本可以生成train.txt、val.txt和test.txt。如果你感觉训练过程毕竟慢,希望可以先得到一个训练模型,那么可以将lines=lines[:2000]注释去掉,这将仅从数据集中选择2000张图来进行训练和测试
with open('datasets/train_bak.txt', 'r') as f:
lines = f.readlines()
# lines = lines[:2000] # 只取2000张
# 随机打乱数据
random.shuffle(lines)
# 划分比例
val_ratio = 0.1 # 验证集占比
test_ratio = 0.1 # 测试集占比
# 计算划分的索引
val_index = int(len(lines) * val_ratio)
test_index = int(len(lines) * (val_ratio + test_ratio))
# 划分数据集
val_data = lines[:val_index]
test_data = lines[val_index:test_index]
train_data = lines[test_index:]
# 保存划分后的数据集到文件
with open('datasets/val.txt', 'w') as f:
f.writelines(val_data)
with open('datasets/test.txt', 'w') as f:
f.writelines(test_data)
# 剩余的部分作为训练集
with open('datasets/train.txt', 'w') as f:
f.writelines(train_data)
新建mydata.yaml
上面完成了数据集的划分,然后和正常的yolov5训练一样,需要在data/下新建一个mydata.yaml文件,内容如下:
train: ./datasets/train.txt
val: ./datasets/val.txt
test: ./datasets/test.txt
# number of classes
nc: 1
# class names
names: ['face']
训练
python train.py --data data/mydata.yaml --weights yolov5s.pt
我这里仅训练了10个epoch(需要的可以自己继续训练),评价指标如下:
R | P | mAP_0.5 | mAP_0.5:0.95 |
0.521 | 0.7987 | 0.59592 | 0.28344 |
batch中标签预览图: