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

news2025/5/19 1:41:53

正常是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:
            return
        TXT_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 losses
    def __init__(self, model, autobalance=False):
        super(ComputeLossOTA, self).__init__()
        device = next(model.parameters()).device  # get model device
        h = model.hyp  # hyperparameters
        self.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)  # targets
   t[range(n), selected_tcls] = self.cp
   lcls += self.BCEcls(ps[:, 5:], t)  # BCE
   self.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.coloradmin.cn/o/2378925.html

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

相关文章

【论文阅读】针对BEV感知的攻击

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章,针对基于BEV的目标检测算法进行了两类可靠性分析,即恶劣自然条件以及敌对攻击。同时也提出了一…

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析

一、引言 在信息爆炸的时代&#xff0c;假新闻的传播对社会产生了诸多负面影响。如何快速、准确地识别假新闻成为了重要的研究课题。本文将对比传统机器学习算法&#xff08;朴素贝叶斯&#xff09;与深度学习模型&#xff08;LSTM&#xff09;在假新闻检测任务中的性能表现&am…

【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组寻找旋转排序数组中的最小值…

副业小程序YUERGS,从开发到变现

文章目录 我为什么写这个小程序网站转小程序有什么坑有什么推广渠道个人开发者如何变现简单介绍YUERGS小程序给独立开发者一点小建议 我为什么写这个小程序 关注我的粉丝应该知道&#xff0c;我在硕士阶段就已经掌握了小程序开发技能&#xff0c;并写了一个名为“约球online”…

基于LLM合成高质量情感数据,提升情感分类能力!!

摘要&#xff1a;大多数用于情感分析的数据集缺乏意见表达的上下文&#xff0c;而上下文对于理解情绪往往至关重要&#xff0c;并且这些数据集主要局限于几种情绪类别。像 GPT-4 这样的基础大型语言模型&#xff08;Foundation Large Language Models&#xff0c;LLMs&#xff…

网络检测工具InternetTest v8.9.1.2504 单文件版,支持一键查询IP/DNS、WIFI密码信息

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/295e068b79314 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDXguH0DYPxrql5y2zlkhTA1?pwdg2nx# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定&#xff1f;一个进程是否可以绑定多个端口号&#xff1f; 4、部分常见指令…

[目标检测] YOLO系列算法讲解

前言 目标检测就是做到给模型输入一张图片或者视频&#xff0c;模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别&#xff0c;而当前最热门的目标检测的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是为了解决当时目标检测的模型帧率太低而提…

.NET NativeAOT 指南

目录 1. 引言 2. 什么是 .NET NativeAOT&#xff1f; 2.1 NativeAOT 的定义 2.2 NativeAOT 与传统 JIT 的对比 2.3 NativeAOT 的适用场景 3. NativeAOT 的核心优势 3.1 性能提升 3.2 简化部署 3.3 更小的应用体积 3.4 知识产权保护 4. NativeAOT 的基本用法 4.1 环境…

uniapp-商城-57-后台 新增商品(弹窗属性数据添加父级)

后台增加商品&#xff0c;需要添加相关的数据信息&#xff0c;这里还要添加属性&#xff0c;前面已经对相关的界面布局继续了编写。这里还要对页面添加的数据&#xff0c;置入到云数据库&#xff0c;继续永久保存&#xff0c;便于后期的使用。这里主要是讲属性数据 父级信息的添…

摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程

摩方12代N200迷你主机标配 Intel AX201无线网卡&#xff0c;支持 WiFi 6 协议&#xff08;802.11ax&#xff09;及蓝牙5.2。此网卡兼容主流抓包工具&#xff0c;但需注意&#xff1a; 驱动兼容性&#xff1a;Ubuntu 20.04及以上内核版本&#xff08;5.4&#xff09;默认支持AX2…

Unity(URP渲染管线)的后处理、动画制作、虚拟相机(Virtual Camera)

一、URP渲染管线 渲染管线是一系列渲染操作的集合&#xff0c;Unity提供了内置渲染管线&#xff08;Built-In&#xff09;和可编程渲染管线&#xff08;SRP&#xff09;两类渲染管线。内置渲染管线是Unity的默认渲染管线&#xff0c;其自定义选项有限。而可编程渲染管线可以通…

mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题

因为你安装的软件在Intel 或arm芯片的mac上没有签名导致。 首先打开任何来源操作 在系统设置中配置&#xff0c;如下图&#xff1a; 2. 然后打开终端&#xff0c;输入&#xff1a; sudo spctl --master-disable然后输入电脑锁屏密码 打开了任何来源&#xff0c;还遇到已损坏…

Echart地图数据源获取

DataV.GeoAtlas地理小工具系列 选择需要的区域地图,选中后输出即可: 地图钻取代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>map</title><style>html, body, #map{margin: 0;…

GNSS数据自动化下载系统的设计与实现

摘要 本文详细介绍了三种不同设计的GNSS数据自动化下载系统&#xff0c;分别针对IGS观测数据、GRACE-FO Level-1B数据以及通过代理服务器获取数据的需求场景。系统采用Python实现&#xff0c;具备断点续传、完整性校验、异常处理和进度显示等核心功能。实验结果表明&#xff0…

Unity3D仿星露谷物语开发43之农作物生长

1、目标 把防风草种子种在地里&#xff0c;并展示植物种子&#xff0c;防风草种子将随着时间变化而生长成植株。 2、创建Crop.cs脚本 在Assets -> Scripts下创建新的目录命名为Crop&#xff0c;在其下创建新的脚本命名为Crop.cs。 代码如下&#xff1a; using System.C…

从0到1上手Kafka:开启分布式消息处理之旅

目录 一、Kafka 是什么 二、Kafka 的基础概念 2.1 核心术语解读 2.2 工作模式剖析 三、Kafka 的应用场景 四、Kafka 与其他消息队列的比较 五、Kafka 的安装与配置 5.1 环境准备 5.2 安装步骤 5.3 常见问题及解决 六、Kafka 的基本操作 6.1 命令行工具使用 6.1.1 …

Python爬虫如何应对网站的反爬加密策略?

在当今的互联网环境中&#xff0c;网络爬虫已经成为数据采集的重要工具之一。然而&#xff0c;随着网站安全意识的不断提高&#xff0c;反爬虫技术也越来越复杂&#xff0c;尤其是数据加密策略的广泛应用&#xff0c;给爬虫开发者带来了巨大的挑战。本文将详细介绍Python爬虫如…

第一次经历项目上线

这几天没写csdn&#xff0c;因为忙着项目上线的问题&#xff0c;我这阶段改了非常多的前端bug哈哈哈哈&#xff0c;说几个比较好的bug思想&#xff01; 这个页面算是我遇到的比较大的bug&#xff0c;因为我一开始的逻辑都写好了&#xff0c;询价就是在点击快递公司弹出弹框的时…