第一次寫CSDN博客嘻嘻,深度學習入門小菜鳥,希望像做筆記記錄自己學的東西,也希望能幫助到同樣入門的人,更希望大佬們幫忙糾錯啦~侵權立刪,
目錄
文章目錄
一、背景介紹
1.下采樣
2.常見下采樣做法
二、前身:YOLOv2中的PassThrough層
二、Focus層
1.原理
2.代碼分析
一、背景介紹
Focus層是在YOLOv5中被提出來的,感覺像是一種特殊的下采樣的方式,
1.下采樣
下采樣就是一種縮小影像的手法,用來降低特征的維度并保留有效資訊,一定程度上避免過擬合,都是以犧牲部分資訊為代價,換取資料量的減少,下采樣就是池化操作,但是池化的目的不僅如此,還需要考慮旋轉、平移、伸縮不變形等待,采樣有最大值采樣,平均值采樣,隨機區域采樣等,對應池化:比如最大值池化,平均值池化,隨機池化等,
2.常見下采樣做法
平均值池化:對鄰域內特征點只求平均,有點像平滑濾波,根據滑窗的尺寸控制下采樣的力度,尺寸越大,它的采樣率越高,但邊緣資訊損失越大,
最大值池化:對鄰域內特征點取最大,類似銳化,突出滑窗內的細節點(特殊點),
具體如下圖所示:

二、前身:YOLOv2中的PassThrough層
PassThrough層和YOLOv5中的Focus層很像(前身?感覺好像作用一樣啊,有沒有知道的大佬可以給我講講),他是將相鄰的特征堆積在不同的通道中,這樣可以將大尺度特征圖下采樣后與小尺度特征圖進行融合,進而增加了小目標檢測的精確度,
原理如下:

二、Focus層
1.原理
Focus層原理和PassThrough層很類似,它采用切片操作把高解析度的圖片(特征圖)拆分成多個低解析度的圖片/特征圖,即隔列采樣+拼接,原理圖如下:

原始的640 × 640 × 3的影像輸入Focus結構,采用切片(slice)操作,先變成320 × 320 × 12的特征圖,拼接(Concat)后,再經過一次卷積(CBL)操作,最終變成320 × 320 × 64的特征圖,

Focus層將w-h平面上的資訊轉換到通道維度,再通過3*3卷積的方式提取不同特征,采用這種方式可以減少下采樣帶來的資訊損失 ,
2.代碼分析
Focus層及其相關代碼如下(models/common.py)
(YOLOv5原始碼:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite:)
def autopad(k, p=None): # kernel, padding自動填充的設計,更加靈活多變
# Pad to 'same'
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad自動填充,通過自動設定填充數p
#如果k是整數,p為k與2整除后向下取整;如果k是串列等,p對應的是串列中每個元素整除2,
return p
class Conv(nn.Module):
# Standard convolution
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
self.bn = nn.BatchNorm2d(c2) #將其變為均值為0,方差為1的正態分布,通道數為c2
self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())#其中nn.Identity()是網路中的占位符,并沒有實際操作,在增減網路程序中,可以使得整個網路層資料不變,便于遷移權重資料;nn.SiLU()一種激活函式(S形加權線性單元),
def forward(self, x):#正態分布型的前向傳播
return self.act(self.bn(self.conv(x)))
def forward_fuse(self, x):#普通前向傳播
return self.act(self.conv(x))
class Focus(nn.Module):
# Focus wh information into c-space
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super().__init__()
self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
# self.contract = Contract(gain=2)
def forward(self, x): # x(b,c,w,h) -> y(b,4c,w/2,h/2)
return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
#圖片被分為4塊,x[..., ::2, ::2]指圖片的左上角那一塊, x[..., 1::2, ::2]指右上角那一塊,x[..., ::2, 1::2]指左下角那一塊,x[..., 1::2, 1::2]指右下角那一塊,都是每隔一個采樣(采奇數列),用cat連接這些采樣圖,生成通道數為12的特征圖
# return self.conv(self.contract(x))
先采取切片操作(x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2] )把圖片分成1,2,3,4共4塊(如上面的原理圖)
然后進行一個連接
然后再來一次卷積,這里的卷積是自定義卷積:先進行一次卷積,然后變化成正態分布,最后來個SiLU激活,完成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414009.html
標籤:其他
上一篇:GMM-HMM聲學模型實體詳解
下一篇:【python語音識別】借助百度智能云實作任意時間長度語音識別,輸入語音轉為文字的python程式,按回車開始錄制按回車結束錄制,錄音時間任意,無需指定錄音時間
