目标检测笔记(十三): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程))

文章目录

  • 一、目标检测介绍
  • 二、YOLOv5介绍
    • 2.1 和以往版本的区别
  • 三、代码获取
    • 3.1 视频代码介绍
  • 四、环境搭建
  • 五、数据集准备
    • 5.1 数据集转换
    • 5.2 数据集验证
  • 六、模型训练
  • 七、模型验证
  • 八、模型测试
  • 九、评价指标

一、目标检测介绍

目标检测(Object Detection)是计算机视觉领域的一个重要研究方向,其主要任务是从图像或视频中识别并定位出感兴趣的目标对象。目标检测技术在许多实际应用中具有广泛的用途,如自动驾驶、视频监控、医学影像分析等。

目标检测的主要方法可以分为两大类:基于传统机器学习的方法和基于深度学习的方法。

  • 基于传统机器学习的方法:这些方法主要依赖于手工设计的特征提取器和分类器。常用的特征提取器包括SIFT、SURF、HOG等,而分类器则可以是支持向量机(SVM)、随机森林(Random Forest)、K-近邻(KNN)等。这类方法通常需要大量的标注数据进行训练,但在一些特定场景下,它们仍具有一定的性能。

  • 基于深度学习的方法:近年来,深度学习在目标检测领域取得了显著的进展。深度学习方法主要包括卷积神经网络(CNN)和区域卷积神经网络(R-CNN)。

    • 卷积神经网络(CNN):CNN通过多层卷积层和池化层来自动学习图像的特征表示。著名的目标检测网络有Faster R-CNN、Faster R-CNN v2和YOLO(You Only Look Once)。这些网络可以生成候选框,然后使用非极大值抑制(NMS)等技术去除重叠的框,从而得到最终的目标检测结果。
    • 区域卷积神经网络(R-CNN):R-CNN通过引入Region Proposal Network (RPN)来生成候选框。RPN首先在图像中生成一系列可能包含目标的区域,然后将这些区域送入CNN进行特征提取和分类。著名的R-CNN网络有Fast R-CNN、Faster R-CNN和Mask R-CNN。这些网络相较于传统的目标检测方法具有更高的准确率和速度。

随着深度学习技术的发展,目标检测的性能得到了显著提升,同时计算复杂度也得到了降低。这使得目标检测技术在各种应用场景中得到了广泛应用。

二、YOLOv5介绍

YOLOv5是一种目标检测算法,是YOLO(You Only Look Once)系列的较新版本。它由ultralytics团队开发的,采用PyTorch框架实现。

YOLOv5相较于之前的版本,有以下几个显著的改进

  • 更高的精度:YOLOv5在精度上有了显著提升,特别是在小目标检测方面。
  • 更快的速度:YOLOv5相较于YOLOv4,速度更快,可以实时运行在较低的硬件设备上。
  • 更小的模型:YOLOv5相较于YOLOv4,模型大小更小,占用更少的存储空间。
  • 更好的可扩展性:YOLOv5可以很容易地进行模型的扩展和修改,以适应不同的任务和数据集。

YOLOv5的工作流程如下:

  1. 输入图像被分割成一系列的网格。
  2. 每个网格预测一系列的边界框,以及每个边界框属于不同类别的概率。
  3. 使用非极大值抑制(NMS)算法,去除重叠较多的边界框,并选择最终的检测结果。

YOLOv5可以用于各种目标检测任务,如人脸检测、车辆检测、行人检测等。它在许多计算机视觉竞赛中取得了优异的成绩,并且被广泛应用于实际应用中,如自动驾驶、视频监控等。

2.1 和以往版本的区别

YOLOv1:

  • 主干部分主要由卷积层、池化层组成,输出部分由两个全连接层组成用来预测目标的位置和置信度。
  • 原理:将每一张图片平均的分成7x7个网格,每个网格分别负责预测中心点落在该网格内的目标。
  • 优点:检测速度快、迁移能力强
  • 缺点:输入尺寸是固定的,有较大的定位误差

YOLOv2:

  • 在继续保持处理速度的基础上,从预测更准确(Better)速度更快(Faster),**识别对象更多(Stronger)**这三个方面进行了改进
  • 加入BN层,加速收敛;加入先验框解决物体漏检问题;多尺度训练,网络可自动改变尺寸等等
  • 优点:收敛速度快、可自动改变训练尺寸。
  • 缺点:对于小目标检测不友好

YOLOv3:

  • 针对v2的缺点,1)加入了更好的主干网络(Darknet53),而不是VGG;2)为了提升小目标检测还加入了FPN网络;3)通过聚类生成先验框(一个框:长宽,根据纵横比和它的尺寸生成的先验框);4)加入了更好的分类器-二元交叉熵损失。
  • 优点:增强了对于小目标的检测
  • 缺点:参数量太大

