射頻信號(大寬高比)時頻圖目標檢測anchors配置

一、大寬高比目標YOLO檢測參數設置

這是yolov7的一個label的txt文件:

1 0.500 0.201 1.000 0.091
2 0.500 0.402 1.000 0.150
3 0.500 0.604 1.000 0.093
0 0.500 0.804 1.000 0.217

對應的樣本:

長寬比分別是:1/0.091=10.98,? 1/0.150=6.67,? 1/0.093=10.75,? 1/0.217=4.61

計算anchor的程序:

import utils.autoanchor as autoAC# 對數據集重新計算 anchors
new_anchors = autoAC.kmean_anchors('D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\zzc-multisignals-dataset-yolov7.yaml', 4, 416, 11, 1000, True)
print(new_anchors)

其中,4代表聚類出9種錨框,416代表默認的圖片大小,10表示數據集中標注框寬高比的最大閾值,1000代表kmean聚類算法迭代計算1000次。

一開始報錯了:

C:\Users\14115\.conda\envs\yolov7\python.exe "D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\calculate anchors.py" 
Scanning 'D:\english\yolov7\datasets_higher_cut\train.cache' images and labels... 400 found, 0 missing, 0 empty, 0 corrupted: 100%|██████████| 400/400 [00:00<?, ?it/s]
D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\utils\autoanchor.py:125: RuntimeWarning: divide by zero encountered in dividek, dist = kmeans(wh / s, n, iter=30)  # points, mean distance
Traceback (most recent call last):File "D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\calculate anchors.py", line 4, in <module>new_anchors = autoAC.kmean_anchors('D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\zzc-multisignals-dataset-yolov7.yaml', 4, 416, 11, 1000, True)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "D:\實驗室\論文\論文-多信號參數估計\實驗\YOLOv7\yolov7-main\utils\autoanchor.py", line 125, in kmean_anchorsk, dist = kmeans(wh / s, n, iter=30)  # points, mean distance^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\14115\.conda\envs\yolov7\Lib\site-packages\scipy\_lib\_util.py", line 440, in wrapperreturn fun(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^File "C:\Users\14115\.conda\envs\yolov7\Lib\site-packages\scipy\cluster\vq.py", line 467, in kmeansobs = _asarray(obs, xp=xp, check_finite=check_finite)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\14115\.conda\envs\yolov7\Lib\site-packages\scipy\_lib\_array_api.py", line 193, in _asarray_check_finite(array, xp)File "C:\Users\14115\.conda\envs\yolov7\Lib\site-packages\scipy\_lib\_array_api.py", line 109, in _check_finiteraise ValueError(msg)
ValueError: array must not contain infs or NaNs
autoanchor: Running kmeans for 4 anchors on 1600 points...進程已結束,退出代碼為 1

發現問題出在yolov7-main/utils/autoanchor.py里kmean_anchors中用標準差歸一化上:

s = wh.std(0)  # sigmas for whitening
k, dist = kmeans(wh / s, n, iter=30) 
wh
array([[      322.4,      23.079],[      322.4,      38.049],[      322.4,      23.703],...,[      322.4,      26.198],[      322.4,      34.931],[      322.4,      25.574]])
wh.shape
(1600, 2)
s
array([          0,      8.5888])

可以看到,因為其中一個維度標準差為0,導致按正常歸一化方法就會報錯。那就檢測0元素,賦一個較小值:

s[s == 0] = 1e-8

運行結果:

說明我的多信號時頻圖數據適合用這幾個anchor:

[[ ? ? ?322.6 ? ? ?26.134]
?[ ? ? 323.99 ? ? ?32.985]
?[ ? ? ? ?322 ? ? ?40.793]
?[ ? ? 322.72 ? ? ?47.953]]


或者......如果數據集樣本寬高比差不多的話,自己估摸著樣本的寬高比設計anchor,在默認anchors的基礎上按比例調整

默認anchor:

# anchors
anchors:- [12,16, 19,36, 40,28]  # P3/8- [36,75, 76,55, 72,146]  # P4/16- [142,110, 192,243, 459,401]  # P5/32

我的樣本寬高比達大概在4:1至11:1 ,所以我自己估摸著修改anchor數值:

# anchors
anchors:- [20,10, 20,8, 20,4]  # P3/8 640->80  416->52- [80,40, 80,16, 80,8]  # P4/16 640->40 416->26- [300,100, 300,60, 300,30]  # P5/32 640->20 416->13

這么設置出問題了.....?

設置只在豎直方向進行非極大值抑制。首先定位非極大值抑制函數:

不過這樣找到的函數未必一定運行到這,通過斷點找非極大值抑制函數更準:

?找到了非極大值抑制函數:

