【YOLOV5 入门】——构建自己的数据集模型训练模型检验
一、准备工作
1、数据收集
图片类型数据不用多说;视频类型数据利用opencv进行抽帧保存为一张张图片,这里选取30s的名侦探柯南片段进行试验,确保环境解释器下安装了opencv(我使用的是另一个虚拟环境):
import cv2
import matplotlib.pyplot as plt#打开视频文件
video = cv2.VideoCapture("./a.mp4")
#读取一帧(试验)
ret, frame = video.read() #ret返回是否读到内容(true/false),frame保存内容plt.imshow(frame) #cv读取图片不是按照RGB,是BGR
plt.show() #图片颜色奇怪# 将BGR图像转换为RGB图像
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
plt.show() #图片颜色正常

上面是演示抽取一帧,下面每隔30帧抽取一张并保存在文件夹images下:
#打开视频文件
video = cv2.VideoCapture("./a.mp4")
num = 0 #计数器
save_step = 30 #不每一帧都保存,每30帧保存一次
while True:ret,frame = video.read()if not ret:breaknum += 1if num % save_step == 0:cv2.imwrite("./images/" + str(num) + ".jpg" , frame) #目录下新建一个保存图片的文件夹images

2、标注工具labelimg
使用labelimg,直接使用pip安装即可。先终端激活虚拟环境如下显示(ven),再输入下面代码:
pip install labelimg

终端输入labelimg回车即可调出该工具窗口:
“openDir”即可导入图片文件夹开启标注,注意点击“PascalVOC”将其切换为“YOLO”的保存模式,标注好一个点击“Save”即可,也可在“View”中开启自动保存。右键点击图片即可开始标注:

将全部文件标注完成后(保存在labels文件夹中),可发现保存label的文件夹里是与图片名对应的txt文件以及一个classes的txt文件(保存了框的位置信息以及种类标签信息):

后来由于某些原因重新选了一段视频标注,有xiaolan和conan两个标签:

二、模型训练
1、数据调整
原始图片文件夹images和标注信息文件夹labels,分别需要在内部划分为训练集train和验证集val两个文件夹,然后需要把classes.txt文件单独拿出来放在与文件夹images和labels同级的目录:

数据格式对于YOLOv5十分重要!
将上图整理好的数据放在一个datasets的文件夹中放在,上节的yolov5-7.0文件夹下。
2、关键参数
①权重weight:与上期的相似,训练不是从头开始的,而是在官方给的权重文件的基础上进行再训练。
②数据集data:数据集描述文件.yaml,默认是data子目录下的coco128.yaml文件:

打开该文件,下面截图处存储了数据集的路径以及类别标签与数字的映射关系。数据整理好后,改写下面的yaml文件,同时更改上图中train.py文件的data参数,即可开始训练。

这里我们复制一份coco128.yaml副本单独命名为mingke.yaml

里面更改的代码如下,数据集的相对路径和names标签(注意/datasets前的一个.表示当前路径,两个..表示上一级路径):
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ./datasets # dataset root dir #注意:前面..改为一个.,这是不一样的
train: images/train # train images (relative to 'path') 128 images
val: images/val # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: xiaolan1: conan
并把train.py的data中访问的yaml文件更改:

运行train.py出现好多种报错:
报错一:
Traceback (most recent call last):File "C:\Users\LENOVO\miniconda3\envs\yolov5\lib\site-packages\git\__init__.py", line 296, in <module>refresh()File "C:\Users\LENOVO\miniconda3\envs\yolov5\lib\site-packages\git\__init__.py", line 287, in refreshif not Git.refresh(path=path):File "C:\Users\LENOVO\miniconda3\envs\yolov5\lib\site-packages\git\cmd.py", line 631, in refreshraise ImportError(err)
ImportError: Bad git executable.
The git executable must be specified in one of the following ways:- be included in your $PATH- be set via $GIT_PYTHON_GIT_EXECUTABLE- explicitly set via git.refresh(<full-path-to-git-executable>)All git commands will error until this is rectified.This initial message can be silenced or aggravated in the future by setting the
$GIT_PYTHON_REFRESH environment variable. Use one of the following values:- quiet|q|silence|s|silent|none|n|0: for no message or exception- warn|w|warning|log|l|1: for a warning message (logging level CRITICAL, displayed by default)- error|e|exception|raise|r|2: for a raised exceptionExample:export GIT_PYTHON_REFRESH=quietThe above exception was the direct cause of the following exception:Traceback (most recent call last):File "C:/Users/LENOVO/Desktop/yolov5-7.0/train.py", line 66, in <module>GIT_INFO = check_git_info()File "C:\Users\LENOVO\miniconda3\envs\yolov5\lib\contextlib.py", line 75, in innerreturn func(*args, **kwds)File "C:\Users\LENOVO\Desktop\yolov5-7.0\utils\general.py", line 350, in check_git_infoimport gitFile "C:\Users\LENOVO\miniconda3\envs\yolov5\lib\site-packages\git\__init__.py", line 298, in <module>raise ImportError("Failed to initialize: {0}".format(_exc)) from _exc
ImportError: Failed to initialize: Bad git executable.
The git executable must be specified in one of the following ways:- be included in your $PATH- be set via $GIT_PYTHON_GIT_EXECUTABLE- explicitly set via git.refresh(<full-path-to-git-executable>)All git commands will error until this is rectified.This initial message can be silenced or aggravated in the future by setting the
$GIT_PYTHON_REFRESH environment variable. Use one of the following values:- quiet|q|silence|s|silent|none|n|0: for no message or exception- warn|w|warning|log|l|1: for a warning message (logging level CRITICAL, displayed by default)- error|e|exception|raise|r|2: for a raised exceptionExample:export GIT_PYTHON_REFRESH=quiet
解决步骤:按照网上的配置git环境变量没啥用。最后卸载了torch,重新按requirement.txt原文件自动下载合适版本的torch,numpy和pillow也不改了,麻烦了好久。
报错二:
RuntimeError: Inplace update to inference tensor outside InferenceMode is not allowed.
You can make a clone to get a normal tensor before doing inplace update.
亲测有效
http://t.csdnimg.cn/iTu35
其他常见报错:
- Arial.ttf字体无法下载
- 页面文件太小,无法完成操作
- Upsample object has no attribute recompute_scale_factor
B站博主学习视频
https://www.bilibili.com/video/BV1D24y1g7bg/?share_source=copy_web&vd_source=8f7729bb666414c7bb823ad003dc6e38
3、查看训练结果

经过漫长等待,终于训练完成,可见训练迭代了100次,mAP50和mAP50-95指标:
- mAP50代表平均精度指标(mean Average Precision at IoU 0.5),其中IoU是交并比,0.5是评价窗口的大小。具体来说,mAP50是当IoU阈值设为0.5时的平均精确度。
- mAP50-95则是考虑了多个IoU阈值的平均精度。具体来说,mAP50-95是指mAP阈值为50到mAP阈值为95,间隔5%,取得10个mAP值,然后对这十个值取平均。这样可以更全面地评估模型在不同IoU阈值下的性能。
结果保存在runs\train\exp9\weights\best.pt...,exp9文件下权重有两个分别是最好的best.pt和最后一个权重last.pt;events.out.tfevents.1712152459.LAPTOP-D1AF7S5S.15316是训练过程中的日志可用tensorboard查看;其他的jpg也是一些结果图片。

用tensorboard查看日志,按住ctrl鼠标左击链接可跳转网页:



results.png和results.csv结果:


三、模型效果检验
detect.py之前讲到过可以直接检测视频,就用当时被抽帧的视频a.mp4,并指定参数view-img在检测时可视化显示。打开detect.py文件,终端指定参数:
python detect.py --weights runs/train/exp9/weights/best.pt --source datasets/a.mp4 --view-img

