【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测

【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测

文章目录

  • 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测
  • 前言
  • YOLOV5模型运行环境搭建
  • YOLOV5模型运行
    • 数据集准备
    • YOLOV5运行
      • 模型训练
      • 模型验证
      • 模型推理
  • 总结


前言

Ultralytics YOLO 是一系列基于 YOLO(You Only Look Once)算法的检测、分割、分类、跟踪和姿势估计模型,由 Ultralytics 公司开发和维护,YOLO 算法以其快速和准确的目标检测能力而闻名。从最初的YOLOv1到最新的YOLOv11,每一代版本都在特征提取、边界框预测和优化技术等方面引入了重要的创新。这些改进特别是在骨干网络(backbone)、颈部(neck)和头部(head)组件上的进步,使得YOLO成为实时目标检测领域的领先解决方案。
【YOLO的发展历程参考】YOLOv5 旨在实时提供高速、高精度的结果,本博文将通过人脸检测项目简要介绍Ultralytics–YOLOv5的使用。【官方教程】【官方源码】


YOLOV5模型运行环境搭建

在win11环境下装anaconda环境,方便搭建专用于YOLOV5模型的虚拟环境。

  • 查看主机支持的cuda版本(最高)
    # 打开cmd,执行下面的指令查看CUDA版本号
    nvidia-smi
    
  • 安装GPU版本的torch【官网】
    博主的cuda版本是12.2,博主选的11.8也没问题。

    其他cuda版本的torch在【以前版本】找对应的安装命令。
  • 博主安装环境参考
    # 创建虚拟环境
    conda create -n ultralytics python=3.10
    # 查看新环境是否安装成功
    conda env list
    # 激活环境
    activate ultralytics
    # cd到合适的位置下载yolov5源码 
    git clone https://github.com/ultralytics/yolov5 
    cd yolov5
    # 切换到一个特定的v7.0版本
    git checkout tags/v7.0
    # 安装pytorch和torchvision,否则容易自动安装成CPU版本(不知原因)
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    # 安装运行所需的包,修改requirements中Pillow==9.5,删除torch和torchvision部分
    pip install -r requirements.txt
    # 安装 opencv
    # 查看所有安装的包
    pip list
    conda list
    

YOLOV5模型运行