def non_max_suppression(prediction, conf_thres=0.25, iou_thres=0.45, classes=None, agnostic=False, multi_label=False,labels=()):"""Runs Non-Maximum Suppression (NMS) on inference resultsReturns:list of detections, on (n,6) tensor per image [xyxy, conf, cls]"""nc = prediction.shape[2] - 5  # number of classesxc = prediction[..., 4] > conf_thres  # candidates# Settingsmin_wh, max_wh = 2, 4096  # (pixels) minimum and maximum box width and heightmax_det = 300  # maximum number of detections per imagemax_nms = 30000  # maximum number of boxes into torchvision.ops.nms()time_limit = 10.0  # seconds to quit afterredundant = True  # require redundant detectionsmulti_label &= nc > 1  # multiple labels per box (adds 0.5ms/img)merge = False  # use merge-NMSt = time.time()output = [torch.zeros((0, 6), device=prediction.device)] * prediction.shape[0]for xi, x in enumerate(prediction):  # image index, image inference# Apply constraints# x[((x[..., 2:4] < min_wh) | (x[..., 2:4] > max_wh)).any(1), 4] = 0  # width-heightx = x[xc[xi]]  # confidence# Cat apriori labels if autolabellingif labels and len(labels[xi]):l = labels[xi]v = torch.zeros((len(l), nc + 5), device=x.device)v[:, :4] = l[:, 1:5]  # boxv[:, 4] = 1.0  # confv[range(len(l)), l[:, 0].long() + 5] = 1.0  # clsx = torch.cat((x, v), 0)# If none remain process next imageif not x.shape[0]:continue# Compute confif nc == 1:x[:, 5:] = x[:, 4:5] # for models with one class, cls_loss is 0 and cls_conf is always 0.5,# so there is no need to multiplicate.else:x[:, 5:] *= x[:, 4:5]  # conf = obj_conf * cls_conf# Box (center x, center y, width, height) to (x1, y1, x2, y2)#這里LFM,SFM的概率就遠高于BPSK,Frank了box = xywh2xyxy(x[:, :4])# Detections matrix nx6 (xyxy, conf, cls)if multi_label:i, j = (x[:, 5:] > conf_thres).nonzero(as_tuple=False).Tx = torch.cat((box[i], x[i, j + 5, None], j[:, None].float()), 1)else:  # best class onlyconf, j = x[:, 5:].max(1, keepdim=True)x = torch.cat((box, conf, j.float()), 1)[conf.view(-1) > conf_thres]# Filter by classif classes is not None:x = x[(x[:, 5:6] == torch.tensor(classes, device=x.device)).any(1)]# Apply finite constraint# if not torch.isfinite(x).all():#     x = x[torch.isfinite(x).all(1)]# Check shape#這里只剩下LFM,SFM類了n = x.shape[0]  # number of boxesif not n:  # no boxescontinueelif n > max_nms:  # excess boxesx = x[x[:, 4].argsort(descending=True)[:max_nms]]  # sort by confidence# Batched NMSc = x[:, 5:6] * (0 if agnostic else max_wh)  # classesboxes, scores = x[:, :4] + c, x[:, 4]  # boxes (offset by class), scoresi = torchvision.ops.nms(boxes, scores, iou_thres)  # NMSif i.shape[0] > max_det:  # limit detectionsi = i[:max_det]if merge and (1 < n < 3E3):  # Merge NMS (boxes merged using weighted mean)# update boxes as boxes(i,4) = weights(i,n) * boxes(n,4)iou = box_iou(boxes[i], boxes) > iou_thres  # iou matrixweights = iou * scores[None]  # box weightsx[i, :4] = torch.mm(weights, x[:, :4]).float() / weights.sum(1, keepdim=True)  # merged boxesif redundant:i = i[iou.sum(1) > 1]  # require redundancyoutput[xi] = x[i]if (time.time() - t) > time_limit:print(f'WARNING: NMS time limit {time_limit}s exceeded')break  # time limit exceededreturn output

?有一段很關鍵的話:

i = torchvision.ops.nms(boxes, scores, iou_thres)  # NMS

如果我們只在豎直方向進行非極大值抑制的話,把boxes中x1,x2分別設置為圖片最左邊和最右邊就好了,這樣計算的IOU是不考慮水平方向的。

注意,下面限制NMS的句子加的位置不對:

 # Batched NMS
c = x[:, 5:6] * (0 if agnostic else max_wh)  # classes
boxes, scores = x[:, :4] + c, x[:, 4]  # boxes (offset by class), scoresboxes[:,0]=0
boxes[:, 2] = 450i = torchvision.ops.nms(boxes, scores, iou_thres)  # NMS box的數值和x是不一致的

