日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

softer nms论文阅读Bounding Box Regression with Uncertainty for Accurate Object Detection

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 softer nms论文阅读Bounding Box Regression with Uncertainty for Accurate Object Detection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

論文地址:https://arxiv.org/pdf/1809.08545.pdf

代碼地址:https://github.com/yihui-he/KL-Loss

https://github.com/yihui-he/softer-NMS

作者Yihui He (何宜暉)的git主頁

http://yihui-he.github.io/

參考:

https://www.cnblogs.com/fourmi/p/10721791.html

https://blog.csdn.net/lcczzu/article/details/86518615? (感覺這個講的更詳細)

預備知識:

KL散度(kullback-leibler divergence)

用途:比較兩個概率分布的接近程度

在統計應用中,我們經常需要用一個簡單的,近似的概率分布f來描述觀察數據x.這個時候,我們需要一個量來衡量我們選擇的近似分布f相比準確分布,究竟損失了多少信息量,這就是KL散度起作用的地方.

想要考察信息量的損失,就要先確定一個描述信息量的量綱,在信息論這門學科中,一個很重要的目標就是量化描述數據中含有多少信息.為此,提出了熵的概念,記作H,一個概率分布所對應的熵表達如下

如果我們使用log2作為底,熵可以被理解為,我們編碼所有信息所需要的最小位數(minimum numbers of bits),(----怎么知道的?)

需要注意的是,通過計算熵,我們可以知道信息編碼需要的最小位數,卻不能確定最佳的數據壓縮策略.怎樣選擇最優數據壓縮策略,使得數據存儲位數與熵計算的位數相同,達到最優壓縮,是另一個龐大的課題.

KL散度的計算

現在,我們能夠量化數據中的信息量了,就可以來衡量近似分布帶來的信息損失了.KL散度的計算公式其實是熵計算公式的簡單變形,在原有概率分布 p 上,加入我們的近似概率分布 q,計算他們的每個取值對應對數的差:

???????????????????????????????????? (1)

對于連續系統來講,就是

????????????????? (2)

換句話說,KL散度計算的就是數據的原分布與近似分布的概率的對數差的期望值。
在對數以2為底時,log2 ,可以理解為“我們損失了多少位的信息”,寫成期望形式

更常見的是以下形式:

現在,我們就可以使用KL散度衡量我們選擇的近似分布與數據原分布有多大差異了。

論文貢獻:

提出了learning NMS, KL損失,可以在訓練時調整每個物體的邊界方差,可以同時學習到邊框回歸和定位誤差.特別的,為獲取預測框的不確定性,本文把預測框建模為高斯分布,把ground-truth box建模為Dirac delta 函數.解決分類置信度和定位置信度不匹配問題.

這樣做的優點有3個

(1) 可以有效捕捉數據集中的模糊標注.這些模糊標注所產生的損失比較小

(2) 學習到的偏差在后處理過程中很有用,本文提出了variance voting, 基于相鄰box的位置,在NMS時, 它可以建議候選框的位置.

(3) 網絡學習出的分布是可以解釋的,因為它反映了預測框的不確定性,可能在自動駕駛或者機器人方面有潛在應用.

先看下傳統的NMS的做法,一般會在NMS時候把得分較低,即置信度較低的那些box給舍棄掉,比如在retinanet中,就先會把那些得分<score_threshold=0.05的那些box舍棄,然后再nms,但實際上,有些box盡管得分低,但其位置是比較精確的,但他們是被舍棄了的.

def _filter_detections(scores, labels):# threshold based on scoreindices = backend.where(keras.backend.greater(scores, score_threshold))#tf.greater()功能:比較scores, score_threshold兩個值的大小,返回值:一個列表,元素值都是true和false#在用where返回索引值,總體返回了scores中那些值>score_threshold的元素的位置if nms:#truefiltered_boxes = backend.gather_nd(boxes, indices)#先取出那些置信度大于閾值的boxfiltered_scores = keras.backend.gather(scores, indices)[:, 0]## perform NMS 調用了tensorflow.image.non_max_suppression執行最大值抑制,最多輸出的300個nms_indices = backend.non_max_suppression(filtered_boxes, filtered_scores, max_output_size=max_detections, iou_threshold=nms_threshold)# filter indices based on NMSindices = keras.backend.gather(indices, nms_indices)#找出經過極大值抑制之后保留的box的索引號

