用yoloV5做一个口罩检测的全流程实现

制作数据集

收集相关图片:
可以使用爬虫在百度爬取。爬虫代码如下:

# -*- coding: UTF-8 -*-"""
import requests
import tqdmdef configs(search, page, number):""":param search::param page::param number::return:"""url = 'https://image.baidu.com/search/acjson'params = {"tn": "resultjson_com","logid": "11555092689241190059","ipn": "rj","ct": "201326592","is": "","fp": "result","queryWord": search,"cl": "2","lm": "-1","ie": "utf-8","oe": "utf-8","adpicid": "","st": "-1","z": "","ic": "0","hd": "","latest": "","copyright": "","word": search,"s": "","se": "","tab": "","width": "","height": "","face": "0","istype": "2","qc": "","nc": "1","fr": "","expermode": "","force": "","pn": str(60 * page),"rn": number,"gsm": "1e","1617626956685": ""}return url, paramsdef loadpic(number, page):""":param number::param page::return:"""while (True):if number == 0:breakurl, params = configs(search, page, number)result = requests.get(url, headers=header, params=params).json()url_list = []for data in result['data'][:-1]:url_list.append(data['thumbURL'])for i in range(len(url_list)):getImg(url_list[i], 60 * page + i, path)bar.update(1)number -= 1if number == 0:breakpage += 1print("\nfinish!")def getImg(url, idx, path):""":param url::param idx::param path::return:"""img = requests.get(url, headers=header)file = open(path + 'maintenanceWorker21_' + str(idx + 1) + '.jpg', 'wb')file.write(img.content)file.close()if __name__ == '__main__':search = input("请输入搜索内容:")number = int(input("请输入需求数量:"))path = './car'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}bar = tqdm.tqdm(total=number)page = 0loadpic(number, page)

安装标注工具labelme

pip insatll lablelme

cmd中输入命令label.exe打开软件。

标注技巧

常用快捷键:D(打开上一张图片),A(打开下一张图片),Ctrl+Z撤销上一个点。
在这里插入图片描述
最好将图片和标记后的json文件放在一个文件夹下。

转换格式

安装labelme2yolo工具:pip install labelme2yolo
通过labelme2yolo --help可以查看用法:
在这里插入图片描述

在cmd中使用如下命令即可以完成转换:

labelme2yolo --json_dir="json文件的路径" --val_size=0.2 --test_size=0 --output_format="bbox"

转换完成就就会在json文件的目录下生成已经划分好的数据集:YOLODataset
在这里插入图片描述

下载yoloV5

github下载yoloV5
在这里插入图片描述
安装相关的库:
在安装前,如果环境以及安装了torch,就将requirements.txt中的torch部分注释掉,如果尚未安装torch,也不要使用国内镜像取安装torch,国内镜像安装的是cpu版本。
在这里插入图片描述

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

下面直接使用命令行来实现训练,就不需要取改文件的路径;

  • 使用YOLOv5的train.py脚本来训练模型,具体命令如下:
python3 train.py --img 640 --batch 16 --epochs 50 --data data.yaml --weights yolov5s.pt --device 0

–img:输入图像大小(这里为640x640)。
–batch:批次大小(这里为16)。
–epochs:训练轮数(这里为50)。
–data:数据集配置文件路径(这里为data.yaml)。
–weights:预训练模型权重文件(这里为yolov5s.pt)。
–device:设备编号(0表示使用第一个GPU)。

  • 使用YOLOv5的val.py脚本来验证模型性能,具体命令如下:
python3 val.py --img 640 --batch 16 --data data.yaml --weights runs/train/exp/weights/best.pt --device 0

–weights:训练好的模型权重文件路径(这里为runs/train/exp/weights/best.pt)

  • 使用YOLOv5的detect.py脚本来进行目标检测,具体命令如下:
python3 detect.py --source ../coco/val2017 --weights runs/train/exp/weights/best.pt --img 640 --conf 0.25 --device 0

–source:待检测的图像或视频文件路径(这里为…/coco/val2017)。
–conf:置信度阈值(这里为0.25)。

将训练好的YOLOv5模型转换为ONNX格式

