PyTorch目標檢測(八)

2021-10-03 02:53:25 字數 3733 閱讀 5973

上接(七) 在pytorch上移植 tinyssd做剛性物體的目標檢測

# 損失函式

cls_loss = nn.crossentropyloss(weight=none, reduction='mean') 類別損失採取交叉熵均值

bbox_loss = nn.l1loss(reduction='mean') 錨框偏移採取角點偏移量絕對值的均值

def calc_loss(cls_preds, cls_labels, bbox_preds, bbox_labels, bbox_masks): 總損失兩者疊加

loss1 = cls_loss(cls_preds, cls_labels)

loss2 = bbox_loss(bbox_preds*bbox_masks, bbox_labels*bbox_masks)

return loss1+loss2

# 評價函式

def cls_eval(cls_preds, cls_labels): 類別**準確個數

values, indices = cls_preds.max(-1)

correct = torch.sum(indices==cls_labels).numpy()

return correct

def bbox_eval(bbox_preds, bbox_labels, bbox_masks): 角點偏移量

tem = ((bbox_labels-bbox_preds)*bbox_masks).abs()

return torch.sum(tem).numpy()

# 錨框產生

def multiboxprior(feature_map, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5]):

"""args:

feature_map: torch tensor, shape: [n, c, h, w].

sizes: list of sizes (0~1) of generated multiboxpriores.

ratios: list of aspect ratios (non-negative) of generated multiboxpriores.

returns:

anchors of shape (1, num_anchors, 4). 由於batch裡每個都一樣, 所以第一維為1

"""pairs = # pair of (size, sqrt(ration))

for r in ratios:

for s in sizes[1:]:

pairs = np.array(pairs)

ss1 = pairs[:, 0] * pairs[:, 1] # size * sqrt(ration)

ss2 = pairs[:, 0] / pairs[:, 1] # size / sqrt(ration)

base_anchors = np.stack([-ss1, -ss2, ss1, ss2], axis=1) / 2

h, w = feature_map.shape[-2:]

shifts_x = np.arange(0, w) / w

shifts_y = np.arange(0, h) / h

shift_x, shift_y = np.meshgrid(shifts_x, shifts_y)

shift_x = shift_x.reshape(-1)

shift_y = shift_y.reshape(-1)

shifts = np.stack((shift_x, shift_y, shift_x, shift_y), axis=1)

anchors = shifts.reshape((-1, 1, 4)) + base_anchors.reshape((1, -1, 4))

return torch.tensor(anchors, dtype=torch.float32).view(1, -1, 4)

import os

import torch

from torchvision import transforms

import torch.utils.data as data

from pil import image

import numpy as np

import xml.etree.elementtree as et

classname = ['redbox','matrix','bluebox','beer','redbull','ball','ad','milk']

# 讀取第i張的xml資訊和jpg影象

# 資料讀取

class my_date(data.dataset):

def __init__(self, root_dir, name):

self.root_dir = root_dir

self.annopath = os.path.join(root_dir,'annotations')

self.imgpath = os.path.join(root_dir, 'jpegimages')

self.idpath = os.path.join(root_dir, 'imagesets', name+'.txt')

self.transform = transforms.compose([

transforms.totensor(),

transforms.normalize([0.5,0.5,0.5],[0.5,0.5,0.5])

])self.ids =

for line in open(self.idpath):

def __getitem__(self, idx):

return getimg(self, idx), get_example(self, idx)

def __len__(self):

return len(self.ids)

# 測試

data = my_date('./czkdata', 'train')

print(data[0])

這裡參考voc2012資料集的目錄建立自己的資料集,voc2012的資料集解析可以參考這篇部落格新增鏈結描述

這裡my_data讀取之後返回的格式為3維歸一化的tensor影象,加上[方框左上角與右下角的座標,錨框內物體類別]

Pytorch目標檢測學習資源

深度學習框架pytorch 入門與實踐 官方教程 動手學深度學習 其他開源資料 pytorch官方出品了一本深度學習書 rfbnet code 詳解 ssd code 詳解 ssd演算法 史上最全 解析 核心篇 jimmyhua的文章 ssd演算法 史上最全 解析 核心篇 jimmyhua的文章 m...

目標檢測 YOLOv5(八)

簡介 yolov5權重檔案 密碼 00mp 作者給的演算法效能如下圖 改編自知乎大佬的一張圖 yolov5s網路是yolov5系列中深度最小,特徵圖的寬度最小的網路。後面的3種 yolov5m yolov5l yolov5x 都是在此基礎上不斷加深,不斷加寬。1 mosaic資料增強 同yolov4...

pytorch目標檢測ssd二 ssd的整體框架

這是ssd的第二篇部落格,主要是介紹ssd的整體框架,不會涉及 這篇部落格,我會分析一下整體框架。1 輸入 輸入的大小要被設定成300x300的,所以不是300x300的,輸入之前需要resize一下 2 特徵提取網路 深度神經網路可以進行特徵提取,我們的ssd採用的就是vgg深度神經網路。但是ss...