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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习之非极大值抑制(Non-maximum suppression,NMS)

發(fā)布時(shí)間:2023/12/20 pytorch 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之非极大值抑制(Non-maximum suppression,NMS) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

非極大值抑制(Non-maximum suppression,NMS)是一種去除非極大值的算法,常用于計(jì)算機(jī)視覺中的邊緣檢測、物體識(shí)別等。

算法流程

給出一張圖片和上面許多物體檢測的候選框(即每個(gè)框可能都代表某種物體),但是這些框很可能有互相重疊的部分,我們要做的就是只保留最優(yōu)的框。假設(shè)有N個(gè)框,每個(gè)框被分類器計(jì)算得到的分?jǐn)?shù)為Si,(1<=i<=N)S_i, (1<=i<=N)Si?,(1<=i<=N)。

  • 建造一個(gè)存放待處理候選框的集合H,初始化為包含全部N個(gè)框;建造一個(gè)存放最優(yōu)框的集合M,初始化為空集。

  • 將所有集合 H 中的框進(jìn)行排序,選出分?jǐn)?shù)最高的框 m,從集合 H 移到集合 M;

  • 遍歷集合 H 中的框,分別與框 m 計(jì)算交并比(Interection-over-union,IoU),如果高于某個(gè)閾值(一般為0~0.5),則認(rèn)為此框與 m 重疊,將此框從集合 H 中去除。

  • 回到第1步進(jìn)行迭代,直到集合 H 為空。集合 M 中的框?yàn)槲覀兯琛?/p>

  • 需要優(yōu)化的參數(shù)

    IoU 的閾值是一個(gè)可優(yōu)化的參數(shù),一般范圍為0~0.5,可以使用交叉驗(yàn)證來選擇最優(yōu)的參數(shù)。

    示例

    比如人臉識(shí)別的一個(gè)例子:

    已經(jīng)識(shí)別出了 5 個(gè)候選框,但是我們只需要最后保留兩個(gè)人臉。

    首先選出分?jǐn)?shù)最大的框(0.98),然后遍歷剩余框,計(jì)算 IoU,會(huì)發(fā)現(xiàn)露絲臉上的兩個(gè)綠框都和 0.98 的框重疊率很大,都要去除。

    然后只剩下杰克臉上兩個(gè)框,選出最大框(0.81),然后遍歷剩余框(只剩下0.67這一個(gè)了),發(fā)現(xiàn)0.67這個(gè)框與 0.81 的 IoU 也很大,去除。

    至此所有框處理完畢。
    ??
    再比如定位一個(gè)車輛,最后算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。非極大值抑制:先假設(shè)有6個(gè)矩形框,根據(jù)分類器類別分類概率做排序,從小到大分別屬于車輛的概率分別為A、B、C、D、E、F。

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

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

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

    就這樣一直重復(fù),找到所有被保留下來的矩形框A、E。

    代碼

    import numpy as npdef py_cpu_nms(dets, thresh):# 單獨(dú)獲取各個(gè)參數(shù),以下參數(shù)shape = (5,)x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]areas = (y2-y1+1) * (x2-x1+1)print("areas.shape: {}".format(areas.shape))print("areas: {}".format(areas))keep = []# 得分按照由高到低排序的索引, index.shape = (6,)index = scores.argsort()[::-1]print("index.shape: {}".format(index.shape))print("index: {}".format(index))while index.size >0:# i為得分最高的索引i = index[0] # 將得分最高的索引追加到列表中keep.append(i)# 計(jì)算兩個(gè)box左上角點(diǎn)坐標(biāo)的最大值x11、y11和右下角坐標(biāo)的最小值x22、y22# x11、y11、x22、y22 shape = (5,)x11 = np.maximum(x1[i], x1[index[1:]])y11 = np.maximum(y1[i], y1[index[1:]])x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])print("index[1:]: {}".format(index[1:]))print("x1[index[1:]]: {}".format(x1[index[1:]]))print("x11: {}".format(x11))print("x11.shape: {}".format(x11.shape))# 當(dāng)兩個(gè)方框相交時(shí),22-11最后得到w,h是正值# 當(dāng)兩個(gè)方框不相交的時(shí)候,22-11最后得到w,h是負(fù)值,則設(shè)置為0# w、h shape = (5,)w = np.maximum(0, x22-x11+1)h = np.maximum(0, y22-y11+1)print("w: {}".format(w))print("w.shape: {}".format(w.shape))# 計(jì)算交集面積# overlaps.shape = (5,)overlaps = w * hprint("overlaps: {}".format(overlaps))print("overlaps.shape: {}".format(overlaps.shape))# 計(jì)算交并比# ious.shape = (5,)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)print("ious.shape: {}".format(ious.shape))print("ious: {}".format(ious))# 得到滿足閾值條件的ious中的索引(ious相比index缺少第一個(gè)最大值)ious_idx = np.where(ious<=thresh)[0]print("ious<=thres idx: {}".format(ious_idx))# ious_idx+1得到在index中的索引index = index[ious_idx + 1] # because index start from 1print("index: {}".format(index))return keepif __name__ == "__main__":boxes=np.array([[100,100,210,210,0.72], # 0[250,250,420,420,0.8], # 1[220,220,320,330,0.92], # 2[100,100,210,210,0.72], # 3[230,240,325,330,0.81], # 4[220,230,315,340,0.9]]) # 5keep = py_cpu_nms(boxes, thresh=0.7)print("keep: {}".format(keep))

    總結(jié)

    以上是生活随笔為你收集整理的深度学习之非极大值抑制(Non-maximum suppression,NMS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。