前言

疫情当下,出入医院等公共场所都被要求佩戴口罩。这篇博客将会介绍如何使用 Yolov4,训练一个人脸口罩检测模型(使用 Yolov4 的原因是目前只复现到了 v4 ),代码地址为 https://github.com/zhiyiYo/yolov4

Yolov4

Yolov4 的神经网络结构相比 Yolov3 变化不是很大,主要更换了激活函数为 Mish,增加了 SPP 块和 PAN 结构(图源 《yolo系列学习笔记----yolov4(SPP原理)》)。

感觉 Yolov4 最大的特点就是使用了一大堆的 Trick,比如数据增强方面使用了马赛克数据增强、Mixup 数据增强,将定位损失函数更换为 CIOU 损失。论文中提到了很多的 Trick,我的代码中没有全部复现,不过在 VOC2012 数据集训练了 160 个 epoch 之后 mAP 也能达到 83%,效果还是不错的。

可以在终端使用下述指令下载 Yolov4 的代码:

git clone https://github.com/zhiyiYo/yolov4.git

人脸口罩数据集

网上可以找到很多人脸口罩数据集,这里使用的是 AIZOOTech 提供的数据集。由于这个数据集的结构和 Pascal VOC 数据集不一样,所以重新组织一下数据集,并且修复和移除了数据集中的非法标签,可以在 Kaggle 上下载此数据集。目前这个数据集包含 6130 张训练图像,1839 张测试图像,对于 Yolov4 的训练来说应该是绰绰有余的。下载完数据集将其解压到 data 文件夹下。

在训练之前,我们需要使用 K-means 聚类算法对训练集中的边界框进行聚类,对于 416×416 的输入图像,聚类结果如下:

anchors = [
[[100, 146], [147, 203], [208, 260]],
[[26, 43], [44, 65], [65, 105]],
[[4, 8], [8, 15], [15, 27]]
]

训练神经网络

训练目标检测模型一般都需要加载预训练的主干网络的权重,可以从谷歌云盘下载预训练好的权重 CSPDarknet53.pth 并将其放在 model 文件夹下。这里给出训练所用的代码 train.py,使用 python train.py 就能开始训练。模型会先冻结训练上 50 个 epoch,接着解冻训练 110 个 epoch:

# coding:utf-8
from net import TrainPipeline, VOCDataset
from utils.augmentation_utils import YoloAugmentation, ColorAugmentation # 训练配置
config = {
"n_classes": len(VOCDataset.classes),
"image_size": 416,
"anchors": [
[[100, 146], [147, 203], [208, 260]],
[[26, 43], [44, 65], [65, 105]],
[[4, 8], [8, 15], [15, 27]]
],
"darknet_path": "model/CSPdarknet53.pth",
"lr": 1e-2,
"batch_size": 8,
"freeze_batch_size": 16,
"freeze": True,
"freeze_epoch": 50,
"max_epoch": 160,
"start_epoch": 0,
"num_workers": 4,
"save_frequency": 10,
"no_aug_ratio": 0
} # 加载数据集
root = 'data/FaceMaskDataset/train'
dataset = VOCDataset(
root,
'all',
transformer=YoloAugmentation(config['image_size']),
color_transformer=ColorAugmentation(config['image_size']),
use_mosaic=True,
use_mixup=True,
image_size=config["image_size"]
) if __name__ == '__main__':
train_pipeline = TrainPipeline(dataset=dataset, **config)
train_pipeline.train()

测试神经网络

训练完使用 python evals.py 可以测试所有保存的模型,evals.py 代码如下:

# coding:utf-8
import json
from pathlib import Path import matplotlib as mpl
import matplotlib.pyplot as plt from net import EvalPipeline, VOCDataset mpl.rc_file('resource/theme/matlab.mplstyle') # 载入数据集
root = 'data/FaceMaskDataset/val'
dataset = VOCDataset(root, 'all')
anchors = [
[[100, 146], [147, 203], [208, 260]],
[[26, 43], [44, 65], [65, 105]],
[[4, 8], [8, 15], [15, 27]]
] # 列出所有模型,记得修改 Yolo 模型文件夹的路径
model_dir = Path('model/2022-10-05_22-59-44')
model_paths = [i for i in model_dir.glob('Yolo_*')]
model_paths.sort(key=lambda i: int(i.stem.split("_")[1])) # 测试所有模型
mAPs = []
iterations = []
for model_path in model_paths:
iterations.append(int(model_path.stem[5:]))
ep = EvalPipeline(model_path, dataset, anchors=anchors, conf_thresh=0.001)
mAPs.append(ep.eval()*100) # 保存数据
with open('eval/mAPs.json', 'w', encoding='utf-8') as f:
json.dump(mAPs, f) # 绘制 mAP 曲线
fig, ax = plt.subplots(1, 1, num='mAP 曲线')
ax.plot(iterations, mAPs)
ax.set(xlabel='iteration', ylabel='mAP', title='mAP curve')
plt.show()

