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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 目标检测 >内容正文

目标检测

【目标检测】(13) 先验框解码,调整预测框,附TensorFlow完整代码

發(fā)布時(shí)間:2023/12/20 目标检测 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【目标检测】(13) 先验框解码,调整预测框,附TensorFlow完整代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

各位同學(xué)好,今天和大家分享一下如何使用 TensorFlow 對(duì) YOLOV3 和 YOLOV4 網(wǎng)絡(luò)的輸出特征進(jìn)行解碼,微調(diào)每個(gè)先驗(yàn)框的坐標(biāo)和寬高,使其逼近真實(shí)標(biāo)簽框。

YOLOV3 和 YOLOV4 調(diào)整先驗(yàn)框的方法類(lèi)似,代碼通用。閱讀本篇文章之前,建議先看以下文章

YOLOV2中的先驗(yàn)框:https://blog.csdn.net/dgvv4/article/details/123772756

YOLOV3特征提取網(wǎng)絡(luò):https://blog.csdn.net/dgvv4/article/details/121997986

YOLOV4特征提取網(wǎng)絡(luò):https://blog.csdn.net/dgvv4/article/details/123818580


1. 生成先驗(yàn)框

網(wǎng)絡(luò)的三個(gè)有效輸出特征層分別輸出 52*52,26*26,13*13 的特征圖。13*13的輸出特征負(fù)責(zé)預(yù)測(cè)大尺度物體26*26負(fù)責(zé)預(yù)測(cè)中等大小的物體52*52負(fù)責(zé)預(yù)測(cè)小尺度物體YOLOV3 有9個(gè)先驗(yàn)框最大的三個(gè)先驗(yàn)框分配給了13*13的特征圖中等大小的三個(gè)先驗(yàn)框分配給了26*26的特征圖最小的三個(gè)先驗(yàn)框分配給了52*52的特征圖

如下圖,以13*13的特征圖為例。物體的中心點(diǎn)落在了紅色網(wǎng)格中,那么就需要由這個(gè)紅色網(wǎng)格生成的三個(gè)先驗(yàn)框中的一個(gè)去預(yù)測(cè)這個(gè)物體由三個(gè)先驗(yàn)框中與物體真實(shí)框的 iou 最大的先驗(yàn)框去預(yù)測(cè)這個(gè)物體

然而網(wǎng)絡(luò)輸出三種尺度 13*13、26*26、52*52 的特征圖,物體的中心點(diǎn)肯定會(huì)落在三種尺度的網(wǎng)格中,那么該物體是由哪一種尺度的網(wǎng)格生成的先驗(yàn)框去預(yù)測(cè)的呢。是由9個(gè)先驗(yàn)框中,與真實(shí)標(biāo)簽框 iou 最大的那個(gè)先驗(yàn)框所在尺度的網(wǎng)格來(lái)預(yù)測(cè)


2. 模型輸出結(jié)果

網(wǎng)絡(luò)的輸入特征圖的shape是 [416, 416, 3],經(jīng)過(guò)一系列卷積層,輸出三個(gè)尺度的特征結(jié)果,它們的shape分別是 [52, 52, (3*(5+num_classes))],[26, 26, (3*(5+num_classes))],[13, 13, (3*(5+num_classes))],。

其中通道數(shù)?3*(5+num_classes) 可以理解為:每個(gè)網(wǎng)格生成 3 個(gè)預(yù)測(cè)框,每個(gè)預(yù)測(cè)框包含了預(yù)測(cè)框相較于先驗(yàn)框的偏移量坐標(biāo)偏移量(tx, ty)寬高偏移量(tw, th)預(yù)測(cè)框中是否包含目標(biāo)物體 c,預(yù)測(cè)框內(nèi)的物體屬于每個(gè)類(lèi)別的條件概率num_classes,在VOC數(shù)據(jù)集中num_classes=20。其中 (tx, ty) 是負(fù)無(wú)窮到正無(wú)窮的任何數(shù),(tw, th) 是歸一化后的寬高。