yolo视频检测结果(小兰和柯南)
在终端ctr+c即可停止程序。
往期精彩
STM32专栏(付费9.9)
http://t.csdnimg.cn/E2F88
OpenCV-Python专栏(付费9.9)
http://t.csdnimg.cn/zK1jV
AI底层逻辑专栏(付费9.9)
http://t.csdnimg.cn/zic0f
机器学习专栏(免费)
http://t.csdnimg.cn/FaXzAFreeRTOS专栏(免费)
http://t.csdnimg.cn/SjIqU电机控制专栏(免费)
http://t.csdnimg.cn/FNWM7
相关文章:
【YOLOV5 入门】——构建自己的数据集模型训练模型检验
一、准备工作 1、数据收集 图片类型数据不用多说;视频类型数据利用opencv进行抽帧保存为一张张图片,这里选取30s的名侦探柯南片段进行试验,确保环境解释器下安装了opencv(我使用的是另一个虚拟环境): im…...
MacBook 访达使用技巧【mac 入门】
快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它,因为我不常用访达的搜索窗口,更多的是想快速打开访达文件夹窗口,可以通过第三方软件定义访达的快…...
常见溯源,反溯源,判断蜜罐手段
常见溯源,反溯源,判断蜜罐手段 1.溯源手段2.反溯源手段3.如何判断蜜罐🍯4.案例:MySQL读文件蜜罐 1.溯源手段 IP地址追踪:通过IP地址追踪可以确定攻击者的地理位置和ISP信息等;通过攻击IP历史解析记录/域名…...
蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐
蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y,…...
Windows编译运行TensorRT-YOLOv9 (C++)
Windows编译运行yolov9-bytetrack-tensorrt(C) 1 基础环境2 编译yolov9-bytetrack-tensorrt(1)下载yolov9-bytetrack-tensorrt源码(2)修改CMakeLists.txt(3)CMake编译 3 yolov9模型转…...
.NET 设计模式—简单工厂(Simple Factory Pattern)
简介 简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。这种模式隐藏…...
聊聊Linux内核中内存模型
介绍 在Linux中二进制的程序从磁盘加载到内存,运行起来后用户态是使用pid来唯一标识进程,对于内核都是以task_struct表示。二进制程序中的数据段、代码段、堆都能提现在task_struct中。每一个进程都有自己的虚拟地址空间,虚拟地址空间包含几…...
docker自动化部署示例
前提 安装docker 、 docker-cpmpose、git、打包环境(如meaven、jdk、node等) 原理 git Dockerfile docker-compose 获取源码(代码仓库)获取可运行程序的镜像(docker)将打包后的程序放入镜像内…...
Redis精品案例解析:Redis实现持久化主要有两种方式
Redis实现持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。这两种方式各有优缺点,适用于不同的使用场景。 1. RDB持久化 RDB持久化是通过创建一个二进制的dump文件来保存当前Redis数据…...
Python | Leetcode Python题解之第14题最长公共前缀
题目: 题解: class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:def isCommonPrefix(length):str0, count strs[0][:length], len(strs)return all(strs[i][:length] str0 for i in range(1, count))if not strs:return &quo…...
烧坏两块单片机,不知道原因?
没有看你的原理图,以下是造成烧毁芯片的几个环节: 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验,使用STM32控制电机,无论是直流电机脉宽调制,还是步进电机控制,控制电路与…...
SV学习笔记(八)
文章目录 SV入门练习基本数据类型字符串类型数组类型接口的定义与例化类的封装类的继承package的使用随机约束线程的同步线程的控制虚方法方法(任务与函数)SV用于设计 参考资料 SV入门练习 基本数据类型 有符号无符号、四状态双状态、枚举类型、结构体…...
Java反射常用方法
反射 作用: 对于任意一个对象,把对象所有的字段名和值,保存到文件中去利用反射动态的创造对象和运行方法 1. 获取字节码文件对象 方法描述Class.forName(String)通过类的全限定名字符串获取字节码文件对象。类字面量直接使用类的字面量获…...
go语言实现无头单向链表
什么是无头单向链表 无头单向链表是一种线性数据结构,它的每个元素都是一个节点,每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点,链表的第一个节点就是链表的头。 优点: 动态大小&…...
SpringBoot快速入门笔记(5)
文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架,安装 npm i element-ui -S 建议查看官方文档 Element组件,这里是Vue2搭配elementUI,如果是vue3就搭配elementPlus,这里初学就以Vue2为例子…...
solidity(3)
地址类型 pragma solidity ^0.8.0;contract AddressExample {// 地址address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;address payable public _address1 payable(_address); // payable address,可以转账、查余额// 地址类型的成员uint256…...
笔记 | 编译原理L1
重点关注过程式程序设计语言编译程序的构造原理和技术 1 程序设计语言 1.1 依据不同范型 过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-or…...
k8s存储卷 PV与PVC 理论学习
介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API,将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点,我们引入了两个新的 API 资源:PersistentVolume 和 Persistent…...
【WPF应用32】WPF中的DataGrid控件详解与示例
在WPF(Windows Presentation Foundation)开发中,DataGrid控件是一个强大的数据绑定工具,它以表格的形式展示数据,并支持复杂的编辑、排序、过滤和分组等操作。在本文中,我们将详细介绍DataGrid控件的功能、…...
numpy,matplotilib学习(菜鸟教程)
所有内容均来自于: NumPy 教程 | 菜鸟教程 Matplotlib 教程 | 菜鸟教程 numpy模块 numpy.nditer NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 for x in np.nditer(a, orderF):Fortran order,即是列序优先&#x…...
弧形导轨精度等级适配策略
弧形导轨是用于实现曲线运动的线性导向装置,广泛应用于自动化设备、机器人、医疗机械等领域。弧形导轨作为机械传动中的核心部件,其精度等级直接影响设备性能与稳定性。从精密加工到重型机械,不同场景对导轨的制造精度、运行精度及耐磨性要求…...
如何让微信聊天记录永久留存?WeChatMsg为你打造个人数字档案馆
如何让微信聊天记录永久留存?WeChatMsg为你打造个人数字档案馆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...
利用HunyuanVideo-Foley为游戏开发赋能:动态环境音效与技能音效生成实践
利用HunyuanVideo-Foley为游戏开发赋能:动态环境音效与技能音效生成实践 1. 游戏音效开发的痛点与机遇 在游戏开发过程中,音效设计往往是最容易被低估却又至关重要的环节之一。传统音效制作需要大量预录制音频素材,一个中型游戏项目动辄需要…...
告别手动复制!用这个BAT脚本一键导出文件夹所有文件名到Excel
告别手动复制!用这个BAT脚本一键导出文件夹所有文件名到Excel 整理文件清单是许多职场人士的日常痛点。想象一下:你刚接手一个包含数百个设计稿的文件夹,领导要求半小时内提交完整的文件清单;或者你需要将一个项目的所有代码文件整…...
告别旋转锚点!用Oriented R-CNN在DOTA数据集上轻松实现高精度遥感目标检测(附开源代码)
突破传统限制:Oriented R-CNN在遥感目标检测中的实战指南 遥感图像中的目标检测一直是计算机视觉领域的难点之一。不同于常规图像中的物体,遥感目标往往以任意角度出现,传统水平边界框检测方法难以准确捕捉其空间位置。想象一下,…...
如何高效管理游戏资源:GodotPckTool 完全指南与5个实战技巧
如何高效管理游戏资源:GodotPckTool 完全指南与5个实战技巧 【免费下载链接】GodotPckTool Standalone tool for extracting and creating Godot .pck files 项目地址: https://gitcode.com/gh_mirrors/go/GodotPckTool GodotPckTool 是一个独立的命令行工具…...
Transformer位置编码避坑指南:手把手教你用RoPE解决长文本外推难题(附Torch复现)
Transformer长文本处理实战:RoPE位置编码的工程化解决方案 在构建现代NLP系统时,处理长文本序列一直是Transformer架构面临的重大挑战。当序列长度超过模型预训练时的最大位置编码范围时,传统方法的性能会显著下降。这种现象在构建聊天机器人…...
单片机:从核心原理到智能应用实战
1. 单片机:智能时代的微型大脑 想象一下清晨醒来,窗帘自动拉开,咖啡机开始工作,室内温度始终保持在最舒适的状态——这些看似简单的智能场景背后,都藏着一个不起眼却至关重要的核心部件:单片机。这块比硬币…...
告别手动更新!用Python+Pandas快速解析通达信tnf文件,构建本地股票代码库
用PythonPandas高效解析通达信TNF文件:打造自动化股票代码库 每次手动更新股票代码库时,那些重复性操作总让我想起学生时代抄写课文的场景——机械、耗时且容易出错。作为量化研究员,我们真正需要的是把时间花在策略优化上,而不是…...
预制指标、宽表、SQL、本体ABC:真正决定长期成本的,是一次变更会波及多少层
企业做智能问数,最常见的比较题是:预制指标、宽表、人工 SQL、本体ABC,到底哪条路线维护成本更低?如果只给一个笼统答案,往往容易失真。因为真正决定长期成本的,不是“今天开发快不快”,也不是“…...
