YOLOv7训练时4个类别只出2个类别

正常是4个类别:

但是YOLOv7训练完后预测总是只有两个类别:

而且都是LFM和SFM

我一开始检查了下特征图大小,如果输入是640*640的话,三个尺度特征图是80*80,40*40,20*20;如果输入是416*416的话,三个尺度特征图是52*52,26*26,13*13。我一开始以为是信号太窄了,特征图大小设置有问题,但实际上在YOLOv3,YOLOv10下用的同样大小的特征图,YOLOv3,YOLOv10挺好使的。

后来检查了下anchors,用的是YOLO默认的anchors大小,和YOLOv3下用的一样(YOLOv3好使,别问YOLOv10下多少,YOLOv10是anchor-free的)

anchors =
array([
[ 10., 13.],[ 16., 30.],[ 33., 23.],
[ 30., 61.],[ 62., 45.],[ 59., 119.],
[116., 90.],[156., 198.],[373., 326.]
])

最后发现可能是detect.py下conf-thres参数的问题,这个参数不能太高,一开始我设的0.5,后来调到0.1就好了,设0.5的时候其实还是有极少的BPSK,Frank的类别是预测出来了的

if __name__ == '__main__':parser.add_argument('--conf-thres', type=float, default=0.1, help='object confidence threshold')parser.add_argument('--iou-thres', type=float, default=0.3, help='IOU threshold for NMS')

除了conf-thres,以下内容也是我检查过程中总结出来需要注意的

首先注意类别预测滤波器不要开

if __name__ == '__main__':parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')

NMS操作时可以不使用classes参数 

# Apply NMS
# pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)
pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres,  agnostic=opt.agnostic_nms)

另外一个就是YOLOv7的train.py下有这么两句话

# hyp['cls'] *= nc / 80. * 3. / nl  # scale to classes and layers
# hyp['obj'] *= (imgsz / 640) ** 2 * 3. / nl  # scale to image size and layers
hyp['cls'] *= nc / 4. * 3. / nl  # scale to classes and layers
hyp['obj'] *= (imgsz / 416) ** 2 * 3. / nl  # scale to image size and layers

类别数和图片大小记得改成自己的


某段时间我以为是那两个预测出来的类训练的不好,于是我记录了训练过程的各个类的loss值

具体方法是在:yolov7主路径/utils/loss.py下面写了一个函数

    def save_every_class_loss_txt(self,pred_class, t):# zhouzhichao# 计算每个类别的损失self.class_loss_save_times = self.class_loss_save_times + 1# print("self.class_loss_save_times:",self.class_loss_save_times)if self.class_loss_save_times%50!=0:returnTXT_PATH = "D:\实验室\论文\论文-多信号参数估计\实验\YOLOv7\yolov7-main\\runs\class_loss.txt"class_losses = []for c in range(4):ps_c = pred_class[:, c]  # 提取第c个类别的预测t_c = t[:, c]  # 提取第c个类别的真值loss_c = self.BCEcls(ps_c, t_c)  # 计算单类别损失# class_losses.append(round(loss_c.item(), 3))  # 保留4位小数class_losses.append(f"{loss_c.item():.3f}")  # 使用 f-string 格式化# 转换为制表符分隔的字符串line = "\t".join(class_losses) + "\n"# 追加写入文件with open(TXT_PATH, "a", encoding="utf-8") as f:f.write(line)
class ComputeLossOTA:# Compute lossesdef __init__(self, model, autobalance=False):super(ComputeLossOTA, self).__init__()device = next(model.parameters()).device  # get model deviceh = model.hyp  # hyperparametersself.class_loss_save_times = 0

函数在ComputeLossOTA的__call__下调用:

# Classification
selected_tcls = targets[i][:, 1].long()
if self.nc > 1:  # cls loss (only if multiple classes)t = torch.full_like(ps[:, 5:], self.cn, device=device)  # targetst[range(n), selected_tcls] = self.cplcls += self.BCEcls(ps[:, 5:], t)  # BCEself.save_every_class_loss_txt(ps[:, 5:], t)

原本计算的是全部类别的损失值: 

lcls += self.BCEcls(ps[:, 5:], t)  # BCE

我就拓展了下写出了save_every_class_loss_txt函数用于记录训练过程每个类别的损失值

画图的话就从txt里复制,粘贴到excel或origin都行,如下图

发现所有类别的损失值下降趋势看起来并没什么问题

这也使得我将预测类别缺失的问题限制在预测的阈值和Iou值设置上面了,最终调整阈值解决了问题

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

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

相关文章

【Unity】用事件广播的方式实现游戏暂停,简单且实用!

1.前言 在做Unity项目的时候,要考虑到“游戏暂停”的功能,最直接的办法是修改游戏的Time.TimeScale 0f。但是这种方式的影响也比较大,因为它会导致游戏中很多程序无法正常运行。 于是我就有了一个想法,在游戏中想要暂停的对象&…

Suna: 开源多面手 AI 代理

GitHub:GitHub - kortix-ai/suna: Suna - Open Source Generalist AI Agent 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Suna 是一个完全开源的 AI 助手,可帮助您轻松完成实际任务。通过自然对话&#xff0c…

直接从图片生成 html

1. 起因, 目的: 无意间碰到一个网站: https://wise.com/zh-cn/currency-converter/brl-to-cny-rate其实我就是想搜一下巴西的货币单位是什么。这个网站的设计很漂亮, 尤其是颜色搭配很不错,讨人喜欢。所以我想让 AI 帮我生成类似的效果。本文…

