# 1.研究背景
为满足疫情时期的特殊需要,基于改进YOLOv7模型,设计一款应用于复杂场景的口罩佩戴识别检测系统。系统采用PyCharm集成开发环境,从网络上爬取1600张口罩佩戴相关的图片,在原始 k-means算法基础上加入聚类算法,获取与真实框之间的更高的先验框。在人机交互界面使用Qt组件设计,图像和模型数据加载使用开源OpenCV视觉库实现。口罩佩戴检测的核心算法使用目标检测算法中的YOLOv7训练并结合PyTorch框架实现。实验结果表明,系统能够实现多人场景下人群佩戴口罩状况的检测,在多人物以及实时检测场景中准确率有所提高,在使用和效果上都具有自身特有的优势。
# 2.图片识别
![3.png](fe6f41192b4eff9eca5c31dcbe4dd3e1.png)
![4.png](a0837a88b2dbb579977c8e294d33ee86.png)
# 3.视频识别
![1.png](a491aa3425782e1b0ee4516904f12421.png)
# 4.视频演示
[[YOLOv7]基于YOLOv7的口罩识别系统(源码&部署教程)_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1Ke41137xz/?vd_source=bc9aec86d164b67a7004b996143742dc)
# 5.准备YOLOv7格式数据集
如果不懂yolo格式数据集是什么样子的,建议[先学习一下该博客](https://afdian.net/item?plan_id=988690065fdd11ed83ea52540025c377)。大部分CVer都会推荐用labelImg进行数据的标注,我也不例外,推荐大家用labelImg进行数据标注。不过这里我不再详细介绍如何使用labelImg,网上有很多的教程。同时,标注数据需要用到图形交互界面,远程服务器就不太方便了,因此建议在本地电脑上标注好后再上传到服务器上。
这里假设我们已经得到标注好的yolo格式数据集,那么这个数据集将会按照如下的格式进行存放。
![n.png](693414604250bbb38c60df25b7f45630.png)
不过在这里面,train_list.txt和val_list.txt是后来我们要自己生成的,而不是labelImg生成的;其他的则是labelImg生成的。
接下来,就是生成 train_list.txt和val_list.txt。train_list.txt存放了所有训练图片的路径,val_list.txt则是存放了所有验证图片的路径,如下图所示,一行代表一个图片的路径。这两个文件的生成写个循环就可以了,不算难。
# 6.修改配置文件
[参考该博客的教程](https://mbd.pub/o/bread/Y5WUmJZq),总共有两个文件需要配置,一个是/yolov7/cfg/training/yolov7.yaml,这个文件是有关模型的配置文件;一个是/yolov7/data/coco.yaml,这个是数据集的配置文件。
## 第一步,复制yolov7.yaml文件到相同的路径下,然后重命名,我们重命名为yolov7-Helmet.yaml。
## 第二步,打开yolov7-Helmet.yaml文件,进行如下图所示的修改,这里修改的地方只有一处,就是把nc修改为我们数据集的目标总数即可。然后保存。
![b.png](049bbbb3ac694b49da06d048c747de74.png)
## 第三步,复制coco.yaml文件到相同的路径下,然后重命名,我们命名为Helmet.yaml。
## 第四步,打开Helmet.yaml文件,进行如下所示的修改,需要修改的地方为5处。
第一处:把代码自动下载COCO数据集的命令注释掉,以防代码自动下载数据集占用内存;第二处:修改train的位置为train_list.txt的路径;第三处:修改val的位置为val_list.txt的路径;第四处:修改nc为数据集目标总数;第五处:修改names为数据集所有目标的名称。然后保存。
![k.png](6572423d22e25e3e935ce6f3830f95ac.png)
# 7.训练代码
```
import argparse
import logging
import math
import os
import random
import time
from copy import deepcopy
from pathlib import Path
from threading import Thread
import numpy as np
import torch.distributed as dist
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
import torch.utils.data
import yaml
from torch.cuda import amp
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.tensorboard import SummaryWriter
from tqdm import tqdm
import test # import test.py to get mAP after each epoch
from models.experimental import attempt_load
from models.yolo import Model
from utils.autoanchor import check_anchors
from utils.datasets import create_dataloader
from utils.general import labels_to_class_weights, increment_path, labels_to_image_weights, init_seeds, \
fitness, strip_optimizer, get_latest_run, check_dataset, check_file, check_git_status, check_img_size, \
check_requirements, print_mutation, set_logging, one_cycle, colorstr
from utils.google_utils import attempt_download
from utils.loss import ComputeLoss, ComputeLossOTA
from utils.plots import plot_images, plot_labels, plot_results, plot_evolution
from utils.torch_utils import ModelEMA, select_device, intersect_dicts, torch_distributed_zero_first, is_parallel
from utils.wandb_logging.wandb_utils import WandbLogger, check_wandb_resume
logger = logging.getLogger(__name__)
def train(hyp, opt, device, tb_writer=None):
logger.info(colorstr('hyperparameters: ') + ', '.join(f'{k}={v}' for k, v in hyp.items()))
save_dir, epochs, batch_size, total_batch_size, weights, rank, freeze = \
Path(opt.save_dir), opt.epochs, opt.batch_size, opt.total_batch_size, opt.weights, opt.global_rank, opt.freeze
# Directories
wdir = save_dir / 'weights'
wdir.mkdir(parents=True, exist_ok=True) # make dir
last = wdir / 'last.pt'
best = wdir / 'best.pt'
results_file = save_dir / 'results.txt'
# Save run settings
with open(save_dir / 'hyp.yaml', 'w') as f:
yaml.dump(hyp, f, sort_keys=False)
with open(save_dir / 'opt.yaml', 'w') as f:
yaml.dump(vars(opt), f, sort_keys=False)
# Configure
plots = not opt.evolve # create plots
cuda = device.type != 'cpu'
init_seeds(2 + rank)
with open(opt.data) as f:
data_dict = yaml.load(f, Loader=yaml.SafeLoader) # data dict
is_coco = opt.data.endswith('coco.yaml')
# Logging- Doing this before checking the dataset. Might update data_dict
loggers = {'wandb': None} # loggers dict
if rank in [-1, 0]:
opt.hyp = hyp # add hyperparameters
run_id = torch.load(weights, map_location=device).get('wandb_id') if weights.endswith('.pt') and os.path.isfile(weights) else None
wandb_logger = WandbLogger(opt, Path(opt.save_dir).stem, run_id, data_dict)
loggers['wandb'] = wandb_logger.wandb
data_dict = wandb_logger.data_dict
if wandb_logger.wandb:
weights, epochs, hyp = opt.weights, opt.epochs, opt.hyp # WandbLogger might update weights, epochs if resuming
nc = 1 if opt.single_cls else int(data_dict['nc']) # number of classes
names = ['item'] if opt.single_cls and len(data_dict['names']) != 1 else data_dict['names'] # class names
assert len(names) == nc, '%g names found for nc=%g dataset in %s' % (len(names), nc, opt.data) # check
# Model
pretrained = weights.endswith('.pt')
if pretrained:
with torch_distributed_zero_first(rank):
attempt_download(weights) # download if not found locally
ckpt = torch.load(weights, map_location=device) # load checkpoint
model = Model(opt.cfg or ckpt['model'].yaml, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device) # create
exclude = ['anchor'] if (opt.cfg or hyp.get('anchors')) and not opt.resume else [] # exclude keys
state_dict = ckpt['model'].float().state_dict() # to FP32
state_dict = intersect_dicts(state_dict, model.state_dict(), exclude=exclude) # intersect
model.load_state_dict(state_dict, strict=False) # load
logger.info('Transferred %g/%g items from %s' % (len(state_dict), len(model.state_dict()), weights)) # report
else:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
为满足疫情时期的特殊需要,基于改进YOLOv7模型,设计一款应用于复杂场景的口罩佩戴识别检测系统。系统采用PyCharm集成开发环境,从网络上爬取1600张口罩佩戴相关的图片,在原始 k-means算法基础上加入聚类算法,获取与真实框之间的更高的先验框。在人机交互界面使用Qt组件设计,图像和模型数据加载使用开源OpenCV视觉库实现。口罩佩戴检测的核心算法使用目标检测算法中的YOLOv7训练并结合PyTorch框架实现。实验结果表明,系统能够实现多人场景下人群佩戴口罩状况的检测,在多人物以及实时检测场景中准确率有所提高,在使用和效果上都具有自身特有的优势
资源推荐
资源详情
资源评论
收起资源包目录
mask-recognition-yolo-python-main.zip (10个子文件)
mask-recognition-yolo-python-main
6572423d22e25e3e935ce6f3830f95ac.png 437KB
a0837a88b2dbb579977c8e294d33ee86.png 713KB
Thread_1.py 5KB
049bbbb3ac694b49da06d048c747de74.png 289KB
90d3624700969a75368488d55f9494c7.png 212KB
693414604250bbb38c60df25b7f45630.png 124KB
fe6f41192b4eff9eca5c31dcbe4dd3e1.png 563KB
a491aa3425782e1b0ee4516904f12421.png 684KB
train.py 38KB
README.md 49KB
共 10 条
- 1
资源评论
hakesashou
- 粉丝: 4192
- 资源: 1083
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功