数据集准备

  1. 数据集下载:人脸目标检测数据集WIDER_FACE_VOC2007.zip【百度云下载,提取码:u2b9 】,以下是下载的数据集格式

     WIDER_VOC2007└── Annotations		标签	├── 000001.xml├── 000002.xml├── ...└── ImageSets├── Main|   ├── train.txt	训练集|   ├── val.txt		验证集└── JPEGImages		图片├── 000001.jpg├── 000002.jpg├── ...
    
  2. 数据集格式转化:将原始标签的xml格式转化Ultralytics-YOLO的txt格式。

    每幅图像对应一个txt文件,如果图像中没有检测对象则不需要txt文件。
    每个对象占一行,每一行中包含的内容为:类别(class )、中心X坐标(x_center)、中心Y坐标(y_center)、图像宽度(width)和图像高度(height)。
    中心坐标已经宽高都做了归一化处理,从0到 1;类别编号从0开始。
    在这里插入图片描述

    这里博主提供了转化的python代码。

    import os
    import xml.etree.ElementTree as ETdef parse_xml(xml_file):# 解析XML文件tree = ET.parse(xml_file)root = tree.getroot()# 获取图像尺寸size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)# 初始化结果列表objects = []# 遍历所有的object标签for obj in root.findall('object'):name = obj.find('name').textdifficult = int(obj.find('difficult').text)# 只处理name为'face'且difficult为0的对象if name == 'face' and difficult == 0:bndbox = obj.find('bndbox')xmin = int(bndbox.find('xmin').text)ymin = int(bndbox.find('ymin').text)xmax = int(bndbox.find('xmax').text)ymax = int(bndbox.find('ymax').text)# 计算中心点坐标和宽高x_center = (xmin + xmax) / 2.0y_center = (ymin + ymax) / 2.0box_width = xmax - xminbox_height = ymax - ymin# 归一化处理x_center /= widthy_center /= heightbox_width /= widthbox_height /= height# 添加到结果列表objects.append((0, x_center, y_center, box_width, box_height))return objectsdef save_to_txt(objects, txt_file):with open(txt_file, 'w') as f:for obj in objects:line = ' '.join([str(x) for x in obj]) + '\n'f.write(line)def process_directory(input_directory, output_directory):# 确保输出目录存在if not os.path.exists(output_directory):os.makedirs(output_directory)# 遍历输入目录下的所有XML文件for filename in os.listdir(input_directory):if filename.endswith('.xml'):xml_file = os.path.join(input_directory, filename)txt_file = os.path.join(output_directory, filename.replace('.xml', '.txt'))# 解析XML并获取所需信息objects = parse_xml(xml_file)# 将结果保存到TXT文件save_to_txt(objects, txt_file)if __name__ == "__main__":input_directory = r'Annotations'  # 替换为你的XML文件所在目录output_directory = r'labels'  # 替换为你的输出目录process_directory(input_directory, output_directory)
    
  3. 数据集组织结构:将原始数据划分成训练集和测试集,并在当前yolov5工程下新建路径datasets/facedetection,将train和val数据集放到该路径下。

     facedetection└── train├── images|   ├── 000001.jpg|   ├── 000002.jpg|   ├── ...├── labels|   ├── 000001.txt|   ├── 000002.txt|   ├── ...└── val├── images|   ├── 000007.jpg|   ├── 0000010.jpg|   ├── ...├── labels|   ├── 000007.txt|   ├── 0000010.txt|   ├── ...
    

    这里博主提供了转化的python代码。

    import os
    import shutil
    import random# 原始文件路径
    image_dir = r'JPEGImages'
    label_dir = r'labels'# 新的文件路径
    train_dir = r'train'
    val_dir = r'val'# 创建新的文件夹
    os.makedirs(os.path.join(train_dir, 'images'), exist_ok=True)
    os.makedirs(os.path.join(train_dir, 'labels'), exist_ok=True)
    os.makedirs(os.path.join(val_dir, 'images'), exist_ok=True)
    os.makedirs(os.path.join(val_dir, 'labels'), exist_ok=True)# 获取所有图像文件名
    image_files = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]# 设置随机种子以保证结果可复现
    random.seed(42)# 打乱文件列表
    random.shuffle(image_files)# 计算训练集和验证集的数量
    split_index = int(0.8 * len(image_files))
    train_files = image_files[:split_index]
    val_files = image_files[split_index:]# 复制训练集文件
    for file_name in train_files:image_path = os.path.join(image_dir, file_name)label_path = os.path.join(label_dir, os.path.splitext(file_name)[0] + '.txt')# 复制图像文件shutil.copy(image_path, os.path.join(train_dir, 'images', file_name))# 复制标签文件shutil.copy(label_path, os.path.join(train_dir, 'labels', os.path.splitext(file_name)[0] + '.txt'))# 复制验证集文件
    for file_name in val_files:image_path = os.path.join(image_dir, file_name)label_path = os.path.join(label_dir, os.path.splitext(file_name)[0] + '.txt')# 复制图像文件shutil.copy(image_path, os.path.join(val_dir, 'images', file_name))# 复制标签文件shutil.copy(label_path, os.path.join(val_dir, 'labels', os.path.splitext(file_name)[0] + '.txt'))print("数据集划分完成")
    
  4. 配置facedetection.yaml:博主根据data/coco128.yaml文件,在data目录下同样配置了人脸目标检测的facedetection.yaml。

    path: datasets/facedetection		# 数据集路径
    train: train/images					# 训练集
    val: val/images						# 验证集
    names:								# 标签序号0: face
    