得到的 mAP 曲线如下图所示,在第 120 个 epoch 达到最大值 94.14%:

下面使用一张真实图像看看训练效果如何,运行 demo.py

# coding:utf-8
from net import VOCDataset
from utils.detection_utils import image_detect # 模型文件和图片路径
model_path = 'model/Yolo_120.pth'
image_path = 'resource/image/三上老师.jpg' # 检测目标
anchors = [
[[100, 146], [147, 203], [208, 260]],
[[26, 43], [44, 65], [65, 105]],
[[4, 8], [8, 15], [15, 27]]
]
image = image_detect(model_path, image_path, VOCDataset.classes, anchors=anchors, conf_thresh=0.5)
image.show()

不错,效果非常好 :

后记

至此,介绍完了训练 Yolov4 人脸口罩检测模型的过程,代码放在了 https://github.com/zhiyiYo/yolov4,以上~~

如何使用 Yolov4 训练人脸口罩检测模型的更多相关文章

  1. K210,yolo,face_mask口罩检测模型训练及其在K210,kd233上部署

    前段时间考研,再加上工作,时间很紧,一直没有更新博客,这几天在搞k210的目标检测模型,做个记录,遇到问题可以添加qq522414928或添加微信13473465975,共同学习 首先附上github ...

  2. PyTorch专栏(八):微调基于torchvision 0.3的目标检测模型

    专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60分钟入门 PyTorch入门 PyTorch自动微分 PyTorch神经网络 P ...

  3. 微调torchvision 0.3的目标检测模型

    微调torchvision 0.3的目标检测模型 本文将微调在 Penn-Fudan 数据库中对行人检测和分割的已预先训练的 Mask R-CNN 模型.它包含170个图像和345个行人实例,说明如何 ...

  4. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  5. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...

  6. dlib人脸关键点检测的模型分析与压缩

    本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...

  7. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  8. ssd物体检测模型训练和测试总结

    参考网址:github:https://github.com/naisy/realtime_object_detection 2018.10.16ssd物体检测总结:切记粗略地看一遍备注就开始训练模型 ...

  9. 用keras实现人脸关键点检测(2)

    上一个代码只能实现小数据的读取与训练,在大数据训练的情况下.会造内存紧张,于是我根据keras的官方文档,对上一个代码进行了改进. 用keras实现人脸关键点检测 数据集:https://pan.ba ...

随机推荐

  1. inotify 目录文件变更实时监控

    # inotify 软件 # 安装:通过epel,安装在客户端 # 功能:实时监控目录下文件的更变 # 监控事件:创建.删除.修改.移动... # 安装位置:客户端 # 安装命令: sudo apt- ...

  2. gitpod.io,云端开发调试工具。

    gitpod,一款在线开发调试工具,使用它你可以在网页上直接开发软件项目了. 比如你的项目仓库在github上,你可以直接在网址的前面添加gitpod.io/#,然后回车就能在网页上使用vscode打 ...

  3. 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进

    点击上方 蓝字关注我们 作者 | 宋哲琦 ✎ 编 者 按 在不久前的 Apache  DolphinScheduler Meetup 2021 上,有赞大数据开发平台负责人 宋哲琦 带来了平台调度系统 ...

  4. The Data Way Vol.1|风口下的开源:如何看待开源与商业的关系?

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  5. 【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。

    不记得是怎么接触并最终研究这个课题的了,认识我的人都知道我是没有固定的研究对象的,一切看运气和当时的兴趣.本来研究完了就放在那里了,一直比较懒的去做总结,但是想一想似乎在网络上就没有看到关于这个方面的 ...

  6. javaScript 事件循环机制

    JavaScript是单线程的编程语言,只能同一时间内做一件事.但是在遇到异步事件的时候,js线程并没有阻塞,还会继续执行,这就是因为JS有事件循环机制. 事件循环流程总结 主线程开始执行一段代码, ...

  7. Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态

    python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...

  8. 深入理解Spring注解机制(一):注解的搜索与处理机制

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  9. 概述:基于事件的优化方法 / 事件驱动优化 / Event-Based Optimization / EBO

    大家好,我是月出 本文基于这篇综述,介绍了 事件驱动优化(Event-Based Optimization, EBO). 事件驱动优化,是一种建模现实场景.做优化的思路,理论和 MDP / 强化学习很 ...

  10. CCF NOI Online 2021 提高组 T2 积木小赛 (子序列自动机+后缀自动机,O(n^2))

    题面 Alice 和 Bob 最近热衷于玩一个游戏--积木小赛. Alice 和 Bob 初始时各有 n 块积木从左至右排成一排,每块积木都被标上了一个英文小写字母. Alice 可以从自己的积木中丢 ...