[從0開始軌跡預測][NMS]:NMS的應用(目標檢測、軌跡預測)

非極大值抑制(Non-Maximum Suppression,簡稱NMS)是一種在計算機視覺中廣泛應用的算法,主要用于消除冗余和重疊的邊界框。在目標檢測任務中,尤其是在使用諸如R-CNN系列的算法時,會產生大量的候選區域,而這些區域可能存在大量的重疊。為了解決這個問題,使用NMS算法來保留最有可能的區域,同時抑制其他冗余或重疊的區域。

1. NMS在目標檢測領域的應用

非極大值抑制在目標檢測領域的基本原理和步驟如下:

  1. 對于每個類別,按照預測框的置信度進行排序,將置信度最高的預測框作為基準。
  2. 從剩余的預測框中選擇一個與基準框的重疊面積最大的框,如果其重疊面積大于一定的閾值,則將其刪除。
  3. 對于剩余的預測框,重復步驟2,直到所有的重疊面積都小于閾值,或者沒有被刪除的框剩余為止。

通過這樣的方式,NMS可以過濾掉所有與基準框重疊面積大于閾值的冗余框,從而實現檢測結果的優化。值得注意的是,NMS的閾值通常需要根據具體的數據集和應用場景進行調整,以兼顧準確性和召回率。

# NMS Python 簡單實現
import numpy as npdef nms(dets, thresh):x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]scores = dets[:, 4]areas = (x2 - x1 + 1) * (y2 - y1 + 1)order = scores.argsort()[::-1]keep = []while order.size > 0:i = order[0]keep.append(i)xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas[order[1:]] - inter)inds = np.where(ovr <= thresh)[0]order = order[inds + 1]return keep

這段代碼首先計算所有候選框的面積和分數,然后按照分數對候選框進行排序。然后,它進入一個循環,每次循環中,它都會選擇當前分數最高的框,并將其添加到保留列表中。然后,它會計算這個框與其他所有框的重疊區域,并計算這些重疊區域與各自框的面積之比(即IoU)。如果這個比值大于給定的閾值,那么就會將對應的框從候選列表中刪除。這個過程會一直重復,直到所有的框都被處理完畢。

2. NMS在軌跡預測領域的應用

NMS在軌跡預測中的應用,主要是用來處理預測結果中的冗余和重疊的軌跡,對于一些方法,模型預測出大量的候選軌跡,這些軌跡可能存在大量的重疊。為了解決這個問題,可以使用上述NMS算法來保留最有可能的軌跡,同時抑制其他冗余或重疊的軌跡。

假設對某個場景中的某輛車使用模型預測了64條或更多的軌跡,以很好地捕獲多模態性,同時每條軌跡對應一個置信度,所有軌跡置信度總和為1。但最終輸出時,我們一般僅輸出6條軌跡(下游 or 打榜需求),如果直接選擇置信度最高的6條軌跡會存在問題,比如說這六條軌跡靠的很近,無法體現多模態性。因此,我們需要使用NMS來選擇最終的軌跡:

  1. 將軌跡按照置信度從高到低排序。
  2. 計算每兩條軌跡之間最后一個點的距離,會產生一個距離矩陣。
  3. 依次按照置信度高低選取軌跡,比如第一次選擇排名第一的軌跡,后面再選擇軌跡時需要跟已經選擇的所有判斷距離是否大于某個閾值,如果小于該閾值,說明存在已選的軌跡與當前要被選擇的軌跡很類似,則放棄選擇該軌跡。

這樣,通過NMS,我們可以從大量的預測軌跡中選擇出最具代表性的軌跡,從而提高軌跡預測的效果。

在這里插入圖片描述

從圖中6條軌跡中選擇出3條,如果按照置信度來選,應該選擇0.8,0.5,0.4的軌跡,但由于0.5和0.4兩條軌跡靠的太近(小于某個閾值)因此最終選擇的軌跡為0.8,0.5,0.3三條軌跡。