必須加在+c前

+c是使得NMS可以考慮不同類別

正常的boxes:

+c以后再限制NMS的boxes:

最終的結果非常完美了:

我的另一篇博客記錄了早期的實驗現象:

YOLOv7訓練時4個類別只出2個類別


二、檢測效果深度優化

2.1 更大比值的anchor

即便用更大的寬高比樣本,回歸效果依然不錯(但是置信度略低了,還得繼續優化anchors):

上面這種框只框主瓣,下面是它的標簽?

1 0.500 0.201 1.000 0.037
2 0.500 0.402 1.000 0.150
3 0.500 0.604 1.000 0.045
0 0.500 0.804 1.000 0.217?

長寬比分別是:1/0.037=27.03,? 1/0.150=6.67,? 1/0.045=22.22,? 1/0.217=4.61?

這樣的話,每個尺度特征圖對應的anchor寬高比最好在27-5

我新設計的anchors:

# anchors
anchors:- [20,4, 20,3, 20,2]  # P3/8 640->80  416->52- [80,16, 80,8, 80,2]  # P4/16 640->40 416->26- [300,60, 300,20, 300,11]  # P5/32 640->20 416->13

效果:?

感覺置信度還是低

2.2 帶更多先驗信息的anchor

anchor加入更多先驗信息,已知款的寬度在416:

anchors:- [20,4, 20,3, 20,2]  # P3/8 640->80  416->52- [80,16, 80,8, 80,2]  # P4/16 640->40 416->26- [410,82, 410,15, 410,5]  # P5/32 640->20 416->13

?效果:?

2.3 限制三種尺度anchor的寬度

試試我的另一種anchor方案:

anchors:- [410,4, 410,3, 410,2]  # P3/8 640->80  416->52- [410,32, 410,16, 410,8]  # P4/16 640->40 416->26- [410,85, 410,60, 410,45]  # P5/32 640->20 416->13

效果:?

感覺....還是老樣子

2.4 限制三種尺度anchor的寬度

試試640*640的基礎上用大比例anchor

parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')

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

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

相關文章

OpenStack 鑒權服務介紹.md

引言 OpenStack是一個開源的云計算管理平臺&#xff0c;其中的Keystone組件承擔了身份認證和授權的關鍵任務。Keystone的主要功能包括管理用戶及其權限、維護OpenStack Services的Endpoint&#xff0c;以及實現認證&#xff08;Authentication&#xff09;和鑒權&#xff08;Au…

Linux_3:進程間通信

IPC1.什么是IPC&#xff1f;Inter Process Communication2.進程間通信常用的幾種方式1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;無名管道2&#xff0c;信號- 系統開銷小3&#xff0c;消息隊列-內核的鏈表4&#xff0c;信號量-計數器5&#xff0c;共享內存6&#x…

【Springboot】Bean解釋

在 Spring Boot 中&#xff0c;Bean 就像是你餐廳里的一名員工。比如&#xff0c;你有一名服務員&#xff08;Service&#xff09;、一名廚師&#xff08;Chef&#xff09;和一名收銀員&#xff08;Cashier&#xff09;。這些員工都是餐廳正常運轉所必需的&#xff0c;他們各自…

axios的post請求,數據為什么要用qs處理?什么時候不用?

為什么使用 qs 處理 POST 數據axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式&#xff08;Content-Type: application/json&#xff09;。但某些后端接口&#xff08;尤其是傳統表單提交&#xff09;要求數據以 application/x-www-form-urlencoded 格式傳輸&…

【unitrix】 4.21 類型級二進制數基本結構體(types.rs)

一、源碼 這段代碼定義了一個類型級數值系統的 Rust 實現&#xff0c;主要用于在編譯時表示和操作各種數值類型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮點值枚舉 ///// 特殊浮點值&#xff08;NaN/∞&#x…

UI前端與數字孿生結合實踐案例:智慧零售的庫存管理優化系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構零售庫存的 “人 - 貨 - 場” 協同在零售行業利潤率持續承壓的背景…

【Freertos實戰】零基礎制作基于stm32的物聯網溫濕度檢測(教程非常簡易)持續更新中.........

本次記錄采用Freertos的第二個DIY作品&#xff0c;基于Onenet的物聯網溫濕度檢測系統&#xff0c;此次代碼依然是全部開源。通過網盤分享的文件&#xff1a;物聯網溫濕度檢測.rar 鏈接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取碼: qm2e 大家也可以看看…

Matplotlib-多圖布局與網格顯示

