五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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)的評論 (共 條)

分享到微博請遵守國家法律
略阳县| 宝清县| 福鼎市| 镇江市| 纳雍县| 会理县| 简阳市| 项城市| 东乡族自治县| 泰宁县| 上思县| 松滋市| 光泽县| 阳新县| 吉安市| 怀化市| 文成县| 池州市| 赣州市| 上杭县| 罗江县| 大丰市| 奉贤区| 法库县| 张家港市| 荥阳市| 岫岩| 巨野县| 太仆寺旗| 丁青县| 咸丰县| 安溪县| 广丰县| 桦甸市| 贺州市| 镇宁| 玉山县| 滦平县| 墨竹工卡县| 苗栗县| 浮山县|