YOLOV5运行

模型训练

train.py配置训练参数:在有标注的者训练集进行模型的训练,并在验证集上评估。

常用参数含义
weights:指定预训练模型的权重文件;
cfg:存储模型结构的配置文件;
data:存储训练、测试数据的配置文件;
batch-size:一次训练的图片数量;
img-size:输入图片宽高,根据需求和硬件条件修改;
device:模型运行的设备,cuda 0,1,2,3或者cpu.
其他参数在后续讲解具体代码的过程中再去解释。

训练运行以下命令:

python train.py --img 640 --epochs 300 --data data/facedetection.yaml --batch 16 --weights yolov5s.pt --cfg yolov5s.yaml --device 0  

weights 参数和 cfg 参数对应的模型有冲突,以 cfg 指定的模型为基准。

模型验证

val.py参数验证配置:在有标注的者验证集上进行模型效果的评估模型好坏,目标检测中最常使用的评估指标为mAP。

常用参数含义
data:存储训练、测试数据的配置文件;
weights:指定预训练模型的权重文件;
batch-size:一次验证的图片数量;
img-size:输入图片宽高,根据需求和硬件条件修改;
device:模型运行的设备,cuda 0,1,2,3或者cpu;
augment:额外的数据增强.
其他参数在后续讲解具体代码的过程中再去解释。

验证运行以下命令:

python val.py --img 640  --data data/facedetection.yaml --batch 16 --weights runs/train/exp/weights/best.pt  --device 0 --augment

这里博主随便找了一次训练过程中的中间训练权重进行演示,所以精度不是很高。

模型推理

detect.py配置推理参数:没有标注的数据集上进行推理。

常用参数含义
weights:指定预训练模型的权重文件;
img-size:输入图片宽高,根据需求和硬件条件修改;
device:模型运行的设备,cuda 0,1,2,3或者cpu;
–conf-thres:指定置信度阈值;
–iou-thres:非极大值抑制IoU 阈值;
–augment:额外的数据增强.
其他参数在后续讲解具体代码的过程中再去解释。

推理运行以下命令:

python detect.py --weights runs/train/exp/weights/best.pt --source data/images --device 0 --conf-thres 0.7 --iou-thres 0.3

总结

尽可能简单、详细的介绍了YOLOV5的安装流程以及YOLOV5的使用方法。后续会根据自己学到的知识结合个人理解讲解YOLOV5的原理和代码。

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

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

相关文章

使用Axios函数库进行网络请求的使用指南

目录 前言1. 什么是Axios2. Axios的引入方式2.1 通过CDN直接引入2.2 在模块化项目中引入 3. 使用Axios发送请求3.1 GET请求3.2 POST请求 4. Axios请求方式别名5. 使用Axios创建实例5.1 创建Axios实例5.2 使用实例发送请求 6. 使用async/await简化异步请求6.1 获取所有文章数据6…

windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)

目的 向日葵最先放弃了, todesk某些功能需要收费, 不想用了想要 自己搭建远程桌面 自己使用希望可以电脑 控制手机分辨率高一些 原理理解 ubuntu云服务器配置 够买好自己的云服务器, 安装 Ubuntu操作系统 点击下载 hbbr 和 hbbs 两个 deb文件: https://github.com/rustdesk/…

MySQL-关联查询和子查询

目录 一、笛卡尔积 二、表连接 1、内部连接 1.1 等值连接 1.2 非等值连接 2、外部链接 2.1 左外连接-LEFT JOIN 2.2 右外连接-RIGHT JOIN 2.3 全关联-FULL JOIN/UNION 三、子查询 1、嵌套子查询 2、相关子查询 3、insert和select语句添加数据 4、update和select语…

AWTK-WIDGET-WEB-VIEW 实现笔记 (1) - 难点

