最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

目標(biāo)檢測算法丨YOLOv3介紹及Darknet53代碼實(shí)現(xiàn)

2022-07-01 17:38 作者:騰科IT教育官方賬號  | 我要投稿

一、YOLOv3介紹

Yolo是You Look once的簡稱,是目標(biāo)檢測算法中比較常用的一種算法,從YOLOv1到Y(jié)OLOv5總共5個(gè)版本,這個(gè)算法不是最精準(zhǔn)的算法,但是它屬于在檢測速度和檢測精確度之間做了一個(gè)折中,其效果也是相當(dāng)不錯(cuò)的。我們這里主要是介紹其中的第三個(gè)版本。

YOLOv3是目標(biāo)檢測算法中的YOLO算法的第三個(gè)版本。在這個(gè)版本中其實(shí)并沒有太多的創(chuàng)新點(diǎn),更多的是借鑒了前兩個(gè)版本,但是卻在保持速度的同時(shí),在精度上做了優(yōu)化。

YOLOv3使用了一個(gè)單獨(dú)的神經(jīng)網(wǎng)絡(luò)作用在圖像上,將圖像劃分成多個(gè)區(qū)域并且預(yù)測邊界框和每個(gè)區(qū)域的概率。


二、Darknet53

YoloV3所使用的主干特征提取網(wǎng)絡(luò)為Darknet53,它具有兩個(gè)重要特點(diǎn):?

1、Darknet53具有一個(gè)重要特點(diǎn)是使用了殘差網(wǎng)絡(luò)Residual,Darknet53中的殘差卷積就是首先進(jìn)行一次卷積核大小為3X3、步長為2的卷積,該卷積會壓縮輸入進(jìn)來的特征層的寬和高,此時(shí)我們可以獲得一個(gè)特征層,我們將該特征層命名為layer。

之后我們再對該特征層進(jìn)行一次1X1的卷積和一次3X3的卷積,并把這個(gè)結(jié)果加上layer,此時(shí)我們便構(gòu)成了殘差結(jié)構(gòu)。通過不斷的1X1卷積和3X3卷積以及殘差邊的疊加,我們便大幅度地加深了網(wǎng)絡(luò)。

殘差網(wǎng)絡(luò)的特點(diǎn)是容易優(yōu)化,并且能夠通過增加相當(dāng)?shù)纳疃葋硖岣邷?zhǔn)確率。其內(nèi)部的殘差塊使用了跳躍連接,緩解了在深度神經(jīng)網(wǎng)絡(luò)中增加深度帶來的梯度消失問題。


2、Darknet53的每一個(gè)卷積部分使用了特有的DarknetConv2D結(jié)構(gòu),每一次卷積的時(shí)候進(jìn)行l(wèi)2正則化,完成卷積后進(jìn)行BatchNormalization標(biāo)準(zhǔn)化與LeakyReLU。

普通的ReLU是將所有的負(fù)值都設(shè)為零,Leaky ReLU則是給所有負(fù)值賦予一個(gè)非零斜率。以數(shù)學(xué)的方式我們可以表示為:


代碼實(shí)現(xiàn):


import?math
from?collections?import?OrderedDict

import?torch.nn?as?nn


# ---------------------------------------------------------------------#
# ? 殘差結(jié)構(gòu)
# ? 利用一個(gè)1x1卷積下降通道數(shù),然后利用一個(gè)3x3卷積提取特征并且上升通道數(shù)
# ? 最后接上一個(gè)殘差邊
# ---------------------------------------------------------------------#
class?BasicBlock(nn.Module):
? ?def?__init__(self, inplanes, planes):
? ? ? ?super(BasicBlock,?self).__init__()
?
? ? ? ?self.conv1?=?nn.Conv2d(inplanes, planes[0], kernel_size=1, stride=1, padding=0, bias=False)
? ? ? ?self.bn1?=?nn.BatchNorm2d(planes[0])
? ? ? ?self.relu1?=?nn.LeakyReLU(0.1)

? ? ? ?self.conv2?=?nn.Conv2d(planes[0], planes[1], kernel_size=3, stride=1, padding=1, bias=False)
? ? ? ?self.bn2?=?nn.BatchNorm2d(planes[1])
? ? ? ?self.relu2?=?nn.LeakyReLU(0.1)

? ?def?forward(self, x):
? ? ? ?residual?=?x

? ? ? ?out?=?self.conv1(x)
? ? ? ?out?=?self.bn1(out)
? ? ? ?out?=?self.relu1(out)

? ? ? ?out?=?self.conv2(out)
? ? ? ?out?=?self.bn2(out)
? ? ? ?out?=?self.relu2(out)