YOLOv4:

  • 差别
    • 特征提取网络的不同:1)Darknet53变成CSPDarknet53(降低了计算量,丰富了梯度信息,降低了梯度重用)相当于多个一个大残差边,再将这部分融合;2)加入了SPP-空间金字塔池化,增加感受野;3)加入了PAN操作,增加一条下采样操作
    • 激活函数不同:由leakyrelu变为mish激活函数
    • loss不同:余弦退火衰减,学习率会先上升再下降
    • 数据增强方法:采用了Cutout(随机剪切框)、GridMask(图像的区域隐藏在网格中)、MixUp(两张图混合)、Mosaic(四张图混合)等方法
  • 优点:激活函数无边界,从而避免饱和;融合了多种tricks提升网络性能;参数量相比v3更低,速度更快。
  • 缺点:不够灵活,代码对用户体验不好

YOLOv5:

  • 差别
    • 自定锚框定义:自动预先利用聚类自定义锚框
    • 控制模型大小:通过控制深度和宽度控制模型的大小,从而区分出s,m,l,x的不同尺寸的模型
    • 优化函数:提供了两个优化函数Adam和SGD,并都预设了与之匹配的训练超参数
    • 非极大值抑制:DIoU-nms变为加权nms。
    • Focus操作:加入切片操作,提升训练速度
  • 优点:灵活性更强,速度更快;使用Pytorch框架对用户更好,精度高。
  • 缺点:Focus的切片操作对嵌入式并不友好,网络量化不支持Focus;精度和速度不平衡。
  • 正负样本匹配策略:通过k-means聚类获得9个从小到大排列的anchor框,一个GT可以同时分配给多个anchor,它们是直接使用Anchor模板与GT Boxes进行粗略匹配,如果GT与某个anchor的iou大于给定的阈值,GT则分配给该Anchor,也就是说可以定位到对应cell的对应Anchor。以前是一个GT只分配给一个anchor。
  • 坐标定义1:xyxy→通常为(x1, y1, x2, y2),先两个表示左上角的坐标,再两个表示右下角的坐标。具体来说,这里的‘x1’表示bbox左上角的横坐标,‘y1’表示bbox左上角的纵坐标,‘x2’表示bbox右下角的横坐标,‘y2’表示bbox右下角的纵坐标。
  • 坐标定义2:xywh→通常为(x, y, w, h),也就是先两个表示bbox左上角的坐标,再两个表示bbox的宽和高,因此被称为 ‘xywh’ 表示。具体来说,这里的‘x’表示bbox左上角的横坐标,‘y’表示bbox左上角的纵坐标,‘w’表示bbox的宽度,‘h’表示bbox的高度。

三、代码获取

https://github.com/ultralytics/yolov5

3.1 视频代码介绍

可参考这个视频代码讲解:点击

四、环境搭建

安装ultralytics、cuda、pytorch、torchvision,然后执行pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
如果是cpu,则直接安装cpu对应的pytorch和torchvision,然后再执行后面的pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。
参考这个博客:点击

五、数据集准备

首先我们可以通过labelImg来对图片进行标注,标注的适合我们可以选择保存为VOC或者YOLO格式的数据集,VOC对应为XML,YOLO对应为TXT。具体的准备过程可参考这篇博客:数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

5.1 数据集转换

参考这篇博客:数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

5.2 数据集验证

参考这篇博客:数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

import cv2
import os# 读取txt文件信息
def read_list(txt_path):pos = []with open(txt_path, 'r') as file_to_read:while True:lines = file_to_read.readline()  # 整行读取数据if not lines:break# 将整行数据分割处理,如果分割符是空格,括号里就不用传入参数,如果是逗号, 则传入‘,'字符。p_tmp = [float(i) for i in lines.split(' ')]pos.append(p_tmp)  # 添加新读取的数据# Efield.append(E_tmp)passreturn pos# txt转换为box
def convert(size, box):xmin = (box[1] - box[3] / 2.) * size[1]xmax = (box[1] + box[3] / 2.) * size[1]ymin = (box[2] - box[4] / 2.) * size[0]ymax = (box[2] + box[4] / 2.) * size[0]box = (int(xmin), int(ymin), int(xmax), int(ymax))return boxdef draw_box_in_single_image(image_path, txt_path):# 读取图像image = cv2.imread(image_path)pos = read_list(txt_path)for i in range(len(pos)):label = classes[int(str(int(pos[i][0])))]print('label is '+label)box = convert(image.shape, pos[i])image = cv2.rectangle(image,(box[0], box[1]),(box[2],box[3]),colores[int(str(int(pos[i][0])))],2)cv2.putText(image, label,(box[0],box[1]-2), 0, 1, colores[int(str(int(pos[i][0])))], thickness=2, lineType=cv2.LINE_AA)cv2.imshow("images", image)cv2.waitKey(0)if __name__ == '__main__':img_folder = "D:\Python\company\Object_detection\datasets\mask_detection/train\images"img_list = os.listdir(img_folder)img_list.sort()label_folder = "D:\Python\company\Object_detection\datasets\mask_detection/train/labels"label_list = os.listdir(label_folder)label_list.sort()classes = {0: "no-mask", 1: "mask"}colores = [(0,0,255),(255,0,255)]for i in range(len(img_list)):image_path = img_folder + "\\" + img_list[i]txt_path = label_folder + "\\" + label_list[i]draw_box_in_single_image(image_path, txt_path)

