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

跑通并使用Yolo v5的源代码并进行训练—目标检测

跑通并使用Yolo v5的源代码并进行训练

摘要:yolo作为目标检测计算机视觉领域的核心网络模型,虽然到24年已经出到了v10的版本,但也很有必要对之前的核心版本v5版本进行进一步的学习。在学习yolo v5的时候因为缺少论文所以要从源代码入手来体验yolo v5之一经典的网络模型。

Git拉取代码

首先给出github上的官方仓库。我们使用第7版的yolo v5来进行测试和使用。

https://github.com/ultralytics/yolov5

在这里插入图片描述

创建yolo v5的虚拟环境

本次使用Anaconda的图形管理工具来创建yolo v5的虚拟环境,使用的python版本选择python 3.11的版本

官方要求是:python version >= python 3.8

在这里插入图片描述

git clone拉取项目并使用pycharm打开

在指定文件夹下面使用:来拉取项目

git clone https://github.com/ultralytics/yolov5.git
在这里插入图片描述

之后使用pycharm将项目进行导入,并观察项目的结构。当然建议可以直接在pycharm中通过git模块将项目加载进ide中进行学习。

在这里插入图片描述
选择虚拟环境将改项目的虚拟环境选择为刚刚创建的yolo v5的环境信息。在虚拟环境的基础上通过pip安装需要使用的requirements.txt文件夹下面所定义的环境配置。

如果一些环境因为CUDA的版本信息安装不上,则需要在终端自己通过pip命令安装一些高版本的依赖库进行测试使用。

# YOLOv5 requirements
# Usage: pip install -r requirements.txt# Base ------------------------------------------------------------------------
gitpython>=3.1.30
matplotlib>=3.3
numpy>=1.23.5
opencv-python>=4.1.1
pillow>=10.3.0
psutil  # system resources
PyYAML>=5.3.1
requests>=2.32.0
scipy>=1.4.1
thop>=0.1.1  # FLOPs computation
torch>=1.8.0  # see https://pytorch.org/get-started/locally (recommended)
torchvision>=0.9.0
tqdm>=4.64.0
ultralytics>=8.2.34  # https://ultralytics.com
# protobuf<=3.20.1  # https://github.com/ultralytics/yolov5/issues/8012# Logging ---------------------------------------------------------------------
# tensorboard>=2.4.1
# clearml>=1.2.0
# comet# Plotting --------------------------------------------------------------------
pandas>=1.1.4
seaborn>=0.11.0# Export ----------------------------------------------------------------------
# coremltools>=6.0  # CoreML export
# onnx>=1.10.0  # ONNX export
# onnx-simplifier>=0.4.1  # ONNX simplifier
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
# scikit-learn<=1.1.2  # CoreML quantization
# tensorflow>=2.4.0,<=2.13.1  # TF exports (-cpu, -aarch64, -macos)
# tensorflowjs>=3.9.0  # TF.js export
# openvino-dev>=2023.0  # OpenVINO export# Deploy ----------------------------------------------------------------------
setuptools>=65.5.1 # Snyk vulnerability fix
# tritonclient[all]~=2.24.0# Extras ----------------------------------------------------------------------
# ipython  # interactive notebook
# mss  # screenshots
# albumentations>=1.0.3
# pycocotools>=2.0.6  # COCO mAP

在这里插入图片描述

通过pip安装环境

官方的md文件中给出了需要在终端中切换的目录,和安装的命令如下所示:

cd yolov5
pip install -r requirements.txt # install

并给出了预训练好的模型信息。

预训练模型

模型尺寸
(像素)
mAPval
50-95
mAPval
50
推理速度
CPU b1
(ms)
推理速度
V100 b1
(ms)
速度
V100 b32
(ms)
参数量
(M)
FLOPs
@640 (B)
YOLOv5n64028.045.7456.30.61.94.5
YOLOv5s64037.456.8986.40.97.216.5
YOLOv5m64045.464.12248.21.721.249.0
YOLOv5l64049.067.343010.12.746.5109.1
YOLOv5x64050.768.976612.14.886.7205.7
YOLOv5n6128036.054.41538.12.13.24.6
YOLOv5s6128044.863.73858.23.612.616.8
YOLOv5m6128051.369.388711.16.835.750.0
YOLOv5l6128053.771.3178415.810.576.8111.4
YOLOv5x6
+[TTA]
1280
1536
55.0
55.8
72.7
72.7
3136
-
26.2
-
19.4
-
140.7
-
209.8
-

在进行预测和测试时可以选择上面的预训练模型进行下载,下载的位置如图所示,在执行时可以自动下载若下载失败,在自己在指定的位置下载这些模型。

在这里插入图片描述

