【深度學習】——非極大值抑制(nms/soft-nms)

目錄

一、相關概念

1、iou

1)理論計算

2)Python代碼(代碼參考yolov3模型util.py文件)

2、nms

1)基本思路

2)標準nms和soft-nms

3)Python代碼實現(yolov3中util.py文件,增加了注釋)

4)標準nms的缺點


一、相關概念

1、iou

1)理論計算

參考:https://blog.csdn.net/zouxiaolv/article/details/107400193

????????????????????????

物體檢測需要定位出物體的bounding box,就像上面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 里面的物體就是車輛。

對于bounding box的定位精度,有一個很重要的概念,那就是定位精度評價公式:IOU。

IOU表示了bounding box 與 ground truth 的重疊度,如下圖所示:

這里寫圖片描述

矩形框A、B的一個重合度IOU計算公式為:

???????????????????????????????????????????????????????????????? IOU=Area(A∩B)/Area(A∪B)

就是矩形框A、B的重疊面積占A、B并集的面積比例:

???????????????????????????????????????????????????????????????? IOU=SI/(SA+SB-SI)

如何計算IOU(交并比)

?????????????????????????????? ?

首先求出重合面積:

???? 選取兩個矩形框左頂角的橫,縱坐標的最大值,x21,y21;選取兩個矩形框右下邊角的橫縱坐標的最小值,x12,y12;

重合面積計算:

???????????????????????????? inter=??? | x12-x21 *| y12-y21 |

并集的面積計算:

?????????????????????????????? b = | x12-x21? |*| y12-y21 |+ | x21-x22 || y21-y22? | - inter

計算IOU:

?????????????????????????????????? IOU=inter/b

2)Python代碼(代碼參考yolov3模型util.py文件)

def bboxes_iou(boxes1, boxes2):'''兩個都是數組,注意兩個box的維度必須一致,一般是二維box:[[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]'''boxes1 = np.array(boxes1)# (1,4)boxes2 = np.array(boxes2) # (n,4)# 計算兩個box的面積boxes1_area = (boxes1[..., 2] - boxes1[..., 0]) * (boxes1[..., 3] - boxes1[..., 1]) # (1,1)boxes2_area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1]) # (n,1)left_up       = np.maximum(boxes1[..., :2], boxes2[..., :2])right_down    = np.minimum(boxes1[..., 2:], boxes2[..., 2:])inter_section = np.maximum(right_down - left_up, 0.0)inter_area    = inter_section[..., 0] * inter_section[..., 1] # 重疊區域union_area    = boxes1_area + boxes2_area - inter_area # 全部面積ious          = np.maximum(1.0 * inter_area / union_area, np.finfo(np.float32).eps) # iousreturn ious

2、nms

非極大值抑制(Non-Maximum Suppression,NMS),顧名思義就是抑制不是極大值的元素,用于目標檢測中,就是提取置信度高的目標檢測框,而抑制置信度低的誤檢框。一般來說,用在當解析模型輸出到目標框時,目標框會非常多,具體數量由anchor數量決定,其中有很多重復的框定位到同一個目標,nms用來去除這些重復的框,獲得真正的目標框。如下圖所示,人、馬、車上有很多框,通過nms,得到唯一的檢測框。

1)基本思路

所謂非極大值抑制:先假設有6個矩形框,根據分類器類別分類概率做排序,從小到大分別屬于車輛的概率分別為A<B<C<D<E<F。

(1) 從最大概率矩形框F開始,分別判斷A、B、C、D、E與F的重疊度IOU是否大于某個設定的閾值;

(2) 假設B、D與F的重疊度超過閾值,那么就扔掉B、D;并標記第一個矩形框F,是我們保留下來的。

(3) 從剩下的矩形框A、C、E中,選擇概率最大的E,然后判斷A、C與E的重疊度,重疊度大于一定的閾值,那么就扔掉;并標記E是我們保留下來的第二個矩形框。

(4) 重復這個過程,找到所有被保留下來的矩形框。

2)標準nms和soft-nms

參考:https://zhuanlan.zhihu.com/p/89426063

bi為待處理BBox框,B為待處理BBox框集合,sibi框更新得分,Nt是NMS的閾值,D集合用來放最終的BBox,f是置信度得分的重置函數。 bi和M的IOU越大,bi的得分si就下降的越厲害。

經典的NMS算法將IOU大于閾值的窗口的得分全部置為0,可表述如下:

這種是加權線性的

具體其他的可以參考:https://zhuanlan.zhihu.com/p/89426063

3)Python代碼實現(yolov3中util.py文件,增加了注釋)