Matplotlib-多圖布局與網格顯示一、多圖布局的核心組件二、基礎布局&#xff1a;plt.subplots()快速創建網格1. 均等分網格2. 不等分網格&#xff08;指定比例&#xff09;三、進階布局&#xff1a;GridSpec實現復雜嵌套1. 跨行列布局2. 嵌套GridSpec四、實用技巧&#xff1a;布…

GitHub上優秀的開源播放器項目介紹及優劣對比

ExoPlayer 項目地址:https://github.com/google/ExoPlayer 特點: 由Google開發,支持廣泛的視頻格式和流媒體傳輸協議,如DASH、HLS、SmoothStreaming。 提供靈活的媒體源架構和高級特性,如動態自適應流播放。 開發者可以輕松擴展和定制播放器組件,適應特定需求。 優點: 功…

react打包發到線上報錯Minified React error #130

開發過程中遇到一個問題&#xff0c;記錄一下 本地打包發布正常&#xff0c;發測試環境正常&#xff0c;可是通過Jenkins打包發布線上報錯 報錯信息 index-67fbbd81.js:39 Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant130…

微服務項目遠程調用時的負載均衡是如何實現的?

負載均衡概述 負載均衡是微服務架構中的核心組件&#xff0c;用于將請求合理分配到多個服務實例上&#xff0c;提高系統的可用性和性能。負載均衡的分類 負載均衡大致可以分為兩類 1. 服務端負載均衡 實現位置&#xff1a;獨立部署的負載均衡服務器&#xff08;位于客戶端和服務…

【中文核心期刊推薦】中國農業科技導報

《中國農業科技導報》是中國科技核心期刊&#xff0c;也是北京大學圖書館“中文核心期刊要目總覽”收錄的期刊。它是由中國農村技術開發中心主辦&#xff0c;全面為科教興農服務的綜合性農業學術期刊。&#xfeff;《中國農業科技導報》是中國農業科學院生物技術研究所承辦的&a…

php 如何通過mysqli操作數據庫?

在PHP中&#xff0c;mysqli&#xff08;MySQL Improved Extension&#xff09;是操作MySQL數據庫的擴展庫&#xff0c;提供了面向對象和過程式兩種風格。以下是mysqli的基本操作方法&#xff1a; 1. 連接數據庫 面向對象風格 $mysqli new mysqli(localhost, username, passwor…

c/c++拷貝函數

memcpy()函數概要原型void * memcpy ( void * dest, const void * src, size_t num );功能memcpy()會復制 src 所指的內存內容的前 num 個字節到 dest所指的內存地址上&#xff08;memcpy()并不關心被復制的數據類型&#xff0c;只是逐字節地進行復制&#xff0c;這給函數的使用…

HTTP核心基礎詳解(附實戰要點)

目錄 一圖勝千言&#xff1a;HTTP核心機制圖解?編輯 一、HTTP本質&#xff1a;通信的橋梁 二、五大核心特性解析 三、HTTP頭部&#xff1a;隱藏的控制中心 四、連接管理&#xff1a;性能關鍵點 開發者必知實踐技巧 一圖勝千言&#xff1a;HTTP核心機制圖解 一、HTTP本質…

華為靜態路由配置

問題描述&#xff1a;針對兩臺筆記本和兩個路由器在不同的網段場景中&#xff0c;對兩個路由器進行靜態路由配置。下面以如下場景為例&#xff0c;介紹詳細配置過程。配置步驟&#xff1a; 1、對每個路由器的接口下配置IP地址 [huawei]interface gx/x/x [huawei-interface]ip a…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第八課——圖像數據的行緩存

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

經典排序算法

文章目錄前言1. 排序的基本概念1.1 排序是什么&#xff1f;1.2 常見的排序算法概覽2. 常見排序算法的實現2.1 插入排序 (Insertion Sort)2.1.1 基本思想2.1.2 直接插入排序2.1.3 希爾排序 (Shell Sort)2.2 選擇排序 (Selection Sort)2.2.1 直接選擇排序2.2.2 堆排序 (Heap Sort…

RabbitMQ 消息隊列:從入門到Spring Boot實戰

RabbitMQ 作為一款開源的、基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;協議實現的消息代理&#xff0c;憑借其強大的功能、靈活的路由機制以及出色的性能&#xff0c;在業界得到了廣泛的應用。無論是處理高并發訂單、異步通知、日志收集還是系統解耦&…

代賬行業數字化破局:從“知道”到“做到”,三步走穩贏!

認知&#xff01;降本&#xff01;增收&#xff01;數字化&#xff01;——這不僅是口號&#xff0c;更是代賬行業在激烈競爭和時代變化中生存發展的關鍵。很多代賬同行其實都明白趨勢&#xff0c;也知道大概該怎么做。但問題卡在第一步&#xff1a;不知道怎么開始&#xff0c;…