改進:在本文中,針對上述情況,會采用var voting方法,根據相鄰box來提升定位準確度.

soft nms及learning nms用于改進nms,相比刪除所有類別分數較低的邊界框,soft nms將衰減其他相鄰框的檢測分數.learning nms,提出學習一個新的網絡只對boxes及分類分數進行nms處理.

邊界框的增強,MR-CNN首次提出在迭代定位中將框進行merge操作,IOU-NET提出學習預測框與ground truth框之間的iou,然后,根據學習到的iou應用iou-nms,與IOU-NET不同,本文以概率分布的角度對位置方差進行單獨學習.因此,本文可以對四個坐標的方差進行單獨的學習,而不只是iou.var voting通過由kl損失學習到的相鄰邊界框的方差來對選擇的框產生新的位置.

方法:添加定位置信度

邊界框參數化: 本文提出獨立的對框的邊界進行回歸,(x1,x2,x3,x4)代表邊界框的4維數組.不同于r-cnn使用的(x,y,w,h),本文使用參數化的(x1,y1,x2,y2)

其中:(x1,y1,x2,y2)代表預測的box的坐標值

代表ground trueth的坐標值

代表anchor的坐標值

代表anchor的寬高

為網絡預測偏差

備注:網絡本質上不是預測(x1,y1,x2,y2),而是預測偏差值,通過后處理再得到預測值(x1,y1,x2,y2),這個一般觀察retinanet的代碼可以看出來,比如下面的bbox_transform_inv()函數,就是一個后處理操作,其返回值pred_boxes代表的是預測值(x1,y1,x2,y2),神經網絡本身的輸出是偏差值deltas,就是我們在這里的

問題: 為什么要除以邊框的w,h呢?

程序實現:keras_retinanet/backend/common.py/bbox_transform_inv()

def bbox_transform_inv(boxes, deltas, mean=None, std=None):""" Applies deltas (usually regression results) to boxes (usually anchors).Before applying the deltas to the boxes, the normalization that was previously applied (in the generator) has to be removed.The mean and std are the mean and std as applied in the generator. They are unnormalized in this function and then applied to the boxes.Argsboxes : np.array of shape (B, N, 4), where B is the batch size, N the number of boxes and 4 values for (x1, y1, x2, y2).deltas: np.array of same shape as boxes. These deltas (d_x1, d_y1, d_x2, d_y2) are a factor of the width/height.mean : The mean value used when computing deltas (defaults to [0, 0, 0, 0]).std : The standard deviation used when computing deltas (defaults to [0.2, 0.2, 0.2, 0.2]).ReturnsA np.array of the same shape as boxes, but with deltas applied to each box.The mean and std are used during training to normalize the regression values (networks love normalization)."""if mean is None:mean = [0, 0, 0, 0]if std is None:std = [0.2, 0.2, 0.2, 0.2]#mean [0 0 0 0].std [0.2 0.2 0.2 0.2], 問題,說這個均值和偏差是在generator中確定出來的,怎么沒見到?width = boxes[:, :, 2] - boxes[:, :, 0] #anchors中都是一個個的box,算出這些box的寬,height = boxes[:, :, 3] - boxes[:, :, 1]#算出這些box的高x1 = boxes[:, :, 0] + (deltas[:, :, 0] * std[0] + mean[0]) * width #這里是在原來的anchor的基礎上,對box進行位置精調,y1 = boxes[:, :, 1] + (deltas[:, :, 1] * std[1] + mean[1]) * height#x1_new=x1+0.2*delta*widthx2 = boxes[:, :, 2] + (deltas[:, :, 2] * std[2] + mean[2]) * widthy2 = boxes[:, :, 3] + (deltas[:, :, 3] * std[3] + mean[3]) * heightpred_boxes = keras.backend.stack([x1, y1, x2, y2], axis=2)return pred_boxes

因為可以獨立的回歸每個坐標值,為簡便起見,我們記坐標值為x.我們的目標是在估計box的位置的同時,估計這個box定位的準確度.

首先,除了預測box的位置之外,網絡會預測一個位置的概率分布,盡管概率分布會是一個比較復雜的多變量的高斯分布,在本文中,我們假設四個坐標是分布獨立的,定義了一個單變量的高斯分布:

