目標檢測框存在內嵌情況分析與解決

這里寫目錄標題

  • 問題描述
  • 原因分析與解決方法:
  • 后續及思考
  • 參考文檔

問題描述

目標檢測模型輸出的檢測框存在內嵌情況。

在這里插入圖片描述


原因分析與解決方法:

根據經驗,第一感覺是后處理nms部分出了問題。來看下對應的代碼:

static float CalcIou(const vector<float> &box1, const vector<float> &box2)
{float area1 = box1[6];float area2 = box2[6];float xx1 = max(box1[0], box2[0]);float yy1 = max(box1[1], box2[1]);float xx2 = min(box1[2], box2[2]);float yy2 = min(box1[3], box2[3]);float w = max(0.0f, xx2 - xx1 + 1);float h = max(0.0f, yy2 - yy1 + 1);float inter = w * h;float ovr = inter /(area1 + area2 - inter);return ovr;
}static void MulticlassNms(vector<vector<float>>& bboxes, const vector<vector<float>>& vaildBox, float nmsThr)
{for (auto &item : vaildBox) { /* score, xcenter, ycenter, w, h, classId */float boxXCenter = item[XCENTER_IDX];float boxYCenter = item[YCENTER_IDX];float boxWidth = item[W_IDX];float boxHeight = item[H_IDX];float x1 = (boxXCenter - boxWidth / 2);float y1 = (boxYCenter - boxHeight / 2);float x2 = (boxXCenter + boxWidth / 2);float y2 = (boxYCenter + boxHeight / 2);float area = (x2 - x1 + 1) * (y2 - y1 + 1);bool keep = true;/* lx, ly, rx, ry, score, class id, area */vector<float> bbox {x1, y1, x2, y2, item[SCORE_IDX], item[CLSAA_ID_IDX], area};for (size_t j = 0; j < bboxes.size(); j++) {if (CalcIou(bbox, bboxes[j]) > nmsThr) {keep = false;break;}}if (keep) {bboxes.push_back(bbox);}}
}

目前分析最可能的原因是nmsnmsThr設置過大,沒能濾除重疊檢測框,原來nmsThr設置的為0.45,現調整為0.1
檢測框內嵌情況基本消失:
在這里插入圖片描述


后續及思考

先給個結論,綜合的看下各個Loss函數的不同點::
IOU_Loss:主要考慮檢測框和目標框重疊面積
GIOU_Loss:在IOU的基礎上,解決邊界框不重合時的問題。
DIOU_Loss:在IOU和GIOU的基礎上,考慮邊界框中心點距離的信息。
CIOU_Loss:在DIOU的基礎上,考慮邊界框寬高比的尺度信息。
此項目中用的是基本的IOU,在推理性能足夠的情況下,可以考慮使用DIOU,下面也給出使用DIOUnms代碼:

static float CalcDiou(const vector<float>& box1, const vector<float>& box2) {float x1 = min(box1[0], box2[0]);float y1 = min(box1[1], box2[1]);float x2 = max(box1[2], box2[2]);float y2 = max(box1[3], box2[3]);float c_x1 = (box1[0] + box1[2]) / 2.0;float c_y1 = (box1[1] + box1[3]) / 2.0;float c_x2 = (box2[0] + box2[2]) / 2.0;float c_y2 = (box2[1] + box2[3]) / 2.0;float dist_center = sqrt((c_x1 - c_x2) * (c_x1 - c_x2) + (c_y1 - c_y2) * (c_y1 - c_y2));float w = max(0.0f, x2 - x1);float h = max(0.0f, y2 - y1);float intersection = w * h;float area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]);float area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]);float union_area = area1 + area2 - intersection;float diou = intersection / union_area - dist_center * dist_center / (union_area * union_area);return diou;
}static void MulticlassNms(vector<vector<float>>& bboxes, const vector<vector<float>>& vaildBox, float nmsThr)
{for (auto &item : vaildBox) { /* score, xcenter, ycenter, w, h, classId */float boxXCenter = item[XCENTER_IDX];float boxYCenter = item[YCENTER_IDX];float boxWidth = item[W_IDX];float boxHeight = item[H_IDX];float x1 = (boxXCenter - boxWidth / 2);float y1 = (boxYCenter - boxHeight / 2);float x2 = (boxXCenter + boxWidth / 2);float y2 = (boxYCenter + boxHeight / 2);float area = (x2 - x1 + 1) * (y2 - y1 + 1);bool keep = true;vector<float> bbox {x1, y1, x2, y2, item[SCORE_IDX], item[CLSAA_ID_IDX], area};for (size_t j = 0; j < bboxes.size(); j++) {if (CalcDiou(bbox, bboxes[j]) > nmsThr) {keep = false;break;}}if (keep) {bboxes.push_back(bbox);}}
}

