目标检测模型——One stage(YOLO v5的模型解析及应用)

1. 简介

目标检测分为Two stage和One stage,只使用一个网络同时产生候选区域并预测出物体的类别和位置,所以它们通常被叫做单阶段检测算法(One stage)。本篇文章只讲One stage模型,常见的模型有YOLO,SSD。

目标检测发展路程(一)——Two stage_樱缘之梦-CSDN博客

2. 原理

(1)YOLO(You Only Look Once)

YOLO模型已经更新了5个版本,分别是YOLO v1,YOLO v2,YOLO v3,YOLO v4,YOLO v5,模型版本的异同可以参考以下文章(已经有很多比较优秀的文章解释):

总结 | 一文读懂 YOLOv1,v2,v3,v4 发展史 - 知乎

Yolov5 系列1--- Yolo发展史以及Yolov5模型详解_g11d111的博客-CSDN博客_yolov5模型

百度PaddleDetection也出了一个PP-YOLO模型(基于YOLO v3的优化模型,在COCO数据集上的mAP和执行速度要比YOLO v4好)。

(2)SSD

SSD(Single Shot MultiBox Detector)于2016年提出,是经典的单阶段目标检测模型之一。具体算法细节可参考:

目标检测|SSD原理与实现 - 知乎

3. 模型解析

下载地址:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLiteYOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.https://github.com/ultralytics/yolov5

该地址中已包含简单调用,可作为简单参考。

3.1. 文件内容解析

从上述地址下载文件,解压之后,获得如下文件:

  • data:数据文件夹

     ————hyps:超参数文件

     ————images:yolo v5测试的两张图片,zidian.jpg,bus.jpg

     ————各项数据集的yaml文件,里边包括存储路径path、train、val、分类数量(number of classes),分类名称、download(下载路径)等信息

  • models:模型文件夹

       ————hyps:模型文件,包含模型的anchors、backbone、head等参数

       ————模型配置:不同的yolo v5模型的配置,精度和效果不一样,有smxln五种。

  • runs:运行结果文件,运行之后会出现

       ————detect:测试模型,输出图片并在图片中标注出物体和概率

       ————train:训练模型,输出内容,模型(最好、最新)权重、混淆矩阵、F1曲线、超参数文件、P曲线、R曲线、PR曲线、结果文件(loss值、P、R)等

  • utils:工具文件夹
  • detect.py:测试文件
  • export.py:
  • hubconf.py
  • requirement.txt:可以通过pip install requirement进行依赖环境下载。
  • train.py:训练文件
  • tutorial.ipynb
  • val.py
  • yolov5s.pt:自行下载的,这个是yolov5轻量级的模型

3.2. 数据集

3.2.1. COCO数据集

COCO的 全称是Common Objects in COntext,是微软团队提供的一个可以用来进行图像识别/图像分割/语义标注的数据集,标注信息包括类别,位置和语义文本。MS COCO数据集中的图像分为训练、验证和测试集。COCO通过在Flickr上搜索80个对象类别和各种场景类型来收集图像,其使用了亚马逊的Mechanical Turk(AMT)。常用的场景有目标实例,目标上的关键点、看图说话,标注内容为json格式。

3.2.2. VOC数据集

PASCAL VOC(Pattern Analysis Statistical modelling,Computational and Learning Visual Object Classes)是一个用于图像分类/识别/分割的数据集。有人类、动物、交通工具,室内四个大类,20个小的目标类别。标注信息以XML格式保存。

3.3. 模型

YOLO v5的模型版本有s、m、l、x、n共5个不同精度的模型,引入了depth_multiple和width_multiple系数来得到不同大小模型,depth_multiple表示channel的缩放系数,就是将配置里面的backbone和head部分有关通道的设置,全部乘以该系数即可。而width_multiple表示BottleneckCSP模块的层缩放系数,将所有的BottleneckCSP模块的number系数乘上该参数就可以最终的层个数。可以发现通过这两个参数就可以实现不同大小不同复杂度的模型设计。比yolov4更加灵活。

