多目標檢測與識別 YOLOV3 解讀四 反算

2021-09-27 13:24:29 字數 3613 閱讀 1290

前面已經講了怎麼造的樣本,我們這裡回顧一下。

1.標註目標位置(xmin,ymin,xmax,ymax),並算出中心點座標、寬高(cx,cy,w,h)

2.中心點座標除以的寬高(cx/size(0),cy/size(2),w/size(0),h/size(1))然後resize(416,416)

3.把(cx/size(0),cy/size(2),w/size(0),h/size(1))所有值乘以416,得到在縮放下中心點寬高的位置。

4.把中心點除以縮放比例,整數部分得到中心點在特徵圖的位置,小數得到中心點相對於網格左上角的偏移。

5.相對位置用真實框和建議框的寬高比表示。並且寬高比前要加乙個log,置信度用真實框和建議框的iou表示。

簡單說怎麼製造的樣本就怎麼反算回去。

先上圖

上圖是造樣本所用的圖,實現框是真實框,虛線框是建議框。tx、ty是中心點相當於中心點所在網格左上角的偏移,然後用sigmiod啟用。cx,cy是中心點所在特徵的位置把他們加起來,再乘以縮放比例就是原圖中心點的位置。同理寬高業是怎麼造的資料就怎麼反算回去。

import cfg

from darknet53 import

*from utils import

*import torch

device = torch.device(cfg.device)

class

detector

(torch.nn.module)

:def

__init__

(self)

:super

(detector, self)

.__init__(

) self.net = mainnet(cfg.class_num)

.to(device)

self.net.load_state_dict(torch.load(

'weights/darknet53.pt'))

self.net.

eval()

defforward

(self,

input

, thresh, anchors)

: output_13, output_26, output_52 = self.net(

input

.to(device)

) idxs_13, vecs_13 = self._filter(output_13, thresh)

boxes_13 = self._parse(idxs_13, vecs_13,

32, anchors[13]

) idxs_26, vecs_26 = self._filter(output_26, thresh)

boxes_26 = self._parse(idxs_26, vecs_26,

16, anchors[26]

) idxs_52, vecs_52 = self._filter(output_52, thresh)

boxes_52 = self._parse(idxs_52, vecs_52,

8, anchors[52]

) boxes_all = torch.cat(

[boxes_13, boxes_26, boxes_52]

, dim=0)

last_boxes =

for n in

range

(input

.size(0)

):n_boxes =

boxes_n = boxes_all[boxes_all[:,

6]== n]

for cls in

range

(cfg.class_num)

: boxes_c = boxes_n[boxes_n[:,

5]== cls]

if boxes_c.size(0)

>0:

n_boxes.extend(nms(boxes_c,

0.3)

)else

:pass

)return last_boxes

def_filter

(self, output, thresh)

: output = output.permute(0,

2,3,

1)output = output.reshape(output.size(0)

, output.size(1)

, output.size(2)

,3,-

1)output = output.cpu(

) torch.sigmoid_(output[..

.,4]

)# 置信度加sigmoid啟用

torch.sigmoid_(output[..

.,0:

2])# 中心點加sigmoid啟用

# 在計算置信度損失的時候使用的sigmoid

mask = output[..

.,4]

> thresh

idxs = mask.nonzero(

) vecs = output[mask]

# print(vecs[..., 4])

return idxs, vecs

def_parse

(self, idxs, vecs, t, anchors)

:if idxs.size(0)

==0:return torch.tensor(

) anchors = torch.tensor(anchors)

n = idxs[:,

0]# 所屬的

a = idxs[:,

3]# 建議框

c = vecs[:,

4]# 置信度

cls = torch.argmax(vecs[:,

5:], dim=1)

cy =

(idxs[:,

1].float()

+ vecs[:,

1])* t # 原圖的中心點y

cx =

(idxs[:,

2].float()

+ vecs[:,

0])* t # 原圖的中心點x

w = anchors[a,0]

* torch.exp(vecs[:,

2]) h = anchors[a,1]

* torch.exp(vecs[:,

3]) w0_5, h0_5 = w /

2, h /

2 x1, y1, x2, y2 = cx - w0_5, cy - h0_5, cx + w0_5, cy + h0_5

return torch.stack(

[x1, y1, x2, y2, c, cls.

float()

, n.

float()

], dim=

1)

yolov3檢測人頭 基於yolo v3的人臉檢測

一 實驗環境的搭建 1.安裝環境配置 python 3.6 tensorflow gpu 1.6.0 keras pillow opencv python matplotlib numpy 沒有通過pip安裝 例如 pip install keras 2.啟動虛擬環境,並且安裝對應的實驗環境 3.模...

目標檢測 Yolov3網路詳解

現在來仔細理解下yolov3這個網路細節。目標檢測的經典網路有yolo和ssd,還有今天要記錄的yolov3。yolo 將一張圖劃分為眾多個小格仔,每個小格仔檢測到一種物體,並 兩個bounding box,問題是當小格仔內的物體眾多時,yolo很可能會漏檢。ssd 不太適合檢測小物體,vgg19限...

深度學習目標檢測系列之YOLOV3

作者說yolov3相當於是一篇技術報告,因為他還有很多別的煩心事要去幹。所以yolov3相當於是在原始yolo版本的基礎上,整合現有的先進技術進行改良。不過從業界反映來講,還是很不錯的。這就是說有的人隨隨便便就做出了其它人一輩子也做不出來的事。但是這篇 更大的意義在於,讓我們停一停 想一想,what...