有讀者會有疑問,這里為什么不用CIOU_nms,而用DIOU_nms?
答:因為CIOU_loss,是在DIOU_loss的基礎上,添加的影響因子,包含groundtruth標注框的信息,在訓練時用于回歸。
但在測試過程中,并沒有groundtruth的信息,不用考慮影響因子,因此直接用DIOU_nms即可。

參考文檔

https://blog.csdn.net/nan355655600/article/details/106246625

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過對比 入庫申請->入庫審核流程 與 直接入庫 代碼實現,解決前者誤修改stock_info表is_in=1或2數據的bug

入庫申請->入庫審核流程&#xff1a; 提交按鍵定義位置&#xff1a;src\views\purchase\rurchase\RurchaseAdd.vue <a-button click"handleSubmit" type"primary" :loading"loading">確認物品已入庫</a-button> <template&…

二、類與對象(二)

8 this指針 8.1 this指針的引入 我們先來定義一個日期的類Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

Python BDD之Behave測試報告

behave 本身的測試報告 behave 本身提供了四種報告格式&#xff1a; pretty&#xff1a;這是默認的報告格式&#xff0c;提供顏色化的文本輸出&#xff0c;每個測試步驟的結果都會詳細列出。plain&#xff1a;這也是一種文本格式的報告&#xff0c;但沒有顏色&#xff0c;并且…

電動汽車充放電V2G模型MATLAB代碼

微?關注“電氣仔推送”獲得資料&#xff08;專享優惠&#xff09; 主要內容&#xff1a; 本程序主要建立電動汽車充放電V2G模型&#xff0c;采用粒子群算法&#xff0c;在保證電動汽車用戶出行需求的前提下&#xff0c;為了使工作區域電動汽車盡可能多的消納供給商場基礎負荷…

【辦公常識】寫好的代碼如何上傳?使用svn commit

首先找到對應的目錄 找到文件之后點擊SVN Commit

五大資源之Service(可以固定IP)

Service可以看作是一組同類Pod對外訪問接口,借助Service應用可以方便的實現服務發現與負載均衡 創建集群內部可以訪問Service #暴露Service(也創建在了namespace dev下) [root@master ~]# kubectl expose deployment(pod控制器) nginx --name=svc-nginx1 --type=Cluste…

基于原子軌道搜索算法優化概率神經網絡PNN的分類預測 - 附代碼

基于原子軌道搜索算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于原子軌道搜索算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于原子軌道搜索優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xf…

mysql 中 varchar 和 text 的區別

varchar 數據類型 如何理解 varchar(50) varchar(50) 中的 50 在 mysql5.0 及以上默認是存儲的字符數&#xff0c;5.0 以下&#xff0c;默認是字節長度。 varchar 占據的存儲空間 varchar 占據的存儲空間大概有以下幾部分組成&#xff1a; varchar 類型用來存儲【實際字符…

Python入門教學——輸入任意長度的int整型一維數組

使用python輸入一個任意長度的整型一維數組&#xff1a; nums input("請輸入整數數組&#xff0c;用空格分隔&#xff1a; ") nums [int(i) for i in nums.split( )] # 將每個數轉換為整型后輸出 運行結果&#xff1a; 【注】如果不強制轉換類型&#xff0c;數字…

功能測試進階建議,學習思路講解