? ? ? ?out?+=?residual
? ? ? ?return?out


class?DarkNet(nn.Module):
? ?def?__init__(self, layers):
? ? ? ?super(DarkNet,?self).__init__()
? ? ? ?self.inplanes?=?32
? ? ???# 416,416,3 -> 416,416,32
? ? ? ?self.conv1?=?nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False)
? ? ? ?self.bn1?=?nn.BatchNorm2d(self.inplanes)
? ? ? ?self.relu1?=?nn.LeakyReLU(0.1)

? ??? ?# 416,416,32 -> 208,208,64
? ? ? ?self.layer1?=?self._make_layer([32, 64], layers[0])
? ? ???# 208,208,64 -> 104,104,128
? ? ? ?self.layer2?=?self._make_layer([64, 128], layers[1])
? ? ???# 104,104,128 -> 52,52,256
? ? ? ?self.layer3?=?self._make_layer([128, 256], layers[2])
? ? ???# 52,52,256 -> 26,26,512
? ? ???self.layer4?=?self._make_layer([256, 512], layers[3])
? ? ???# 26,26,512 -> 13,13,1024
??? ? ?self.layer5?=?self._make_layer([512, 1024], layers[4])

? ? ? ?self.layers_out_filters?=?[64, 128, 256, 512, 1024]

? ? ???# 進(jìn)行權(quán)值初始化
? ? ???for?m?in?self.modules():
? ? ? ? ? ?if?isinstance(m, nn.Conv2d):
? ? ? ? ? ? ? ?n?=?m.kernel_size[0] *?m.kernel_size[1] *?m.out_channels
? ? ? ? ? ? ? ?m.weight.data.normal_(0, math.sqrt(2.?/?n))
? ? ? ? ? ?elif?isinstance(m, nn.BatchNorm2d):
? ? ? ? ? ? ? ?m.weight.data.fill_(1)
? ? ? ? ? ? ? ?m.bias.data.zero_()

? ?# ---------------------------------------------------------------------#
? ?# ? 在每一個(gè)layer里面,首先利用一個(gè)步長為2的3x3卷積進(jìn)行下采樣
? ?# ? 然后進(jìn)行殘差結(jié)構(gòu)的堆疊
? ?# ---------------------------------------------------------------------#
? ?def?_make_layer(self, planes, blocks):
? ? ? ?layers?=?[]
? ? ???# 下采樣,步長為2,卷積核大小為3
? ? ? ?layers.append(("ds_conv", nn.Conv2d(self.inplanes, planes[1], kernel_size=3, stride=2, padding=1, bias=False)))
? ? ? ?layers.append(("ds_bn", nn.BatchNorm2d(planes[1])))
? ? ? ?layers.append(("ds_relu", nn.LeakyReLU(0.1)))
? ? ???# 加入殘差結(jié)構(gòu)
? ? ? ?self.inplanes?=?planes[1]
? ? ? ?for?i?in?range(0, blocks):
? ? ? ? ? ?layers.append(("residual_{}".format(i), BasicBlock(self.inplanes, planes)))
? ? ? ?return?nn.Sequential(OrderedDict(layers))

? ?def?forward(self, x):
? ? ? ?x?=?self.conv1(x)
? ? ? ?x?=?self.bn1(x)
? ? ? ?x?=?self.relu1(x)

? ? ? ?x?=?self.layer1(x)
? ? ? ?x?=?self.layer2(x)
? ? ? ?out3?=?self.layer3(x)
? ? ? ?out4?=?self.layer4(out3)
? ? ? ?out5?=?self.layer5(out4)

? ? ? ?return?out3, out4, out5

def?darknet53():
? ?model?=?DarkNet([1, 2, 8, 8, 4])
? ?return?model


這里就是YOLOv3的骨干網(wǎng)絡(luò)的實(shí)現(xiàn)。

目標(biāo)檢測算法丨YOLOv3介紹及Darknet53代碼實(shí)現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
嵊州市| 牟定县| 万盛区| 临洮县| 揭阳市| 石家庄市| 鹤壁市| 西平县| 海原县| 郸城县| 碌曲县| 和田市| 黎川县| 牡丹江市| 合作市| 章丘市| 滨州市| 探索| 锡林郭勒盟| 商南县| 临邑县| 开鲁县| 苏州市| 道真| 镶黄旗| 布拖县| 邹城市| 孟津县| 全椒县| 诏安县| 罗田县| 微山县| 焦作市| 罗定市| 洛隆县| 威远县| 民权县| 东丰县| 时尚| 弥勒县| 临朐县|