六、模型训练

我们将所有的原图和TXT标签得到之后,为下图结构:
mask_detection

  • images
    • train
    • val
  • labels
    • train
    • val
      在这里插入图片描述
      修改yaml数据集配置文件:
      在这里插入图片描述
      统计口罩佩戴的数量信息:
# 只需要修改txt路径和样本数和类别名
import ostxt_path = "D:\Python\company\Object_detection\datasets\mask_detection/train/labels" # txt所在路径
class_num = 2  # 样本类别数
classes = {0: "no-mask", 1: "mask"}
class_list = [i for i in range(class_num)]
class_num_list = [0 for i in range(class_num)]
labels_list = os.listdir(txt_path)
for i in labels_list:file_path = os.path.join(txt_path, i)file = open(file_path, 'r')  # 打开文件file_data = file.readlines()  # 读取所有行for every_row in file_data:class_val = every_row.split(' ')[0]class_ind = class_list.index(int(class_val))class_num_list[class_ind] += 1file.close()
# 输出每一类的数量以及总数
for i in classes:print(classes.get(i),":",class_num_list[i])
print('total:', sum(class_num_list))

开始准备训练:

python train.py --data data/mask.yaml --weights weights/yolov5s.pt --img 640 --epochs 20 --workers 4 --batch-size 8

在这里插入图片描述

七、模型验证

python val.py --weights runs/train/exp/weights/best.pt --data data/mask.yaml

在这里插入图片描述

八、模型测试

python detect.py --weights runs/train/exp/weights/best.pt

在这里插入图片描述

九、评价指标

YOLOv5是一种用于目标检测的深度学习模型,它使用了YOLO(You Only Look Once)算法。评价指标是用来衡量模型性能的指标,以下是YOLOv5常用的评价指标介绍:

  • mAP(mean Average Precision):平均精度均值。mAP是目标检测中最常用的评价指标之一,它综合考虑了准确率和召回率。mAP的取值范围是0到1,数值越高表示模型性能越好。

    • mAP50:是指平均精确度(mean Average Precision)的值,其中计算的是检测模型在IoU(Intersection over Union)阈值为0.5时的平均精确度。
    • mAP50-95 : mAP50-95是指在计算平均精确度时,使用IoU阈值从0.5到0.95的范围进行计算,然后取平均值。这个指标可以更全面地评估检测模型在不同IoU阈值下的表现。
  • Precision(精确率):精确率是指模型预测为正例中真正为正例的比例。Precision的计算公式是预测为正例且正确的样本数除以预测为正例的样本数。

  • Recall(召回率):召回率是指真实为正例中被模型正确预测为正例的比例。Recall的计算公式是预测为正例且正确的样本数除以真实为正例的样本数。

  • F1-score:F1-score是精确率和召回率的调和平均值,它综合考虑了两者的性能。F1-score的计算公式是2 * (Precision * Recall) / (Precision + Recall)。

  • AP(Average Precision):平均精度。AP是mAP的组成部分,它是在不同的置信度阈值下计算得到的精度值的平均值。

  • IoU(Intersection over Union):交并比。IoU是计算预测框和真实框之间重叠部分的比例,用于判断预测框和真实框的匹配程度。一般情况下,当IoU大于一定阈值时,认为预测框和真实框匹配成功。


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

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

相关文章

2023国赛高教社杯数学建模C题思路分析

1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

【AWS】如何用SSH连接aws上的EC2实例(虚拟机)?

目录 0.环境 1.连接结果示例 2.SSH连接思路 3.具体步骤 1)安装并运行ssh服务 2)启动ssh服务 3)在AWS上找到正在运行的EC2实例,并且根据提供的ssh连接语句进行连接 0.环境 windows 11 64位 前提: 有aws账户&…

学生信息系统(python实现)

#codingutf-8 import os.path filenamestudent.txtdef menm():#菜单界面print(学生管理系统)print(-----------------------------功能菜单-----------------------------)print(\t\t\t\t\t\t1.录入学生信息)print(\t\t\t\t\t\t2.查找学生信息)print(\t\t\t\t\t\t3.删除学生信息…