def nms(bboxes, iou_threshold, sigma=0.3, method='nms'):""":param bboxes: (xmin, ymin, xmax, ymax, score, class),是一個數組,關于(n,6),n是檢測出的box個數Note: soft-nms, https://arxiv.org/pdf/1704.04503.pdfhttps://github.com/bharatsingh430/soft-nms"""classes_in_img = list(set(bboxes[:, 5])) # 得到不同類別標簽的列表,如[0,1,2],標簽號best_bboxes = [] # 存放最好的boxfor cls in classes_in_img: # 遍歷類別號列表cls_mask = (bboxes[:, 5] == cls) # 這里返回的是一個True or False的掩模列表,True則表示bboxes中對應索引號的box是屬于這個類cls_bboxes = bboxes[cls_mask] # 根據掩模獲得屬于那一類的box,依舊是二維數組while len(cls_bboxes) > 0: # 這里一直在循環,直到box列表為空max_ind = np.argmax(cls_bboxes[:, 4]) # 獲得這類得分最高的box索引best_bbox = cls_bboxes[max_ind] # 將分數最高的box作為最佳boxbest_bboxes.append(best_bbox) # 添加# 從box列表中去除最佳boxcls_bboxes = np.concatenate([cls_bboxes[: max_ind], cls_bboxes[max_ind + 1:]])# 計算得到兩個box之間的iou(重疊部分除以一起共同的面積),下面這里其實進行了批量操作,將最佳box和剩下的box進行了計算# np.newaxies,表示增加一個維度iou = bboxes_iou(best_bbox[np.newaxis, :4], cls_bboxes[:, :4])weight = np.ones((len(iou),), dtype=np.float32)  # 置信度,當iou大于0.7,說明重疊的部分很大,可以視為一個框,故丟棄assert method in ['nms', 'soft-nms']if method == 'nms': # 標準nmsiou_mask = (iou > iou_threshold) # 得到一個掩模,iou大于設定閾值的設置為TRUEweight[iou_mask] = 0.0 #大于閾值的box的置信度置為0if method == 'soft-nms': # soft-nms,不直接丟棄大于閾值的boxweight = np.exp(-(1.0 * iou ** 2 / sigma)) # sigma為懲罰因子,這個越小,置信度越小,越容易被拋棄cls_bboxes[:, 4] = cls_bboxes[:, 4] * weight # 這里是將剩下的box的得分乘以了iou置信度,與bestbox重疊的丟棄了score_mask = cls_bboxes[:, 4] > 0. # 取大于0的也就是丟棄了重疊的,這也是掩模cls_bboxes = cls_bboxes[score_mask] # 根據掩模跟新剩下的box,進行下一輪的nmsreturn best_bboxes

4)標準nms的缺點

1、NMS算法中的最大問題就是它將相鄰檢測框的分數均強制歸零(即將重疊部分大于重疊閾值Nt的檢測框移除)。在這種情況下,如果一個真實物體在重疊區域出現,則將導致對該物體的檢測失敗并降低了算法的平均檢測率。

2、NMS的閾值也不太容易確定,設置過小會出現誤刪,設置過高又容易增大誤檢。

3、NMS一般只能使用CPU計算,無法使用GPU計算。

?

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

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

相關文章

移動服務安全現狀分析!

2019獨角獸企業重金招聘Python工程師標準>>> 由于Android開源的環境&#xff0c;導致Android的整體環境都存在很多不安全的因素&#xff0c;同時用戶在移動APP客戶端的便捷應用&#xff0c;也給用戶帶來了巨大的安全隱患。未經過移動服務安全加固的APP存在被靜態反編…

封裝不同類模板的隨機數生成器

最近準備刷題&#xff0c;打算簡單封裝下隨機數生成器&#xff0c;方便產生測試數據。C11的STL提供了很多分布類型&#xff0c;我比較常用的是均勻分布&#xff0c;均勻分布的值有兩種類型&#xff0c;一類是整數&#xff0c;另一類是浮點數&#xff0c;STL根據值的類型定義了兩…

Log4j詳細設置說明

1. 動態的改變記錄級別和策略&#xff0c;即修改log4j.properties,不需要重啟Web應用&#xff0c;這需要在web.xml中設置一下。2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ &#xff0c;而不是Class-Pat…

【機器學習】——卷積神經網絡(Keras)修改學習率(定值+自適應)

目錄 1、直接獲取現有模型的學習率 2、打印顯示學習率 3、調整學習率 1&#xff09;1.LearningRateScheduler 2&#xff09;ReduceLROnPlateau 利用tensorflow的Keras模塊我們可以建立我們自己定義的卷積神經網絡模型&#xff0c;但是一般不會觸碰到學習率這個問題&#x…

使用Docker構建你的第一個服務

1. 感受一下Docker的便捷 項目源碼 https://github.com/MoonShining/dockernize-grape-helloworld clone下來以后運行,cd到項目目錄下&#xff0c;運行 docker build -t api-sample . docker run -p 8080:8080 api-sample:latest 復制代碼就可以訪問localhost:8080看到效果了. …

MyEclipse連接MySQL

在官網http://www.mysql.com/downloads/下載數據庫連接驅動 本文中使用驅動版本為mysql-connector-java-5.1.40 一、創建一個java測試項目MySQLConnectorsTest 在項目下穿件一個lib文件夾用來存放MySQL驅動包。 右鍵驅動包build path進行add添加操作&#xff0c;打開Referenced…

