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.pswp.cn/web/80238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80238.shtml
英文地址,請注明出處:http://en.pswp.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;并不能…