def batch_nms(pred_trajs, pred_scores, dist_thresh, num_ret_modes=6):"""Args:pred_trajs (batch_size, num_modes, num_timestamps, 7)pred_scores (batch_size, num_modes):dist_thresh (float):num_ret_modes (int, optional): Defaults to 6.Returns:ret_trajs (batch_size, num_ret_modes, num_timestamps, 5)ret_scores (batch_size, num_ret_modes)ret_idxs (batch_size, num_ret_modes)"""batch_size, num_modes, num_timestamps, num_feat_dim = pred_trajs.shapesorted_idxs = pred_scores.argsort(dim=-1, descending=True)bs_idxs_full = torch.arange(batch_size).type_as(sorted_idxs)[:, None].repeat(1, num_modes)sorted_pred_scores = pred_scores[bs_idxs_full, sorted_idxs]  # 對score從大到小排序sorted_pred_trajs = pred_trajs[bs_idxs_full, sorted_idxs]  # (batch_size, num_modes, num_timestamps, 7)sorted_pred_goals = sorted_pred_trajs[:, :, -1, :]  # (batch_size, num_modes, 7)  最后一個點dist = (sorted_pred_goals[:, :, None, 0:2] - sorted_pred_goals[:, None, :, 0:2]).norm(dim=-1)  # 64*64 的距離矩陣point_cover_mask = (dist < dist_thresh)point_val = sorted_pred_scores.clone()  # (batch_size, N)point_val_selected = torch.zeros_like(point_val)  # (batch_size, N)ret_idxs = sorted_idxs.new_zeros(batch_size, num_ret_modes).long()ret_trajs = sorted_pred_trajs.new_zeros(batch_size, num_ret_modes, num_timestamps, num_feat_dim)ret_scores = sorted_pred_trajs.new_zeros(batch_size, num_ret_modes)bs_idxs = torch.arange(batch_size).type_as(ret_idxs)for k in range(num_ret_modes):cur_idx = point_val.argmax(dim=-1) # (batch_size)ret_idxs[:, k] = cur_idxnew_cover_mask = point_cover_mask[bs_idxs, cur_idx]  # (batch_size, N)point_val = point_val * (~new_cover_mask).float()  # (batch_size, N)point_val_selected[bs_idxs, cur_idx] = -1point_val += point_val_selectedret_trajs[:, k] = sorted_pred_trajs[bs_idxs, cur_idx]ret_scores[:, k] = sorted_pred_scores[bs_idxs, cur_idx]bs_idxs = torch.arange(batch_size).type_as(sorted_idxs)[:, None].repeat(1, num_ret_modes)ret_idxs = sorted_idxs[bs_idxs, ret_idxs]return ret_trajs, ret_scores, ret_idxs

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

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

相關文章

中介者模式在金融業務中的應用及其框架實現

引言 中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為設計模式&#xff0c;它通過引入一個中介對象來封裝對象之間的交互&#xff0c;從而使對象不需要顯式地相互引用&#xff0c;從而降低了對象之間的耦合性。在金融業務中&#xff0c;中介者模式常用于實現復…

借教室(題解)

P1083 [NOIP2012 提高組] 借教室 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 思路&#xff1a;二分前綴和 我們將和質檢員那題差不多&#xff0c;只需要將候選人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…

vue 中使用element-ui實現錨點定位表單

效果圖&#xff1a; 代碼&#xff1a; html代碼&#xff1a; <div class"content-left"><el-tabs :tab-position"left" tab-click"goAnchor"><el-tab-pane v-for"(item,index) in anchorNameList"v-anchor-scroll:ke…

【Vue】vue3 hooks 中使用 useRouter 報錯 push undefined 報錯解決方法

報錯原因&#xff1a; 在 Vue 3 中&#xff0c;如果你在自定義 Hooks 中嘗試使用 useRouter 并遇到錯誤&#xff0c;特別是沒有 push 方法的問題&#xff0c;這通常是因為 useRouter 和 useRoute 需要在 Vue 組件的 setup 函數內部使用&#xff0c;而不是在自定義 Hooks 外部直…

【論文閱讀】自動駕駛光流任務 DeFlow: Decoder of Scene Flow Network in Autonomous Driving

再一次輪到講自己的paper&#xff01;耶&#xff0c;宣傳一下自己的工作&#xff0c;順便完成中文博客的解讀 方便大家討論。 Title Picture Reference and pictures paper: https://arxiv.org/abs/2401.16122 code: https://github.com/KTH-RPL/DeFlow b站視頻: https://www.b…

設計?個?性能可?撐分桶多分?的庫存中?,提供單庫存分?不?扣減的合并庫存功能,并提供商 品操作庫存?庫的漸進性?緩存的實現

設計一個高性能的庫存中心&#xff0c;需要考慮多個方面&#xff0c;包括數據結構設計、存儲優化、庫存管理策略、緩存策略以及高并發處理能力。以下是設計這樣一個系統的一些關鍵點&#xff1a; ### 1. 系統架構設計 - **微服務架構**&#xff1a;采用微服務架構&#xff0c;…

基于1bitDAC的MU-MIMO的非線性預編碼算法matlab性能仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 基于1-bit DAC的非線性預編碼背景 4.2 ZF&#xff08;Zero-Forcing&#xff09; 4.3 WF&#xff08;Water-Filling&#xff09; 4.3 MRT&#xff08;Maximum Ratio Transmission&…

uniapp做小程序內打開地圖展示位置信息

使用場景&#xff1a;項目中需要通過位置信息打開地圖查看當前位置信息在地圖那個位置&#xff0c;每個酒店有自己的經緯度和詳細地址&#xff0c;點擊地圖按鈕打開內置地圖如圖 方法如下&#xff1a; <view class"dttu" click"openMap(info.locationY,info.…

快照讀與當前讀 是怎樣的?