3. 微調(diào)先驗(yàn)框

以某個(gè)網(wǎng)格的先驗(yàn)框的調(diào)整為例,如下圖所示,虛線框代表:和物體的真實(shí)標(biāo)簽框 iou 值最大的那個(gè)先驗(yàn)框,該先驗(yàn)框的寬高為(pw, ph);藍(lán)色框代表微調(diào)先驗(yàn)框后生成的預(yù)測(cè)框。

(cx,cy)是先驗(yàn)框中心點(diǎn)所在的網(wǎng)格的左上坐標(biāo)(歸一化后的坐標(biāo)),由于坐標(biāo)偏移量?(tx,ty) 可以是從負(fù)無(wú)窮到正無(wú)窮的任何數(shù)為了防止坐標(biāo)調(diào)整偏移過(guò)大給偏移量添加sigmoid函數(shù)將坐標(biāo)偏移量限制在0-1之間將預(yù)測(cè)框的中心點(diǎn)限制在它所在的網(wǎng)格內(nèi)高寬偏移量 (tw, th) 是歸一化后的寬高調(diào)整值。最終預(yù)測(cè)框的寬高 (bw, bh)?


4. 代碼展示

從網(wǎng)絡(luò)的輸出特征中提取出預(yù)測(cè)框的中心點(diǎn)坐標(biāo),預(yù)測(cè)框的寬高,預(yù)測(cè)框的置信度,框內(nèi)物體屬于每個(gè)類(lèi)別的條件概率。