這里不太懂x和都代表什么意思?

上述分布由一個全連接層預測得到,ground truth box也可以建模稱為一個高斯分布,可以看作的高斯分布,為

3.2 基于kl loss的box 回歸

目標檢測的目的找到,使得在N個樣本上的預測分布與真實分布之間的KL散度最小,根據前邊的預備知識可知,這兩個分布之間的散度越小,預測值就越接近真實值.

我們把KL散度作為box回歸的損失函數.類別損失保持不變,仍然為,則對一個樣本來講,根據預備知識中(2)式可知,其帶來的損失為:

??????????????????????????? (3)

根據沖激信號的篩選特性(忘記的同學去翻下大二學過的信號分析與處理這門課啊)

可知(3)式可化簡為:

??????????????????? (4)

問題:這里的,不是意味這損失值是無窮大嗎?

當預測的 不準確時,我們期望網絡的預測值 比較大, 因此就會比較小,因為與不依賴網絡的預測值,因此

當網絡的預測值時, ,KL LOSS 就退化為標準的歐氏損失

根據(4)將函數對于變量 進行求導可得:

?????? (5)

可以看出,網絡的預測值在分母位置,在訓練初期,因為網絡的權重一般初始化在0的附近,所以會導致(5)的值比較大,即發生梯度爆炸現象,為避免這個問題,實際操作中,我們的網絡不直接預測,而是預測 ,則.

??????????????????????? (6)

時,我們采取近似與smooth L_1 損失,

初始化: 把預測 的全連接層的權重初始化為高斯分布(均值=0,方差=0.0001)

問題: 網絡不直接預測,而是預測 就能解決梯度爆炸問題嗎?

答: 沿改進后的(6)對變量 進行求導可得:

?????? (5)

可以看出,即使網絡預測值(5)中兩個算式值都不會出現無窮大的情況,解決了梯度爆炸問題.

3.3 差異投票

???? 當我們得到預測的位置偏差后,比較直觀的想法是根據學習到的偏差值對候選框的位置進行投票,如下表所示,我們改動了NMS的3行代碼:

Algorithm 1 var voting

B 是 N×4 初始檢測框,S包含了每個框的置信度得分, C是 N×4 的預測的偏差值(相當于我們retinanet程序中的delta),D是最終的檢測結果, 是可調節參數, 藍色字體代表的是soft-NMS, 綠色字體代表差異投票

改進的地方:

在標準的NMS或soft-NMS過程中,我們對被選中的框進行投票,選擇好最高得分框b=后,會根據它自己和相鄰框計算這個框b的更新位置.受soft-NMS的啟發,我們會對離框b最近且具有比較小的不確定性的框給予比較大的權重.舉例來講,設x為坐標, 是第i個box的坐標,則框b按照以下規則進行更新:

當時,

????????????????? (6)

從(6)可以看出,有兩種類型的box會獲得較低的權重:

(1):若網絡的預測值較大的box,因為從(6)可以看出,框的權重= 就會比較小.

(2)與框b的iou較小的那些box,從(6)的第一個算式可以看出iou越小,p_i就會越小, 框的權重= 就會越小.

(3)更新box的位置時,沒有用到其置信度得分,并且那些iou較大的box沒有被刪除,而是用來更新了框b的位置.

4. 實驗部分

本文用了4塊GPU來訓練,并且根據參考文獻[15],對batch size 進行調節,可調節參數.

5.代碼實現

3.3代碼分析

softerNMS的開源代碼在https://github.com/yihui-he/softerNMS。

在softer-NMS/detectron/core/test.py有Softer-NMS(配置cfg.STD_NMS), Soft-NMS(配置cfg.TEST.SOFT_NMS.ENABLED)以及NMS的實現。

在softer-NMS/detectron/utils/py_cpu_nms.py文件有Softer-NMS的具體實現,加權求平均在47-48行代碼實現:

假設現在有boxes=[A1,A2,A3,A4,A5,A6],其位置置信度=confidence[c1,c2,c3,c4,c5,c6]

step1: 計算所有box兩兩之間的iou,并存儲到了矩陣IOUS中

step2: 找出置信度最高的box, 假設為A4,記錄其位置maxpos=3,(注意計算機中,A1在第一個位置,它的索引值=0)