主要要有c++的环境才能安装成果,可以先看一下自己的windows电脑上是否有c++的环境,linux上还没测试过,可以之后使用colab进行一下测试。

在这里插入图片描述

根据文档提示启动项目测试预训练模型

官方提供了两张用来进行目标检测的图片,执行detect.py文件并修改里面main函数中包括的参数信息,加载预训练模型进行预测。

在这里插入图片描述

if __name__ == "__main__":opt = parse_opt()main(opt)

在parse_opt()函数中修改指定的参数信息。

ef parse_opt():"""Parses command-line arguments for YOLOv5 detection, setting inference options and model configurations."""parser = argparse.ArgumentParser()parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path or triton URL")parser.add_argument("--source", type=str, default=ROOT / "data/images", help="file/dir/URL/glob/screen/0(webcam)")parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="(optional) dataset.yaml path")parser.add_argument("--imgsz", "--img", "--img-size", nargs="+", type=int, default=[640], help="inference size h,w")parser.add_argument("--conf-thres", type=float, default=0.25, help="confidence threshold")parser.add_argument("--iou-thres", type=float, default=0.45, help="NMS IoU threshold")parser.add_argument("--max-det", type=int, default=1000, help="maximum detections per image")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-csv", action="store_true", help="save results in CSV format")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")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")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")parser.add_argument("--line-thickness", default=3, type=int, help="bounding box thickness (pixels)")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")parser.add_argument("--half", action="store_true", help="use FP16 half-precision inference")parser.add_argument("--dnn", action="store_true", help="use OpenCV DNN for ONNX inference")parser.add_argument("--vid-stride", type=int, default=1, help="video frame-rate stride")opt = parser.parse_args()opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expandprint_args(vars(opt))return opt

在简单进行使用的过程中,只说明前两个参数即可满足效果的显示。

  1. parser.add_argument(“–weights”, nargs=“+”, type=str, default=ROOT / “yolov5s.pt”, help=“model path or triton URL”)

加载yolov5s.pt模型作为预训练权重。

  1. parser.add_argument(“–source”, type=str, default=ROOT / “data/images”, help=“file/dir/URL/glob/screen/0(webcam)”)

需要检测的图片存放路径信息。

在配置好后执行该文件产生对应的效果来进行测试。

报错信息解决

在这里插入图片描述
额:不出意外第一次跑代码总会产生一定的错误信息。

AttributeError: partially initialized module ‘charset_normalizer’ has no attribute ‘md__mypyc’ (most likely due to a circular import)

参考解决方式:pip install --force-reinstall charset-normalizer==3.1.0

在这里插入图片描述

之后再一次执行信息,就执行成功开始下载yolov5s.pt的预训练模型信息,进行一个检测检测操作。并将结果保存到指定的位置处。

在这里插入图片描述

在run文件下面生成第一次检测的图片结果信息。

在这里插入图片描述

切换预训练模型在执行一次

例如切换使用YOLOv5m 模型进行一次测试过程,观察该模型与之前的模型在生成的效果上有何不同之处。

我们这次使用命令行的方式来进行执行观察效果

修改对应的预训练参数yolov5m.pt

 parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5m.pt", help="model path or triton URL")

在这里插入图片描述
明显可以发现该模型的大小明显更大下载的速度也更快。

模型下载的位置就保持在根目录处,可以通过程序直接进行加载。

在这里插入图片描述

执行成功之后发现在bounding box对应的置信度上的数值存在明显的不同之处。同时会保存在不同的文件中。

在这里插入图片描述

街道视频的目标检测

在官方文档和代码注释出提到了可以使用.mp4文件并将视频转化为帧进行检测。

