当前位置: 首页 > article >正文

【目标检测】【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 ET
    
    def 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').text
            difficult = 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.0
                y_center = (ymin + ymax) / 2.0
                box_width = xmax - xmin
                box_height = ymax - ymin
    
                # 归一化处理
                x_center /= width
                y_center /= height
                box_width /= width
                box_height /= height
    
                # 添加到结果列表
                objects.append((0, x_center, y_center, box_width, box_height))
    
        return objects
    
    def 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.kler.cn/a/392539.html

相关文章:

  • qt QProcess详解
  • 界面控件Kendo UI for Angular中文教程:如何构建带图表的仪表板?(一)
  • macOS解决U盘装完系统容量变小的问题
  • 软件测试项目实战
  • 使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行
  • Chromium 中MemoryMappedFile使用例子c++
  • 【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • 软间隔支持向量机
  • 表格理解专题(五)表头和数据项定义
  • spark 设置hive.exec.max.dynamic.partition不生效
  • 01-Ajax入门与axios使用、URL知识
  • 深入理解指针
  • 搜索引擎算法解析提升搜索效率的关键要素
  • 【Linux】Ubuntu中muduo库的编译环境安装
  • C# (定时器、线程)
  • Flutter【04】高性能表单架构设计
  • 【深度学习】线性与非线性
  • 工程认证标准下的Spring Boot课程管理平台
  • Scala中set和case class的特点和例题
  • 私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用
  • Spring Boot编程训练系统:实现细节与技巧
  • 猿创征文|Inscode桌面IDE:打造高效开发新体验
  • 【Java SE】接口类型
  • qt QProcess详解
  • qt QKeySequence详解
  • MFC图形函数学习08——绘图函数的重载介绍