前面已經講了怎麼造的樣本,我們這裡回顧一下。
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...