在數據庫系統中&#xff0c;快照讀&#xff08;Snapshot Read&#xff09;和當前讀&#xff08;Current Read&#xff09;是兩種不同的數據讀取方式&#xff0c;它們與事務的隔離級別和一致性保證緊密相關。 快照讀&#xff08;Snapshot Read&#xff09; 快照讀是一種讀取操…

Vue使用vue-cropper裁剪圖片作頭像

1.安裝 工程目錄下運行cmd npm install vue-cropper -S2.引用組件 全局引入&#xff0c;在main.js中添加 import VueCropper from vue-cropper Vue.use(VueCropper)3.使用裁剪框 這里httpUrl可以隨意選擇一張網絡圖片的連接作測試 <!-- 圖片裁剪框 --><div style…

(18)GPS/指南針(一)

文章目錄 前言 1 GPS/指南針 2 RTK GPS 3 GPS驅動程序選項 4 GPS自動切換 5 高級用途 前言 Copter/Plane/Rover 支持與 GPS、指南針和其他定位技術的整合&#xff1a; 1 GPS/指南針 Avionics Anonymous GNSS CompassAvionics Anonymous CompassBeitain BN-220 GPS / B…

源碼解讀:如何正確使用并區分@Resource和@Autowired注解?

環境&#xff1a;Spring5.3.23 源碼解讀&#xff1a;如何正確使用Resource和Autowired注解&#xff1f; 1.注解區別 Resource 和 Autowired 都可以用于&#xff0c;依賴注入。但它們之間存在一些明顯的區別。 1.提供方&#xff1a; Autowired 是 Spring 提供的注解。Resour…

[Labview] 改寫表格內容并儲存覆蓋Excel

在上一個功能的基礎上&#xff0c;新增表格改寫保存功能 [Labview] Excel讀表 & 輸出表單中選中的單元格內容https://blog.csdn.net/Katrina419/article/details/140120584 Excel修改前&#xff1a; 修改保存后&#xff0c;動態改寫儲存Excel&#xff0c;并重新寫入新的表…

[21] Opencv_CUDA應用之使用Haar級聯的對象檢測

Opencv_CUDA應用之使用Haar級聯的對象檢測 Haar級聯使用矩形特征來檢測對象,它使用不同大小的矩形來計算不同的線和邊緣特征。矩形包含一些黑色和白色區域,如下圖所示,它們在圖像的不同位置居中 類Haar特征檢測算法的思想是計算矩形內白色像素和黑色像素之間的差異這個方法的…

【HDC.2024】云原生中間件,構筑軟件安全可信的連接橋梁

近日&#xff0c;在華為云開發者大會2024期間&#xff0c;來自華為云PaaS服務&#xff0c;中間件領域產品團隊的資深專家、技術總監、高級產品經理等大咖們發表了以“云原生中間件&#xff0c;構筑軟件安全可信的連接橋梁”為主題的專題演講。 演講伊始&#xff0c;華為云產品…

Python編程使用openai的API訪問oneapi暴露的ollama qwen2大模型

首先安裝conda 安裝Python 3.12 &#xff08;低版本的可能缺少openai庫&#xff09; conda create -n py312 python3.12 conda activate py312 然后 pip install openai 提示&#xff1a; Installing collected packages: openai Successfully installed openai-1.35.…

關于 Mybatis 的開啟二級緩存返回對象不一致問題

做實驗報告的時候&#xff0c;跟著學習&#xff0c;發現我已經將 開啟 二級緩存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;說明對象不一致&#xff0c;二級緩存命中失敗。 跟著流程配置&#xff1a; mybatis-config <settings><!-- 啟用 myba…

你喜歡波段交易嗎?

波段交易的核心在于精準捕捉市場中的長期趨勢波動&#xff0c;以實現更為穩健的收益。與剝頭皮和日內交易不同&#xff0c;波段交易者更傾向于持有交易頭寸數日乃至數周&#xff0c;以更寬廣的視角把握市場動態。 這種交易方式的優勢在于&#xff0c;它降低了對即時市場反應的…

【Gin】項目搭建 一

環境準備 首先確保自己電腦安裝了Golang 開始項目 1、初始化項目 mkdir gin-hello; # 創建文件夾 cd gin-hello; # 需要到剛創建的文件夾里操作 go mod init goserver; # 初始化項目&#xff0c;項目名稱&#xff1a;goserver go get -u github.com/gin-gonic/gin; # 下載…

動態規劃算法,完全零基礎小白教程!不是計算機的都能學會!萬字吐血詳解。

目錄 一、動態規劃算法概念 題一 1、算法解析 1&#xff09;確定狀態&#xff1a; ?2&#xff09;狀態轉移方程&#xff1a; ?3&#xff09;初始化&#xff1a; 4&#xff09;填表順序&#xff1a; 5&#xff09;返回值&#xff1a; 2、代碼 題二 1、算法解析 1、確…