list【2】模拟实现(含迭代器实现超详解哦)

模拟实现list 引言(实现概述)list迭代器实现默认成员函数operator* 与 operator->operator 与 operator--operator 与 operator!迭代器实现概览 list主要接口实现默认成员函数构造函数析构函数赋值重载 迭代器容量元素访问数据修改inserterasepush_ba…

堆排序详解

堆:是一种特殊的完全二叉树,一般通过顺序表存储,分为大堆和小堆两类。 大堆:父节点的值恒大于子节点的值。 小堆:父节点的值恒小于子节点的值。 创建堆,可以使得根节点成为整个堆中保存最大或最小的值的…

基于jeecg-boot的flowable流程历史记录显示修改

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 历…

一文搞定接口幂等性架构设计方案

幂等性介绍 现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中,就会存在若干个微服务,而且服务间也会产生相互通信调用。那么既然产生了服务调用,就必然会存在服务调用延迟或失败的问题。当出现这种问题&a…

系列四、Nginx的常用命令和配置文件

一、常用命令 1.1、查看nginx的版本号 ./nginx -v 1.2、启动nginx cd /usr/local/nginx/sbin./nginx 1.3、停止nginx cd /usr/local/nginx/sbin./nginx -s stop 1.4、重新加载nginx 说明:该命令用于修改配置文件后,在不重启nginx的情况下使配置文…

FPGA通信—千兆网(UDP)软件设计

一、PHY引脚功能描述 引脚功能描述1CLK25 CLK125:内部PLL生成的125MHz参考时钟,如MAC未使用125MHe时钟,则此引脚应保持浮动, 2 4 63 GND 接地3REG OUT开关压器,1.05V输出 5 6 8 9 11 12 14 15 MDI[0] MDI[0]- MDI[1] MDI[1…

学习笔记-BNF、EBNF、ABNF语法格式描述规范

目标是确认一些c/cpp的语法细节,需要看cpp语法定义文件。 考虑从c的语法定义文件开始确认。 考虑实现一个简化的语言定义和编译器,为后续的实际需求做自定义扩展。 参考网页: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_f…

高可用Kuberbetes部署Prometheus + Grafana

概述 阅读官方文档部署部署Prometheus Grafana GitHub - prometheus-operator/kube-prometheus at release-0.10 环境 步骤 下周官方github仓库 git clone https://github.com/prometheus-operator/kube-prometheus.git git checkout release-0.10 进入工作目录 cd kube…

二、[mysql]之Explain讲解与实战

目录 一、了解Explain1.Explain介绍 二、Explain相关字段1.partitions2.filtered3.SHOW WARNINGS命令 三、Explain比较重要字段1.id2.select_type3.table4.type5.possible_keys6.key7.key_len8.ref9.rows10.Extra 四、索引优化实战(遵循原则)1.全值匹配2…

python关闭指定进程以excel为例

先说下环境: Excel版本: Python2.7.13和Python3.10.4并存。 2、打开两个excel工作簿 看进程是这样的: 3、用python编程kill进程 # -*- coding: utf-8 -*- import os proc_nameEXCEL.EXE if __name__ __main__:os.system(taskkill /im {} /…

【vue2第十六章】VueRouter 声明式导航(跳转传参)、路由重定向、页面未找到的提示页面404、vue路由模式设置

声明式导航(跳转传参) 在一些特定的需求中,跳转路径时我们是需要携带参数跳转的,比如有一个搜索框,点击搜索的按钮需要跳转到另外一个页面组件,此时需要把用户输入的input框的值也携带到那页面进行发送请求,请求数据。…

python 随机生成emoji表情

问答板块觉得比较有意思的问题 当时搜了些网上的发现基本都不能用,不知道是版本的问题还是咋的就开始自己研究 python随机生成emoji 问题的产生解决官网文档数据类型实现思路实现前提:具体实现: 其他常见用法插入 Emoji 表情:解析…

【ES6】Class中this指向

先上代码: 正常运行的代码: class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出: 单独调用函数p…

搭建自己的OCR服务,第二步:PaddleOCR环境安装

PaddleOCR环境安装,遇到了很多问题,根据系统不同问题也不同,不要盲目看别人的教程,有的教程也过时了,根据实际情况自己调整。 我这边目前是使用windows 10系统CPU python 3.7 搭建。 熟悉OCR的人应该知道&#xff0…

合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)

标签 (Label) 标签是 LVGL 用来显示文字的控件。 示例代码 label lvgl.label_create(lvgl.scr_act(), nil) lvgl.label_set_recolor(label, true) lvgl.label_set_text(label, "#0000ff Re-color# #ff00ff words# #ff0000 of\n# align the lines …

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

尚硅谷大数据项目《在线教育之离线数仓》笔记008

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 P123 P124 P125 P126 P127 P128 P129 P123 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数…