webview 提供了一个跨平台的 webview 库,其接口简单,提供的例子也直观易懂。但是把它集成到 AWTK 里,还是遇到一些难题,这里记录一下,供有需要的朋友参考。 1. 作为 AWTK 控件 webview 提供的例子都是独立的程序&…

类与对象;

目录 一、认识类; 1、类的引入; 2、类的定义; 类的两种定义方式: 3、类的访问限定符及封装; 4、类的作用域; 5、类的实例化; 6、类对象模型; 计算类对象的大小; …

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库,过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 (停止mysql的命令为:sudo service mysql stop&#xff0…

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan 背景 在使用Ant Design Vue 开发数据表格时,我们常常会遇到需要合并单元格的需求。 比如,某些字段的值可能会在多行中重复出现,而我们希望将这些重复的单元格合并为…

27.<Spring博客系统③(实现用户退出登录接口+发布博客+删除/编辑博客)>

PS:关于打印日志 1.建议在关键节点打印日志。 ①请求入口。 ②结果响应 2.在可能发生错误的节点打印日志 3.日志不是越多越好。因为打日志也会消耗性能。 日志也可以配置去除重复日志。 一、用户退出功能 判断用户退出。我们只需要在前端将token删掉就可以了。 由于…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值,常用来表示对象属性的唯一标识 复杂数据类型 object,数组,函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

uniapp自动注册机制:easycom

传统 Vue 项目中,我们需要注册、导入组件之后才能使用组件。 uniapp 框架提供了一种组件自动注册机制,只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范,就能直接使用。 注意:组件的文件夹…

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代,人工智能(AI)与搜索引擎优化(SEO)的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作,它直接影响到网站的可见性和流量。通过运用智能算法,企业能…

【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法

博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

卷径计算(基于卷径变化微分方程计算实时卷径)

这里本质是积分法计算实时卷径,PLC里如何实现数值积分器算法请参考下面文章链接: 博途PLC数值积分器(矩形积分和梯形积分法自由切换) 博途PLC数值积分器(矩形梯形积分自由切换)_博图 积分计算-CSDN博客文章浏览阅读505次。本文详细介绍了博途PLC的数值积分器功能,涵盖了矩…

【Mysql】Mysql的多表查询---多表联合查询(上)

1、介绍 多表查询就是同时查询两个或者两个以上的表,因为有的时候,用户在查看数据的时候,需要显示的数据来自多张表,多表查询有以下分类: (1)交叉连接查询(产生笛卡尔积&#xff0…

Shell基础(4)

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…

跨平台WPF框架Avalonia教程 十五

ListBox 列表框 列表框从元素源集合中显示多行元素,并允许选择单个或多个。 列表中的元素可以组合、绑定和模板化。 列表的高度会扩展以适应所有元素,除非特别设置(使用高度属性),或由容器控件设置,例如…

有序数组的平方(leetcode 977)

一个数组&#xff0c;返回一个所有元素的平方之后依然是一个有序数组。&#xff08;数组中含负数&#xff09; 解法一&#xff1a;暴力解法 所有元素平方后再使用快速排序法重新排序&#xff0c;时间复杂度为O(nlogn)。 class Solution { public:vector<int> sortedSqu…

使用 Go 实现将任何网页转化为 PDF

在许多应用场景中&#xff0c;可能需要将网页内容转化为 PDF 格式&#xff0c;比如保存网页内容、生成报告、或者创建网站截图。使用 Go 编程语言&#xff0c;结合一些现有的库&#xff0c;可以非常方便地实现这一功能。本文将带你一步一步地介绍如何使用 Go 语言将任何网页转换…

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

基础IO2

文章目录 磁盘结构磁盘存储结构磁盘的逻辑结构引入文件系统理解文件系统inode 映射 data blocks文件名与inode的关系dentry树文件描述符与进程之间的关系 深刻理解软硬链接软链接硬链接 动静态库静态库1. 手动制作静态库2.调用静态库(1)安装到系统(2)自己指定查找路径(3)自己创…