$ python detect.py --weights yolov5s.pt --source 0 # webcam
img.jpg # image
vid.mp4 # video
screen # screenshot
path/ # directory
list.txt # list of images
list.streams # list of streams
‘path/*.jpg’ # glob
‘https://youtu.be/LNwODJXcvt4’ # YouTube
‘rtsp://example.com/media.mp4’ # RTSP, RTMP, HTTP stream

其中 parser.add_argument(“–view-img”, action=“store_true”, help=“show results”)

–view-img参数可以显示检测的效果,在执行视频文件的同时我们使用到这个参数就可以动态观察视频的检测效果了。

  1. 下载一个街道视频作为待检测的素材。

在这里插入图片描述

  1. 修改第二个参数信息在程序中读入视频并进行检测。
parser.add_argument("--source", type=str, default=ROOT / "data/video/street.mp4", help="file/dir/URL/glob/screen/0(webcam)")
  1. 设置–view-img参数观看检测视频的实时效果。(python detect.py --view-img)

在这里插入图片描述
选择的是一个较小的视频共可以分为211帧来检测实时的检测。

street

使用coco数据集结合GPU训练自己的模型

我们结合迁移学习和代码中使用到的微调等相关技术。对自己的模型进行训练,项目中包括了一些yaml配置文件。

方便快速的训练,我选择使用其中的coco128这个数据集。共80个类别信息
在训练的过程中同样需要先下载coco128数据集对应的128张图片,然后在进行模型的训练。

初学者水平有限调参默认忽略。其中yaml文件中给出了下载地址:
download: https://ultralytics.com/assets/coco128.zip

修改参数信息,之后进行训练,训练完成后得到自己的GPU训练之后的模型信息。

add_argument("--weights", type=str, default=ROOT / "yolov5m.pt", help="initial weights path")parser.add_argument("--cfg", type=str, default="", help="model.yaml path")parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path")
  1. 下载数据集读入参数信息
    在这里插入图片描述

  2. 结合训练集和验证集进行模型的训练。

在这里插入图片描述

在这里插入图片描述
下载的是cpu版本的pytorch训练较慢,重新用pip下载GPU版本的pytorch重新来进行训练

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

建议还是用conda装

换源下载加快速度下载GPU版本的torch
在这里插入图片描述
下载完成后GPU可以则重新进行训练。(GPU安装成功后重新训练)

在这里插入图片描述
注意的是conda虚拟环境的pytorch cuda版本一定用conda安装

在这里插入图片描述
成功用gpu进行训练了当100个批次都跑完后即可看生成的训练的目录结构

将最后的结果保存在第三次训练的地方。
在这里插入图片描述

使用自己训练的模型来进行视频的检测

在检测文件处修改指定的模型加载位置:我们自己训练的第三个模型的位置。runs/train/exp3/weights/best.pt

--weights", nargs="+", type=str, default=ROOT / "runs/train/exp3/weights/best.pt", help="model path or triton URL")

效果基本上和预训练模型的效果近似相同。

在这里插入图片描述

相关文章:

跑通并使用Yolo v5的源代码并进行训练—目标检测

跑通并使用Yolo v5的源代码并进行训练 摘要&#xff1a;yolo作为目标检测计算机视觉领域的核心网络模型&#xff0c;虽然到24年已经出到了v10的版本&#xff0c;但也很有必要对之前的核心版本v5版本进行进一步的学习。在学习yolo v5的时候因为缺少论文所以要从源代码入手来体验…...

需求虽小但是问题很多,浅谈JavaScript导出excel文件

最近我在进行一些前端小开发&#xff0c;遇到了一个小需求&#xff1a;我想要将数据导出到 Excel 文件&#xff0c;并希望能够封装成一个函数来实现。这个函数需要接收一个二维数组作为参数&#xff0c;数组的第一行是表头。在导出的过程中&#xff0c;要能够确保避免出现中文乱…...

phar反序列化及绕过

目录 一、什么是phar phar://伪协议格式&#xff1a; 二、phar结构 1.stub phar&#xff1a;文件标识。 格式为 xxx; *2、manifest&#xff1a;压缩文件属性等信息&#xff0c;以序列化存 3、contents&#xff1a;压缩文件的内容。 4、signature&#xff1a;签名&#…...

汽车IVI中控开发入门及进阶(三十):视频图像滚动问题分析(imx6+TVP5150+Camera)

前言: DA主控SOC采用imx6,TVP5150作为camera摄像头视频的解码decode芯片,imx6采用linux系统。 关于imx6,请参阅:汽车IVI中控开发入门及进阶(二十九):i.MX6-CSDN博客 Contributor III:...

给PDF添加书签的通解-姜萍同款《偏微分方程》改造手记

背景 网上找了一本姜萍同款的《偏微分方程》&#xff0c;埃文斯&#xff0c;英文版&#xff0c;可惜没有书签&#xff0c;洋洋七百多页&#xff0c;没有书签&#xff0c;怎么读&#xff1f;用福昕编辑器自然能手工一个个加上&#xff0c;可是劳神费力&#xff0c;非程序员所为…...

在寻找电子名片在线制作免费生成?5个软件帮助你快速制作电子名片

在寻找电子名片在线制作免费生成&#xff1f;5个软件帮助你快速制作电子名片 当你需要快速制作电子名片时&#xff0c;有几款免费在线工具可以帮助你实现这个目标。这些工具提供了丰富的设计模板和元素&#xff0c;让你可以轻松地创建个性化、专业水平的电子名片。 1.一键logo…...

Github 2024-06-16 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Livewire: Laravel中构建动态UI组件的全栈框架 创建周期:1818 天开发语言:PHP协议类型:MIT LicenseStar数量:21388 个Fork数量:1…...

docker将容器打包提交为镜像,再打包成tar包

将容器打包成镜像可以通过以下步骤来实现。这里以 Docker 为例&#xff0c;假设你已经安装了 Docker 并且有一个正在运行的容器。 1. 找到正在运行的容器 首先&#xff0c;你需要找到你想要打包成镜像的容器的 ID 或者名字。可以使用以下命令查看所有正在运行的容器&#xff…...

洛阳水利乙级资质企业在水利科技创新中的作用

洛阳水利乙级资质企业在水利科技创新中扮演着重要的角色&#xff0c;其贡献主要体现在以下几个方面&#xff1a; 一、技术引进与研发 引进先进技术&#xff1a;洛阳水利乙级资质企业积极引进国内外先进的水利工程技术和管理经验&#xff0c;结合本地实际情况&#xff0c;形成独…...

Redis-事务-基本操作-在执行阶段出错不会回滚

文章目录 1、Redis事务控制命令2、Redis事务错误处理3、Redis事务错误处理&#xff0c;在执行阶段出错不会回滚 1、Redis事务控制命令 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set a1 v1 QUEUED 127.0.0.1:6379(TX)>…...

aws的alb,多个域名绑定多个网站实践

例如首次创建的alb负载均衡只有www.xxx.com 需要添加 负载 test2.xxx.com aws的Route 53产品解析到负载均衡 www.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx test2.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx 主要介绍目标组和规则 创建alb就不介…...

WPF/C#:数据绑定到方法

在WPF Samples中有一个关于数据绑定到方法的Demo&#xff0c;该Demo结构如下&#xff1a; 运行效果如下所示&#xff1a; 来看看是如何实现的。 先来看下MainWindow.xaml中的内容&#xff1a; <Window.Resources><ObjectDataProvider ObjectType"{x:Type local…...

GBDT算法详解

GBDT算法详解 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff0c;GBDT&#xff09;是机器学习中一种强大的集成算法。它通过构建一系列的决策树&#xff0c;并逐步优化模型的预测能力&#xff0c;在各种回归和分类任务中取得了显著的效果。本文将详细介…...

51单片机宏定义的例子

代码 demo.c #include "hardware.h"void delay() {volatile unsigned int n;for(n 0; n < 50000; n); }int main(void) {IO_init();while(1){PINSET(LED);delay();PINCLR(LED);delay();}return 0; }cfg.h #ifndef _CFG_H_ #define _CFG_H_// #define F_CPU …...

香港云服务器怎么处理高并发和突发流量?

处理香港云服务器的高并发和突发流量需要综合考虑多种因素&#xff0c;包括服务器配置优化、负载均衡、缓存策略、CDN加速以及监控和自动化调整等措施。以下是处理高并发和突发流量的一些关键步骤和建议&#xff1a; 1. 优化服务器配置 选择高性能实例&#xff1a;根据预期的并…...

c,c++,qt从入门到地狱

前言 1 你所能用的正与你手写的效率相同2 你不需要为你没有用到的特性付出 (无脑的调用函数or公式的空壳人类请出门右转)c 001 scanf and strcpy "_s"bug? 微软官方说明1 Visual Studio 库中的许多函数、成员函数、函数模板和全局变量已弃用,改用微软新增的强化函数…...

iptables(6)扩展匹配条件--tcp-flags、icmp

简介 前面我们已经介绍了不少的扩展模块,例如multiport、iprange、string、time、connlimit模块,但是在tcp扩展模块中只介绍了tcp扩展模块中的”--sport”与--dport”选项,并没有介绍”--tcp-flags”选项,那么这篇文章,我们就来认识一下tcp扩展模块中的”--tcp-flags”和i…...

C#-Json文件的读写

文章速览 命名空间读取Json核心代码示例 写入Json核心代码示例 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 命名空间 using Newtonsoft.Json;读取Json 核心代码 //核心代码using (StreamReader…...

【2023级研究生《人工智能》课程考试说明】

一&#xff0e;试题范围 考试题共包括4道大题&#xff1a; 第一大题&#xff1a;分类和回归----&#xff08;8选1&#xff09; 第二大题&#xff1a;降维和聚类----&#xff08;7选1&#xff09; 第三大题&#xff1a;API调用&#xff08;课程中学习过的所有云平台&#xff09…...

C语言队列操作及其安全问题

在C语言中&#xff0c;队列是一种常用的数据结构&#xff0c;特别适用于嵌入式开发中的任务调度、缓冲区管理等场景。下面是一个简单的循环队列的模板代码&#xff0c;它使用数组来实现队列&#xff0c;并提供了基本的入队&#xff08;enqueue&#xff09;和出队&#xff08;de…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...