验证码与登录过程逻辑学习总结

目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo,需要自己做一个前端登录页面,不过api接口都是现成的,一开始以为过程会很easy,…

轨道炮--范围得遍历,map巧统计

1.思路很难想,但代码一看一下就明白了,就是模拟时间,map存起来遍历也不受10*6影响 2.每次先统计点对应的直线,再动这个点,map一遍历实时更新ma统计max,AC!!!! https://www.luogu.com.cn/problem/P8695 #i…

Vue 3.5 新特性深度解析:全面升级的开发体验

Vue 3.5 新特性深度解析:全面升级的开发体验 前言 随着Vue 3.5的正式发布,这个渐进式JavaScript框架再次带来了令人兴奋的改进。本文将深入剖析Vue 3.5的核心更新,帮助开发者快速掌握新特性并应用于实际项目。 ✨ 核心新特性 1. 增强的响应…

质量管理工程师面试总结

今天闲着无聊参加了学校招聘会的一家双选会企业,以下是面试的过程。 此次面试采用的是一对多的形式。(此次三个求职者,一个面试官) 面试官:开始你们每个人先做个自我介绍吧。 哈哈哈哈哈哈哈哈,其实我们…

c++ std库中的文件操作学习笔记

1. 概述 C标准库提供了 头文件中的几个类来进行文件操作,这些类封装了底层的文件操作,提供了面向对象和类型安全的接口,使得文件读写更加便捷和高效。主要的文件流类包括: std::ifstream:用于从文件中读取数据。 st…

【网络安全】SQL注入

如果文章不足还请各位师傅批评指正! 想象一下,你经营着一家咖啡店,顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入,向后厨发送指令,比如“为顾客A准备一杯拿铁”。 然而,如果有个不怀好意的顾客…

解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题

问题背景 此前在openEuler24.03 LTS环境下的Hive使用了MySQL8.4.2,在此环境下再安装并启动Maxwell1.29.2时出现如下问题 [ERROR] Maxwell: SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version f…

Oracle APEX IR报表列宽调整

目录 1. 问题:如何调整Oracle APEX IR报表列宽 2. 解决办法 1. 问题:如何调整Oracle APEX IR报表列宽 1-1. 防止因标题长而数据短,导致标题行的文字都立起来了,不好看。 1-2. 防止因数据太长而且中间还没有空格,把列…

pytorch 14.3 Batch Normalization综合调参实践

文章目录 一、Batch Normalization与Batch_size综合调参二、复杂模型上的Batch_normalization表现1、BN对复杂模型(sigmoid)的影响2、模型复杂度对模型效果的影响3、BN对复杂模型(tanh)的影响 三、包含BN层的神经网络的学习率优化…

Model.eval() 与 torch.no_grad() PyTorch 中的区别与应用

Model.eval() 与 torch.no_grad(): PyTorch 中的区别与应用 在 PyTorch 深度学习框架中,model.eval() 和 torch.no_grad() 是两个在模型推理(inference)阶段经常用到的函数,它们各自有着独特的功能和应用场景。本文将详细解析这两…

Swagger go中文版本手册

Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…

物联网设备远程管理:基于代理IP的安全固件更新通道方案

在物联网设备远程管理中,固件更新的安全性直接关系到设备功能稳定性和系统抗攻击能力。结合代理IP技术与安全协议设计,可构建安全、高效的固件更新通道。 一、代理IP在固件更新中的核心作用 网络层隐匿与路由优化 隐藏更新源服务器:通过代理I…

【C++重载操作符与转换】句柄类与继承

目录 一、句柄类的基本概念 1.1 什么是句柄类 1.2 句柄类的设计动机 1.3 句柄类的基本结构 二、句柄类的实现方式 2.1 基于指针的句柄类 2.2 值语义的句柄类 2.3 引用计数的句柄类 三、句柄类与继承的结合应用 3.1 实现多态容器 3.2 实现插件系统 3.3 实现状态模式…

谷歌曾经的开放重定向漏洞(如今已经修复) -- noogle DefCamp 2024

题目描述: 上周,我决定创建自己的搜索引擎。这有点难,所以我背上了另一个。我也在8000端口上尝试了一些东西。 未发现题目任何交互,但是存在一个加密js const _0x43a57f _0x22f9; (function(_0x3d7d57, _0x426e05) {const _0x16c3fa _0x22f9, _0x3187…

【C#】ToArray的使用

在 C# 中&#xff0c;ToArray 方法通常用于将实现了 IEnumerable<T> 接口的集合&#xff08;如 List<T>&#xff09;转换为数组。这个方法是 LINQ 提供的一个扩展方法&#xff0c;位于 System.Linq 命名空间中。因此&#xff0c;在使用 ToArray 方法之前&#xff0…

资产管理平台—chemex

1、简介 Chemex CMDB&#xff08;Configuration Management Database&#xff09;是一个基于现代微服务架构的资产管理与自动化平台&#xff0c;专为 IT 基础设施与业务资产管理而设计。其核心目标是解决大规模系统运维中资产信息混乱、配置分散、数据不一致等问题&#xff0c…

【AI】mcp server是什么玩意儿

文章目录 背景mcp server的必要性mcp server的基本概念mcp server的架构与核心组件总结 背景 劈里啪啦的整了一堆概念&#xff0c;对mcp server还是只停留在知道个词的地步。 虽然目前大模型的对话生成能力很强&#xff0c;但是大模型&#xff08;如deepseek&#xff09;并不能…