YOLOV7 目标检测模型调试记录

news2024/11/27 19:27:05

前言

YOLO系列在目标检测领域可谓名声赫赫,其性能表现不俗,如今其已经更新到了YOLOV7版本,今天便来一睹其风采。
博主之前只是对YOLO算法的原理一知半解,并未实验,因此并不熟练,因此,借此机会来进行实验以为日后的论文撰写做好准备。

看一下YOLOV7X的网络结构:
在这里插入图片描述

源码与环境

首先是去下载源码:

https://gitcode.net/mirrors/bubbliiiing/yolov7-pytorch?utm_source=csdn_github_accelerator

在readme中,有着相关介绍一级一些步骤,下载完成后我们打开项目,博主使用的是pycharm,在requirement.txt中给出了所需环境。

scipy==1.2.1
numpy==1.17.0
matplotlib==3.1.2
opencv_python==4.1.2.30
torch==1.2.0
torchvision==0.4.0
tqdm==4.60.0
Pillow==8.2.0
h5py==2.10.0

当然这个环境也不一定需要完全匹配,能用即可。
打开文件后,我们先train以下试试,出现报错:

FileNotFoundError: [Errno 2] No such file or directory: 'model_data/yolov7_weights.pth'

出现报错,这是yolov7的权重文件缺失,由于权重文件较大,就没有放到项目中去,下载放入指对文件夹model_data即可

链接: https://pan.baidu.com/s/1uYpjWC1uOo3Q-klpUEy9LQ
提取码:pmua

在这里插入图片描述
再次运行:

FileNotFoundError: [Errno 2] No such file or directory: '2007_train.txt'

还是文件丢失问题,没有训练的文件,找到这个读取的文件目录,我们去下载相关文件
在这里插入图片描述
项目使用的是VOC数据集,首先我们去下载相关文件
VOC数据集下载地址如下,里面已经包括了训练集、测试集、验证集(与测试集一样),无需再次划分:

链接: https://pan.baidu.com/s/19Mw2u_df_nBzsC2lg20fQA
提取码: j5ge

下载完成后,我们需要将其放到合适的位置:

训练VOC07+12数据集

VOC是 (Visual Object Classes)的简称,它是一套检测和识别标准化的数据集,可以说是该类数据集的开山之作,目前学术界主流是在COCO(另外一个数据集,后面会介绍)数据集上验证模型,已经很少有在VOC数据集上验证了。可以说VOC已经对state-of-the-art的模型不构成挑战了。但是VOC是不是没有必要学习了呢?其实不然。一方面VOC作为第一代的数据集,数据量不大,所以很快可以下载上手;另外训练自己的检测器或者是分类器的时候,制作VOC格式数据集还是比较方便。
且后续的很多数据集,都是在此基础上的扩展。目前应用最广的是VOC 2007和VOC 2012,即在2007推出的VOC和2012年推出的

数据集的准备

本文使用VOC格式进行训练,训练前需要下载好VOC07+12的数据集,解压后放在根目录
文件分别为:标注文件,文件目录设置,图片
在这里插入图片描述
在这里插入图片描述

数据集的处理

修改voc_annotation.py里面的annotation_mode=2,运行voc_annotation.py生成根目录下的2007_train.txt和2007_val.txt。(这里也就是刚刚我们需要的文件)
运行成功
在这里插入图片描述
生成的tran2017.txt文件内容:
在这里插入图片描述

开始网络训练

train.py的默认参数用于训练VOC数据集,直接运行train.py即可开始训练。
此时再次运行train.py,报错:

内存不足

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\Anaconda\envs\python38\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

这是由于内存不足造成的,修改我们的batch_size即可,或者关闭pycharm,重新运行,发现还是报错,后来看到代码中

    #  num_workers     用于设置是否使用多线程读取数据
    #                   开启后会加快数据读取速度,但是会占用更多内存
    #                   内存较小的电脑可以设置为2或者0  
    #------------------------------------------------------------------#
    num_workers         = 0