1. 深入了解測試理論&#xff1a; 了解測試的原理、方法和最佳實踐&#xff0c;包括黑盒測試、白盒測試、灰盒測試等。可以閱讀相關的書籍或參加在線課程。 2. 學習相關測試工具&#xff1a; 掌握常用的測試工具&#xff0c;如缺陷發現工具、性能測試工具、安全測試工具等。可以…

matlab求矩陣的偽逆或者負二分之一次方

如果X不是滿秩矩陣的時候&#xff0c;那么不能使用inv()函數來求X的逆&#xff0c;因為X此時不存在逆&#xff0c;但是我們可以求X的偽逆。 &#xff08;1&#xff09;有以下兩種方法求X的偽逆&#xff1a; 假設 X[1 2 1;1 2 1;2 3 4]; 1, pinvXpinv(X); 2, [U,D,P]svd(X); r…

如何使用YOLOv8代碼框架中的RT-DETR

1. RT-DETR RT-DETR是由由此&#xff0c;百度推出了——RT-DETR (Real-Time DEtection TRansformer) &#xff0c;一種基于 DETR 架構的實時端到端檢測器&#xff0c;其在速度和精度上取得了 SOTA 性能。 RT-DETR開源的代碼在百度自己的飛槳paddlepaddle上&#xff0c;因此非…

基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼

基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于天鷹算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于天鷹優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡的光滑…

新手必看!!附源碼!!STM32通用定時器輸出PWM

一、什么是PWM? PWM&#xff08;脈沖寬度調制&#xff09;是一種用于控制電子設備的技術。它通過調整信號的脈沖寬度來控制電壓的平均值。PWM常用于調節電機速度、控制LED亮度、產生模擬信號等應用。 二、PWM的原理 PWM的基本原理是通過以一定頻率產生的脈沖信號&#xff0…

【5 樹與二叉樹】統計二叉樹結點值和。

typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild; }*BiTree,BiTNode;int sum(BiTree T){if(Tnull)return 0;return T->datasum(T->lchild)sum(T->rchild); }

Android:Google三方庫之Firebase集成詳細步驟(二)

Analytics分析 1、將 Firebase 添加到您的 Android 項目&#xff08;如果尚未添加&#xff09;&#xff0c;并確保在 Firebase 項目中啟用了 Google Analytics&#xff08;分析&#xff09;&#xff1a; 如果您要創建新的 Firebase 項目&#xff0c;請在項目創建過程中啟用 G…

實時錯誤’-2147217887‘多步OLB DB 操作產生錯誤。如果可能,請檢查OLE DB狀態值

目錄 背景問題問題分析問題解決 錯誤解決與定位技巧總結 背景 仍舊是學生信息管理系統的問題&#xff0c;當時做的時候沒發現這么多問題呢&#xff0c;只能說明一件事&#xff0c;做的時候沒有站在用戶的角度考慮需求&#xff0c;設置了什么內容&#xff0c;就按照設置好的去測…

AIGC ChatGPT4總結SQL優化細節操作

數據庫SQL優化是一個復雜的過程,它通常涉及到許多不同的技術和方法。以下是一些常用的SQL優化策略: 1. **索引使用**:索引可以極大地加速查詢速度。但是,索引并不總是有好處的,因為它們需要額外的空間來存儲,并且在插入和更新數據時可能會減慢速度。因此,選擇正確的字段…

Unity中Shader紋理的過濾

文章目錄 前言一、為什么要過濾&#xff1f;二、過濾方式1、Point(no filter) 無過濾2、Bilinear 雙線性過濾3、Trilinear 三線性過濾 前言 Unity中Shader紋理的過濾 一、為什么要過濾&#xff1f; 事實上沒有一個紋理上的紋素是與屏幕上的像素是一一對應的。 屏幕上的 一個…

redis安裝(Windows和linux)

如何實現Redis安裝與使用的詳細教程 Redis 簡介 Redis是一個使用C語言編寫的開源、高性能、非關系型的鍵值對存儲數據庫。它支持多種數據結構&#xff0c;包括字符串、列表、集合、有序集合、哈希表等。Redis的內存操作能力極強&#xff0c;其讀寫性能非常優秀&#xff0c;且…