maxpos = dets[i:N, 4].argmax()#找出所有的box中,置信度最高的哪一個, maxpos就是這個置信度最高的box所在的位置索引

step3: 把具有最高置信度的box=A4放在boxes的第一行,原來第一行A1放在原來具有最高置信度的位置,即boxes更新為[A4,A2,A3,A1,A5,A6]

dets[[maxpos,i]] = dets[[i,maxpos]]#第一輪循環時, 把具有最高置信度的哪個box放在第一行

step4: 對應的,因為step3調整了box的位置,所以需要對應調整位置置信度的位置=confidence[c4,c2,c3,c1,c5,c6]

confidence[[maxpos,i]] = confidence[[i,maxpos]]

step5: 對應的,因為step3調整了box的位置,所以需要更新IOUS的值,這里需要注意,行,列位置都要調整

ious[[maxpos,i]] = ious[[i,maxpos]]ious[:,[maxpos,i]] = ious[:,[i,maxpos]]

step6: 考慮其他box A4的iou, 若大于給定閾值,就把這些box的位置存儲下來,記錄到ovr_bbox,假設A3,A5滿足條件,其他的都不滿足,此時ovr_bbox=[2,4]

ovr_bbox = np.where((ious[i, i:N] > thresh))[0] + i##第一輪循環時,只考慮與最大值信度box相互之間iou>給定閾值的那些box

step7: 根據公式,計算p值,

p = np.exp(-(1-ious[i, ovr_bbox])**2/cfg.STD.IOU_SIGMA)

注意程序實現時,ious都是做的矩陣運算,所以計算結果p中是一個行向量,計算了A3,A5與A4的pi值,計算結果

,其中參數cfg.STD.IOU_SIGMA是自己配置的參數=0.02

step8:更新A4的4個坐標值(x1,y1,x2,y2),更新公式為

dets[i,:4] = p.dot(dets[ovr_bbox, :4] / confidence[ovr_bbox]**2) / p.dot(1./confidence[ovr_bbox]**2)#加權更新x1,y1,x2,y2,但這里為什么沒有#求和呢?

完整代碼:

def soft(dets, confidence=None, ax = None,softer=True):thresh = 0.6 #.6score_thresh = .7sigma = .5 N = len(dets)x1 = dets[:, 0].copy()y1 = dets[:, 1].copy()x2 = dets[:, 2].copy()y2 = dets[:, 3].copy()areas = (x2 - x1 + 1) * (y2 - y1 + 1)ious = np.zeros((N,N))for i in range(N):xx1 = np.maximum(x1[i], x1)yy1 = np.maximum(y1[i], y1)xx2 = np.minimum(x2[i], x2)yy2 = np.minimum(y2[i], y2)w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas - inter)ious[i,:] = ovri = 0while i < N:maxpos = dets[i:N, 4].argmax()maxpos += idets[[maxpos,i]] = dets[[i,maxpos]]areas[[maxpos,i]] = areas[[i,maxpos]]confidence[[maxpos,i]] = confidence[[i,maxpos]]ious[[maxpos,i]] = ious[[i,maxpos]]ious[:,[maxpos,i]] = ious[:,[i,maxpos]]ovr_bbox = np.where((ious[i, :N] > thresh))[0]avg_std_bbox = (dets[ovr_bbox, :4] / confidence[ovr_bbox]).sum(0) / (1/confidence[ovr_bbox]).sum(0)if softer:dets[i,:4] = avg_std_bboxelse:assert(False)areai = areas[i]pos = i + 1while pos < N:if ious[i , pos] > 0:ovr = ious[i , pos]dets[pos, 4] *= np.exp(-(ovr * ovr)/sigma)if dets[pos, 4] < 0.001:dets[[pos, N-1]] = dets[[N-1, pos]]areas[[pos, N-1]] = areas[[N-1, pos]]confidence[[pos, N-1]] = confidence[[N-1, pos]]ious[[pos, N-1]] = ious[[N-1, pos]]ious[:,[pos, N-1]] = ious[:,[N-1, pos]]N -= 1pos -= 1pos += 1i += 1keep=[i for i in range(N)]return dets[keep], keep

?

總結

以上是生活随笔為你收集整理的softer nms论文阅读Bounding Box Regression with Uncertainty for Accurate Object Detection的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。