import tensorflow as tf#(一)解碼網(wǎng)絡(luò)的輸出層的信息 def anchors_decode(feats, anchors, num_classes):'''feats是某一個(gè)特征層的輸出結(jié)果, 如shape=[b, 13, 13, 3*(5+num_classes)]anchors代表每個(gè)特征層, 每個(gè)網(wǎng)格的三個(gè)先驗(yàn)框[3,2]num_classes代表分類(lèi)類(lèi)別的數(shù)量'''# 計(jì)算每個(gè)網(wǎng)格幾個(gè)先驗(yàn)框=3num_anchors = len(anchors)# 獲得圖像網(wǎng)格的寬和高的shape=[h,w]=[13,13]grid_shape = feats.shape[1:3]#(1)獲得網(wǎng)格中每個(gè)網(wǎng)格點(diǎn)的坐標(biāo)信息# 獲得網(wǎng)格點(diǎn)的x坐標(biāo)信息[1]==>[1,13,1,1]grid_x = tf.reshape(range(0, grid_shape[1]), shape=[1,-1,1,1])# 在y維度上擴(kuò)張,將前面的數(shù)據(jù)進(jìn)行復(fù)制然后直接接在原數(shù)據(jù)后面# [1,13,1,1]==>[13,13,3,1]grid_x = tf.tile(grid_x, [grid_shape[0], 1, num_anchors, 1])# 獲得網(wǎng)格點(diǎn)的y坐標(biāo)信息,方法同上[13]==>[13,1,1,1]grid_y = tf.reshape(range(0, grid_shape[0]), shape=[-1,1,1,1])# 維度擴(kuò)張[13,1,1,1]==>[13,13,3,1]grid_y = tf.tile(grid_y, [1, grid_shape[1], num_anchors, 1])# 在通道維度上合并[13,13,3,2],每個(gè)網(wǎng)格的坐標(biāo)信息, 橫縱坐標(biāo)都是0-12,grid = tf.concat([grid_x, grid_y], axis=-1)# 轉(zhuǎn)換成tf.float32類(lèi)型grid = tf.cast(grid, tf.float32)#(2)調(diào)整先驗(yàn)框的信息,13*13個(gè)網(wǎng)格,每個(gè)網(wǎng)格有3個(gè)先驗(yàn)框,每個(gè)先驗(yàn)框有(x,y)坐標(biāo)# [3,2]==>[1,1,3,2]anchors_tensor = tf.reshape(anchors, shape=[1,1,num_anchors,2])# [1,1,3,2]==>[13,13,3,2]anchors_tensor = tf.tile(anchors_tensor, [grid_shape[0], grid_shape[1], 1, 1])# 轉(zhuǎn)換成float32類(lèi)型anchors_tensor = tf.cast(anchors_tensor, tf.float32)#(3)調(diào)整網(wǎng)絡(luò)輸出特征圖的結(jié)果# [b, 13, 13, 3*(5+num_classes)] = [b, 13, 13, 3, (5+num_classes)]'''代表13*13個(gè)網(wǎng)格, 每個(gè)網(wǎng)格有3個(gè)先驗(yàn)框, 每個(gè)先驗(yàn)框有(5+num_classes)項(xiàng)信息其中, 5代表: 中心點(diǎn)坐標(biāo)(x,y), 寬高(w,h), 置信度cnum_classes: 檢測(cè)框?qū)儆谀硞€(gè)類(lèi)別的條件概率, VOC數(shù)據(jù)集中等于20'''feats = tf.reshape(feats, shape=[-1, grid_shape[0], grid_shape[1], num_anchors, 5+num_classes])#(4)調(diào)整先驗(yàn)框中心坐標(biāo)及寬高# 對(duì)預(yù)測(cè)框中心點(diǎn)坐標(biāo)歸一化處理,只能在所處的網(wǎng)格中調(diào)整anchor_xy = tf.nn.sigmoid(feats[..., :2])box_xy = anchor_xy + grid # 每個(gè)網(wǎng)格的預(yù)測(cè)框坐標(biāo)# 網(wǎng)格的預(yù)測(cè)框?qū)捀吣J(rèn)是歸一化之后的,對(duì)寬高取指數(shù)anchors_wh = tf.exp(feats[..., 2:4])box_wh = anchors_wh * anchors_tensor # 預(yù)測(cè)框的寬高# 獲得預(yù)測(cè)框的置信度和每個(gè)類(lèi)別的條件概率box_conf = tf.nn.sigmoid(feats[..., 4:5])box_prob = tf.nn.sigmoid(feats[..., 5:])# 返回預(yù)測(cè)框信息return box_xy, box_wh, box_conf, box_prob

隨機(jī)生成一個(gè)13*13特征層的輸出特征圖,并給每個(gè)網(wǎng)格設(shè)置三種長(zhǎng)寬比的先驗(yàn)框,來(lái)驗(yàn)證三個(gè)先驗(yàn)框微調(diào)的效果。

#(二)驗(yàn)證 if __name__ == '__main__':feat = tf.random.normal([4,13,13,75], mean=0, stddev=0.5) # 構(gòu)建輸出特征圖anchors = tf.constant([[142, 110],[192, 243],[459, 401]]) # 每個(gè)網(wǎng)格的先驗(yàn)框坐標(biāo)# 返回調(diào)整后的預(yù)測(cè)框信息box_xy, box_wh, box_conf, box_prob = anchors_decode(feat, anchors, 20)'''某個(gè)網(wǎng)格調(diào)整后的預(yù)測(cè)框?qū)捀遊[ 80.93765 , 106.666855],[ 119.06944 , 248.29587 ],[ 413.01917 , 339.91293 ]]'''

以某一個(gè)網(wǎng)格為例,將結(jié)果可視化出來(lái)。左圖是最初的先驗(yàn)框,三個(gè)先驗(yàn)框的中心點(diǎn)在一起,右圖是調(diào)整后的預(yù)測(cè)框,紅色點(diǎn)是每個(gè)調(diào)整后的預(yù)測(cè)框的中心點(diǎn)。

總結(jié)

以上是生活随笔為你收集整理的【目标检测】(13) 先验框解码,调整预测框,附TensorFlow完整代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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