确保你已经安装了必要的依赖项,尤其是onnx和onnx-simplifier:

pip install onnx onnx-simplifier
  • 使用export.py脚本导出ONNX模型
    在YOLOv5目录中运行以下命令,将训练好的模型转换为ONNX格式:
python3 export.py --weights runs/train/exp/weights/best.pt --img 640 --batch 1 --device 0 --simplify

–weights:训练好的模型权重文件路径(这里为runs/train/exp/weights/best.pt)。
–img:输入图像大小(这里为640x640)。
–batch:批次大小(通常为1)。
–device:设备编号(0表示使用第一个GPU)。
–simplify:使用ONNX Simplifier来简化模型。

加载.onnx代码

import onnxruntime as ort
import numpy as np
import cv2def preprocess(image_path, input_size):# 加载图像img = cv2.imread(image_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 调整图像大小img = cv2.resize(img, (input_size, input_size))# 标准化图像img = img / 255.0# 转换为NCHW格式img = np.transpose(img, (2, 0, 1)).astype(np.float32)# 添加批次维度img = np.expand_dims(img, axis=0)return imgdef postprocess(output, conf_threshold=0.5, iou_threshold=0.4):# 假设输出为 (1, num_boxes, 6) 形状,6 包含 (x, y, w, h, conf, class_id)output = output[0]  # 提取第一个批次的输出boxes = output[:, :4]scores = output[:, 4]class_ids = output[:, 5].astype(np.int32)# 过滤低置信度检测mask = scores > conf_thresholdboxes = boxes[mask]scores = scores[mask]class_ids = class_ids[mask]# 非极大值抑制indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), conf_threshold, iou_threshold)boxes = [boxes[i] for i in indices]scores = [scores[i] for i in indices]class_ids = [class_ids[i] for i in indices]return boxes, scores, class_idsdef infer(image_path, model_path, input_size=640):# 加载ONNX模型session = ort.InferenceSession(model_path)# 获取模型输入名称input_name = session.get_inputs()[0].name# 预处理图像img = preprocess(image_path, input_size)# 推理outputs = session.run(None, {input_name: img})# 打印输出内容for i, output in enumerate(outputs):print(f"Output {i}: {output.shape}")# 后处理boxes, scores, class_ids = postprocess(outputs[0])return boxes, scores, class_ids# 推理示例
image_path = './image.jpg'
model_path = './model.onnx'boxes, scores, class_ids = infer(image_path, model_path)# 打印检测结果
for box, score, class_id in zip(boxes, scores, class_ids):print(f"Class ID: {class_id}, Score: {score}, Box: {box}")

在这里插入图片描述

详细解释
  • Class ID:这是检测到的对象的类别ID。在你的例子中,所有检测的对象类别ID为0。你可以根据你训练模型时的类别列表(data.yaml文件中的names字段)来确定类别ID对应的实际对象名称。
  • Score:这是置信度分数,表示模型认为这个检测框中包含对象的概率。在你的例子中,置信度分数分别是0.838, 0.784, 0.700, 0.534。
  • Box:这是检测框的坐标和尺寸。格式为 [中心点x坐标, 中心点y坐标, 宽度, 高度]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面控件Telerik UI for WPF 2024 Q2亮点 - 全新的AIPrompt组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…

C++:类和对象2

1.类的默认成员函数 默认成员函数就是用户没有显示实现编译器会自动生成的成员函数称为默认成员函数。一个类,我们在不写的情况下编译器会默认生成6个默认成员函数,分别是构造函数,析构函数,拷贝构造函数,拷贝赋值运算…

Perl数据库交互精要:使用DBI模块连接和操作数据库

引言 Perl作为一种功能强大的脚本语言,提供了与数据库交互的能力,这主要得益于DBI(Database Interface)模块。DBI是一个标准化的数据库访问接口,允许Perl脚本连接到各种类型的数据库并执行SQL语句。本文将详细介绍如何…

kitti数据集转为bag