4. 应用

4.1. detect(测试)

#不要有中文路径
python detect.py --source ./data/images/bus.jpg --weights yolov5s.pt

可配置参数:

#--weights,模型的权重参数文件
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
#--source 数据资源(图片或视频地址)
parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')
#--imgsz,--img,--img-size 图像尺寸,默认为640
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
#置信度阈值,默认0.25
parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
#iou(交并比)阈值,默认0.45
parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
#一张图片中最大识别种类的个数,默认为1000
parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
#运行设备方式,GPU或者CPU
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
#展示结果图片
parser.add_argument('--view-img', action='store_true', help='show results')
#保存结果文件
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
#保存置信度
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
#保存截取过得预测框
parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
#不保存图片或视频
parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
#指定分类
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
#未知的NMS
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
#增强推断
parser.add_argument('--augment', action='store_true', help='augmented inference')
#可视化特征
parser.add_argument('--visualize', action='store_true', help='visualize features')
#更新所有模型
parser.add_argument('--update', action='store_true', help='update all models')
#保存结果在项目里边
parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')
#保存结果在name里边
parser.add_argument('--name', default='exp', help='save results to project/name')
#项目存在,则不增加
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
#bbox(边界框)的边界的厚度(像素)
parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
#隐藏labels
parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
#隐藏置信度
parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
#使用FP16 half-precision
parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
#使用opencv的DNN
parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')

4.2. train(训练)

#默认coco数据集
python train.py  --weights yolov5s.pt --epochs 5

可配置参数(未展示完全):

#模型的权重参数文件
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
#模型yaml文件路径
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
#数据集的yaml文件
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
#超参数文件
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
#训练批次
parser.add_argument('--epochs', type=int, default=300)
#批次大小
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
#图片文件大小
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')

4.3. 数据标注

常用工具:Labelimg,支持yolo v5的格式,对真实框数据进行归一化处理

 常用工具:Calabeler,支持xml,json,MongoDB格式,数据集在进行yolo v3模型使用时,还需进行边框值归一化处理。

 4.4. 使用自己的数据集进行训练

python train.py --weights yolov5s.pt --data  ./data/dataset.yaml --cfg ./models/yolov5s.yaml  --epochs 50  --batch-size 8 --device 0

(1)数据集文件

如果是本地文件,数据集包含路径,分类数量,分类类别

 (2)权重文件

可以自行下载yolov5s.pt文件,这个是精度为s的yolo v5模型。

5. 总结

想要实现其他模型,步骤和现在类似,但是会出现GPU资源不够用和CPU训练较慢的问题,再者,模型的原理细节也值得反复推敲。

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

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

相关文章

腾讯回应QQ读取用户浏览器历史记录

腾讯QQ官方认证账号在知乎回应“QQ扫描读取所有浏览器的历史记录”表示,PC QQ存在读取浏览器历史用以判断用户登录安全风险的情况,读取的数据用于在PC QQ的本地客户端中判断是否恶意登录。所有相关数据不会上传至云端,不会储存,也…

OCR系列——总体概述

最近参加了百度Paddle的动手学OCR课程,特此做一个学习总结。 1. 简介 OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向,传统的OCR一般面向扫描文档类对象,现在的OCR是指场景文字识…

STM32——系统滴答定时器

STM32——系统滴答定时器 宗旨:技术的学习是有限的,分享的精神是无限的。 一、SysTick【内核中】 【风格:先描述一下库对寄存器的封装,再举例实现某些功能】 SysTick定时器被捆绑在NVIC中,用于产生SysTick异常&#…

你会用while(1)还是for(;;)写循环代码?

看代码看到for(;;)&#xff0c;然后觉得为什么不写成while(1)呢&#xff0c;所以就做了下面的测试。网上有解释&#xff0c;因为while需要做一次判断&#xff0c;理论上执行会花费的时间更久&#xff0c;for(;;)只是执行了两次空语句&#xff0c;执行会更快for.c#include <s…