我们将其设置为0,原本为4
再次运行:报错

数据存放位置不统一

RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)
Epoch 1/30:   0%|          | 0/4137 [00:30<?, ?it/s<class 'dict'>]

这是由数据使用不统一导致的,网上有解释说需要降低pytorch版本,
版本1.13.0-cuda117,更换为torch==1.10.1+cu113
但博主没有选择这种方式,而是选择修改代码:
找到yolo_training.py文件
添加:

device = targets.device

在这里插入图片描述
修改代码:

from_which_layer.append((torch.ones(size=(len(b),)) * i).to(torch.device(device)))

在这里插入图片描述
添加代码:

fg_mask_inboxes = fg_mask_inboxes.to(torch.device(device))

在这里插入图片描述
再次运行:终于可以运行了
在这里插入图片描述

查看占用

此时我们查看显卡占用情况:cmd -> nvidia-smi
利用率:100%
在这里插入图片描述
显存占用并不大:
在这里插入图片描述
此时我们可以尝试增大以下batch-size,毕竟太慢了,显存占用明显升高了
在这里插入图片描述
当提升到batch-size=16时:报错显存爆了哈哈哈,还是老老实实设置为8吧

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 50.00 MiB (GPU 0; 4.00 GiB total capacity; 3.48 GiB already allocated; 0 bytes free; 3.51 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

运行成功后发现速度特别慢,哎毕竟自己的笔记本年迈无力,把迭代次数设置为1次,先跑出个结果再看看吧。最终,历时两个多小时,总算是跑完了。
在这里插入图片描述

训练结果预测

训练结果预测需要用到两个文件,分别是yolo.py和predict.py。我们首先需要去yolo.py里面修改model_path以及classes_path,这两个参数必须要修改。
model_path指向训练好的权值文件,在logs文件夹里。
classes_path指向检测类别所对应的txt。

  "model_path"        : 'logs/last_epoch_weights.pth',
  "classes_path"      : 'model_data/voc_classes.txt',

在这里插入图片描述

注意事项

文件类别和权重一定要对应好,我们训练时的类别为voc类型,而默认的权重及类别为coco类型,否则会报错:

RuntimeError: Error(s) in loading state_dict for YoloBody:
        size mismatch for yolo_head3.1.weight: copying a param with shape torch.Size([75, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([255, 256, 1, 1]).
        size mismatch for yolo_head3.1.bias: copying a param with shape torch.Size([75]) from checkpoint, the shape in current model is torch.Size([255]).
        size mismatch for yolo_head2.1.weight: copying a param with shape torch.Size([75, 512, 1, 1]) from checkpoint, the shape in current model is torch.Size([255, 512, 1, 1]).
        size mismatch for yolo_head2.1.bias: copying a param with shape torch.Size([75]) from checkpoint, the shape in current model is torch.Size([255]).
        size mismatch for yolo_head1.1.weight: copying a param with shape torch.Size([75, 1024, 1, 1]) from checkpoint, the shape in current model is torch.Size([255, 1024, 1, 1]).
        size mismatch for yolo_head1.1.bias: copying a param with shape torch.Size([75]) from checkpoint, the shape in current model is torch.Size([255]).

当然你也可以之间使用我们之前下载好的权重文件,运行predict.py后输入图片路径即可,这里我们可以改为循环输入多张图片来进行预测。
在这里插入图片描述
这是使用原权重文件的结果:
在这里插入图片描述
完成修改后就可以运行predict.py进行检测了。
然后我们替换自己训练的权重与类别文件后结果如下:可以看出两者差别还是蛮大的,其中一个重要原因当然是博主训练次数太少以致于没有很好的泛化。
在这里插入图片描述
至此我们的训练与预测便调试通过了,接下来我们再看看代码中的其他功能

改进为循环:

在这里插入图片描述

path = 'D:/python2022/data'
path_1 = 'D:/python2022/out'
for filename in os.listdir(path):
    # if filename.endswith('.bmp'):  #代表结尾是bmp格式的
    img_path = path + '/' + filename
    image = Image.open(img_path)
    r_image = yolo.detect_image(image, count=count, crop = crop)
    out_name = filename.split('.')[0]
    save_name = path_1 + '/' + out_name + '.png'
    r_image.save(save_name)

原图片:
在这里插入图片描述
检测后:
在这里插入图片描述
在这里插入图片描述

网络模型结构

项目中提供了summary.py来查看模型结构:
运行summary时发现缺包,下载即可:

pip install thop -i https://pypi.tuna.tsinghua.edu.cn/simple

再次运行,输出其模型结构,这里只展示其数据大小,感兴趣的同学可以自行查看
在这里插入图片描述
可以看到其模型十分复杂。关于YOLOV7的模型与原理解读,博主会再进行介绍。
至此,我们关于YOLOV7模型的调试就先到这里了,之后我们会考虑在此模型上进行改进提升其性能,并将其与目标追踪算法相结合来完成目标检测跟踪实验。

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

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

相关文章

【JavaSE成神之路】一文洞悉Java的方法

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java语言的方法。 目录 1.什么是Java方法 2.快速入门Java方法 3.如何调用Java方法 4.关于Java方法重载这件事 作业 1.什么是Java方法 Jav…

补遗: CS61a

补遗&#xff1a; CS61a 通过“圣经”《SICP》 了解到这门课。SCIP读着有点困难&#xff0c;想通过课程的引导。但是这个课程要比书基础很多&#xff0c;就当对计科学习的回顾和补遗了。本笔记也会在我读完 SICP 后更新。 课程地址&#xff1a;CS 61A Fall 2022 参照原书目录…

第52篇 Qt Quick简介

导语 在上一篇我们已经安装好了Qt 5.5&#xff0c;现在正式开始学习Qt5中全新的Qt Quick编程。Qt Quick对于大部分人来说是一个全新的概念&#xff0c;对这样一个全新的东西要怎样开始学习呢&#xff1f;在没有专业书籍&#xff08;当然&#xff0c;《Qt 5编程入门》现在已经出…

java计算机毕业设计ssm在线学习系统的设计与开发3nnzq(附源码、数据库)

java计算机毕业设计ssm在线学习系统的设计与开发3nnzq&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&a…

MapReduce 工作原理

文章目录MapReduce 工作原理一、MapReduce工作过程二、MapTask工作原理三、Reduce Task工作原理四、Shuffle工作原理五、MapReduce编程组件1、inputFormat组件2、Mapper组件3、Reducer组件4、Partitioner组件5、Combiner组件6、OutputFormat组件六、MapReduce运行模式1、本地运…

关于个人网站的搭建日志(1)静态网页

注&#xff1a;这篇文章不是教程&#xff0c;仅仅是个人踩过的一些坑的整理&#xff0c;建议大家去和前辈们多多交流&#xff0c;祝早日进步 &#xff08;1&#xff09;第一步&#xff0c;关于服务器&#xff1a; 我这里使用的是阿里云的云服务器&#xff08;0元一个月。。。…

视觉合集4

这里总结一些论文,包括多标签分类、姿态估计、目标检测、HOI、小样本学习等研究方向。 01 面向具有标注噪声的人脸表情识别 Attack can Benefit: An Adversarial Approach to Recognizing Facial Expressions under Noisy Annotations 大规模人脸表情数据集通常表现出极端的…

基于VBA实现电缆结构自动出图(一)——自动出圆形

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

类的六个默认成员函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#xff0c;都会自动生成下面6个默认成员函数。 2.构造函数 构造函数是一个特殊的成员函数&#xff0c;名字与…

STM32F4 | 跑马灯实验

文章目录一、 STM32F4 IO 口简介二、硬件设计三、软件设计1.位带操作&#xff08;F7除外&#xff09;四、实验现象五、STM32CubeMX 配置 IO 口输入在本章中&#xff0c;我们将通过代码控制 ALIENTEK 阿波罗 STM32 开发板上的两个 LED 灯 DS0 和 DS1 交替闪烁&#xff0c;实…

【salesforce Admin必备】-想到啥写点啥

【salesforce Admin必备】-想到啥写点啥 文章目录【salesforce Admin必备】-想到啥写点啥前言一&#xff0c;货币相关1.带汇率的多种货币-Activate multiple currencies with exchange rates1.1 启用多币种2.Update the Exchange Rate with ACM2.1启用高级货币管理&#xff08;…

数据结构【树和二叉树的相关知识和题目】

文章目录引言&#xff1a;一、树和二叉树的相关知识&#xff08;一、&#xff09;什么是树1.树&#xff08;1.&#xff09;日常生活中的树&#xff08;2.&#xff09;树的基本概念&#xff08;非线性结构&#xff09;&#xff08;3.&#xff09;代码人眼中的树&#xff1a;&…

ORB-SLAM2 --- Tracking::UpdateLocalKeyFrames函数

目录 1.函数作用 2. 函数步骤 3.code 4.函数解析 4.1 记录共视 4.2 更新局部关键帧&#xff08;mvpLocalKeyFrames&#xff09; 4.3 更新当前帧的参考关键帧&#xff0c;与自己共视程度最高的关键帧作为参考关键帧 1.函数作用 跟踪局部地图函数里&#xff0c;更新局部…

【在SpringBoot项目中删除相册数据--Service层】

由于AlbumMapper.java中已经实现了“根据id删除数据表中的相册数据”&#xff0c;所以&#xff0c;可以直接从Service开始开发此功能。 先在IAlbumService中添加抽象方法&#xff1a; /** * 删除相册 * param id 尝试删除的相册的id */ void delete(Long id); 然后&#xf…

[附源码]Python计算机毕业设计SSM基于web的烟草售卖系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Android Studio Gradle 无限 Build「假死」

Android Studio Gradle 无限 Build「假死」 解决方案 工程配置 Gradle 的 gradle.properties 文件中添加如下代码&#xff1a; org.gradle.daemontrue org.gradle.paralleltrue然后重新 Sync 工程&#xff0c;漫长等待依赖下载完成后&#xff0c;重新 Build 项目即可 补充 …

【Unity 3D 从入门到实战】Unity 3D 组件总结

目录 一&#xff0c;前言 二&#xff0c;常用组件 1&#xff0c;Transform 组件 2&#xff0c;Mesh Filter 组件 3&#xff0c;Box Collider 组件 4&#xff0c;Rigidbody 组件 5&#xff0c;脚本组件 三&#xff0c;总结 一&#xff0c;前言 组件是 Unity 3D 中的重要…

Attention Is All You Need

摘要 The dominant sequence transduction models 显性序列转换模型。complex recurrent 复杂的递归。convolutional neural networks 卷积神经网络。an encoder and a decoder 编码器和解码器。The best performing models性能最佳的模型the encoder →\rightarrow→ an atte…

D. Lucky Chains

传送门 题意&#xff1a;给你两个数x,y让你求满足xk,yk并且GCD(xk,yk)!1的最小值。 思路&#xff1a;要求满足xk,yk并且GCD(xk,yk)!1的最小值&#xff0c;那么就相等于存在(xk)%d(yk)%d 变化一下就等于(x-y)%d0&#xff0c;那么就是找x-y的约数&#xff0c;然后这个约数可能是…

疫情散去想看电影,用css动画模拟一个阿凡达2完美开场

在历经了艰苦卓绝的3年抗疫后&#xff0c;疫情终于还是来了&#xff0c;很多小伙伴变成了小洋人酸奶&#xff0c;我相信过不了多少天&#xff0c;疫情终将散去&#xff0c;那个时候就可以和家人走进电影院啦。 今天用css布局一个阿凡达2的影院场景&#xff0c;提前过一过瘾。 目…