下载原始的数据集后,通过终端来运行: unzip 2011_10_03_calib.zip和 unzip 2011_10_03_drive_0047_sync.zip这样这个文件夹才算准备好: 然后去下载kitti2bag工具: pip install kitti2bag然后去2011_10_03文件夹下执行&#xf…

大疆创新2025校招内推

大疆2025校招-内推 一、我们是谁? 大疆研发软件团队,致力于把大疆的硬件设备和大疆用户紧密连接在一起,我们的使命是“让机器有温度,让数据会说话”。 在消费和手持团队,我们的温度来自于激发用户灵感并助力用户创作…

泰山派RK3566开发板800x1280MIPI屏设备树补丁

泰山派RK3566开发板800x1280MIPI屏设备树补丁 泰山派下800 X 1280分辨率MIPI屏调试,设备树补丁如下: https://download.csdn.net/download/qq_45143522/89584066 用kernel.patch文件,在泰山派内核源码下打补丁即可完成更新,或者…

嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…

深度学习目标检测入门实战

深度学习目标检测入门实战 一、什么是目标检测二、目标检测常用的数据集(开源)(一)VOC数据集(1)背景知识(2)数据集的下载(3)VOC2007 数据集的标注&#xff08…

chrome 接口请求等待时间(installed 已停止)过长问题定位

参考: 解决实际项目中stalled时间过久的问题 背景: 测试反馈系统开 6 个标签页后, 反应变的很慢 定位: 看接口请求瀑布流, 已停止时间很长, 后端返回速度很快, 确定是前端的问题 推测是并发请求窗口数量的问题, 屏蔽部分一直 pending 的接口, 发现速度正常了, 搜到上面的参…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

ios 语言基础初探Xcode 工具

iOS语言基础&初探Xcode工具 导言: 随着智能手机的普及,iOS操作系统成为了一个非常受欢迎的移动开发平台。而iOS应用的开发需要掌握相关的编程语言和开发工具。本文将介绍iOS开发的基础知识,包括iOS开发的编程语言和开发工具,…

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上,继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示:

python实现建立一个智能小车路径规划

在Python中实现一个智能小车的路径规划系统,你可以采用多种方法和库。这里,将给出一个基于图搜索算法(如A*算法)的简单示例,并结合一些Python库如networkx来处理图的操作,以及matplotlib来可视化路径。 步…

如何在Html界面内实现类似ChatGpt的打字效果

为了在你的代码中添加打字机效果,你可以创建一个函数来逐字展示内容。这个函数会将内容分解成单个字符,然后逐渐显示在页面上。下面是如何实现这个效果的步骤: 1. 定义打字机效果的函数 首先,你需要一个函数来逐步显示文本内容。…

简洁高效的设备稼动率采集系统(一)

前言: 在自动化生产行业,每个公司都需要一款高效的生产设备,那我们怎么体现出设备的高效呢? 可以采集设备的状态,经过成熟的算法,得到设备的稼动率。设备稼动率是衡量生产设备在一定时间内真正处于生产状态…

Django学习(二)

get请求 练习: views.py def test_method(request):if request.method GET:print(request.GET)# 如果链接中没有参数a会报错print(request.GET[a])# 使用这个方法,当查询不到参数时,不会报错而是返回你设置的值print(request.GET.get(c,n…

Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名

创建 Vue3Vite 项目 创建 Vue3 项目 $ pnpm create vuelatest通过脚手架选择开启以下功能 ✔ Project name: … <your-project-name> ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development?…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

MATLAB粒子群算法求解同时取送货的充电电动车辆路径规划EVRPSPD代码实例

MATLAB粒子群算法求解同时取送货的充电电动车辆路径规划EVRPSPD代码实例 MATLAB粒子群算法求解同时取送货的充电电动车辆路径规划EVRPSPD代码实例

数学基础 -- 三角函数的常见极限与常见导数

三角函数的极限与导数 三角函数在微积分中有着广泛的应用&#xff0c;特别是在极限和导数的计算中。以下是一些关于三角函数极限与导数的基础知识。 一、三角函数的极限 常见极限公式 lim ⁡ x → 0 sin ⁡ x x 1 \lim_{x \to 0} \frac{\sin x}{x} 1 limx→0​xsinx​1 li…