OCR系列——文本检测任务

1. 简介 文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务&#xff0c;目标检测不仅要解决定位问题&#xff0c;还要解决目标分类问题。 目标检测和文本检测同属于“定位”问题。但是文本检测无需对目标分类&#xff0c;并且文本形状复杂多样。 当前所说的文本…

关于ORACLE 语句中,IN 超过1000个的解决方法

在ORACLE SELECT 语句中 IN 的数据如果超过 1000&#xff0c;就会出错&#xff0c;解决方法也很简单&#xff0c;以C#代码为例&#xff1a; 1、先写一个方法&#xff0c;接收2个参数 参数1&#xff1a;接收 IN里面的数据&#xff0c;如&#xff1a;a1,a2,...a2000 &#xff1b;…

9个提高代码运行效率的小技巧你知道几个?

我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中&#xff0c;我们必须考虑代码使用的方式&#xff0c;以及影响它的关键因素。通常&#xff0c;我们必须在程序的简洁性与它的运行速度之间做出…

STM32——按键

STM32——按键 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、GPIO工作模式 1、当I/O端口配置为输入时&#xff1a; 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉&#xff0c;下拉或浮动)的不同&#xff0c;弱上拉和下拉电阻被连接 …

深度学习——模型的压缩和加速

1. 简介 随着深度学习发展&#xff0c;越来越多的模型被发现和应用&#xff0c;模型的体量也越来越大&#xff0c;出现了模型过于庞大和参数冗余的问题。同时&#xff0c;移动端对模型的需求也是越轻量越好&#xff0c;因此&#xff0c;模型压缩和加速技术应运而生。 模型压缩…

干货,记一次解决录音杂音问题

最近在项目上遇到一个问题&#xff0c;也不能说是最近项目上的问题了&#xff0c;是之前一直存在的问题&#xff0c;但是对项目没什么影响&#xff0c;所以我就不怎么理会&#xff0c;直到最近&#xff0c;同事说这个杂音已经影响到了项目的开发&#xff0c;所以今天花了一天时…

3.5.2 冒泡排序类

那么&#xff0c;我们就以冒泡排序为例&#xff0c;把它改造成一个类。首先&#xff0c;单击菜单&#xff0c;“项目”&#xff0d;“添加类”&#xff0c;添加一个BubbleSort.cs类文件。IDE自动为我们创建如下代码&#xff1a; usingSystem;usingSystem.Collections.Generic;u…

STM32——串口通信

STM32——串口通信 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、异步串口通信协议 STM32 的串口非常强大&#xff0c;它不仅支持最基本的通用串口同步、异步通信&#xff0c;还具有 LIN 总线功能&#xff08;局域互联网&#xff09;、IRDA 功能&…

操作系统——死锁(银行家算法)

1、概述 1.1 死锁 死锁是多个进程因竞争资源而造成的一种僵局&#xff08;互相等待&#xff09;&#xff0c;若无外力作用&#xff0c;这些进程都将无法向前推进。 1.2 死锁产生的原因和条件 原因&#xff1a;&#xff08;1&#xff09;竞争资源&#xff1b;&#xff08;2&…

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收&#xff1b;地址转换内存保护&#xff1a;使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充&#xff1a;交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题&#xff0c;在 a.c 文件里面定义了一个变量&#xff0c;然后在 b.c 里面使用 extern声明引用这个变量&#xff0c;通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题&#xff0c;就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来&#xff0c;它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断&#xff0c;大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放&#xff0c;搞了我一天了&#xff0c;总算有点成果&#xff0c;但还有一些疑问没有解决&#xff0c;现在发这篇随笔&#xff0c;为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor&#xff0c;首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1&#xff1a;某系统的空闲分区见下表&#xff0c;如有下列作业&#xff1a;96KB&#xff0c;20KB&#xff0c;200KB&#xff0c;分别采用首次适应算法和最佳适应算法来处理这些作业序列&#xff0c;哪种算法能满足该作业序列请求&#xff1f; 分区号…