在Windows系統中配置Google AddressSanitizer

Google AddressSanitizer簡介 AddressSanitizer (ASan) 是 C 和 C 的內存錯誤檢測軟件&#xff0c;它可以檢測&#xff1a; 釋放指針后繼續使用堆緩沖區溢出棧緩沖區溢出全局緩沖區溢出返回后繼續使用在范圍之外繼續使用初始化順序的bug內存泄漏 在 Windows 系統中&#xff…

【劍指offer】——求出一個正整數的質數因子(Python)

目錄 一、題目描述 二、思路 1、短除法 2、平方根法 一、題目描述 功能:輸入一個正整數&#xff0c;按照從小到大的順序輸出它的所有質因子&#xff08;重復的也要列舉&#xff09;&#xff08;如180的質因子為2 2 3 3 5 &#xff09; 最后一個數后面也要有空格 輸入描述…

Python字符串筆錄

python字符串操作實方法&#xff0c;包括了幾乎所有常用的python字符串操作&#xff0c;如字符串的替換、刪除、截取、復制、連接、比較、查找、分割等 1、去空格及特殊符號 >>> s 123 >>> s.strip() # 去除所有空格123 >>> s1 123 >>&…

第九周進度條

第六周學習進度條 星期一 星期二 星期三 星期四 星期五 星期六 星期日 所花時間 &#xff08;包括上課&#xff09; 無 上午8:00-9:50 無 無 下午4:00-5:00 下午3&#xff1a;00-5&#xff1a;30 代碼量&#xff08;行&#xff09; 0行 260行 0行 0行 0行 0…

C++ STL實現的優先隊列( priority_queue )

本文參考的源碼版本&#xff1a;gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)。 priority_queue 本質是容器適配器&#xff0c;它對內部容器的元素有自己的管理方式&#xff0c;而 priority_queue 實際維護的是一個二叉堆。STL中 priority_queue 的…

【Python函數】——sort,sorted

1、sorted和sort的常規使用 2、關于自定義比較函數 3、試驗 from functools import cmp_to_key ll [(2,3,10),(1,2,3),(5,6,7),(2,5,10),(2,4,10)]# 根據一個維度進行排序&#xff0c;這里根據第一維排序 ll1 sorted(ll,key lambda x:x[0]) print(根據一個維度進行排序&a…

生成相關矩陣

U是X&#xff08;差異矩陣&#xff09;各列向量取方向后形成的矩陣&#xff0c;CU^T * U 即相關矩陣&#xff0c;即各列向量兩兩的夾角&#xff0c;&#xff08;夾角越小說明關聯度越高&#xff09; clc avg_e66;avg_m66;avg_s76; x1[61 63 78 65 63] -avg_e; x2[53 73 61 84 5…

Java關于Properties用法的總結(一)

最近項目中有一個這樣的需求&#xff0c;要做一個定時任務功能&#xff0c;定時備份數據庫的操表&#xff0c;將表數據寫入txt文件。因為文件的讀寫路徑可能需要隨時改動&#xff0c;所以寫死或者寫成靜態變量都不方便&#xff0c;就考慮使用配置文件&#xff0c;這里總結些配置…

【tensorflow】——tensorboard可視化計算圖以及參數曲線圖loss圖

參考文獻&#xff1a; https://zhuanlan.zhihu.com/p/71328244 目錄 1.可視化計算圖 2.可視化參數 3. 遠程tensorboard 4、報錯 真是出來混遲早是要還的&#xff0c;之前一直拒絕學習Tensorboard&#xff0c;因為實在是有替代方案&#xff0c;直到發現到了不得不用的地步…

Lab01:Xv6 and Unix utilities

實驗測試方法 實驗的測試方法主要有2個&#xff1a; 進入到Xv6系統中&#xff0c;執行相應的命令使用實驗提供的評分測試 對于單個實驗&#xff0c;可以使用 make GRADEFLAGSapplication grade其中application為要測試的實驗應用&#xff0c;例如sleep實驗對應的評分測試命令…

jQuery學習- 位置選擇器

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>位置選擇器</title><script src"js/jquery.js"></script><script type"text/javascript">$(function(){//獲取第一個li$(&quo…

數據類型之元組

存多個值&#xff0c;對比列表來說&#xff0c;元組不可變&#xff08;是可以當做字典的key的&#xff09;&#xff0c;主要是用來讀 與列表類型比&#xff0c;只不過[]換成()age(11,22,33,44,55) #本質agetuple((11,22,33,44,55)) print(type(age)) age[0]12 t(1,2,[a,b]) pri…

cocos2d-x3.6 連連看連通畫線

我的博客&#xff1a;http://blog.csdn.net/dawn_moon 網上看到非常多人寫的連連看&#xff0c;都沒有畫連線的實現。事實上要話連線挺簡單的。cocos2d-x 提供了一個非常方便的繪圖形的類。DrawNode。這個類封裝了非常多畫線條&#xff0c;多邊形的方法。非常方便&#xff0c;非…