- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
yolov5代码解读(⼀)
yolov5 代码解读(⼀)
common.py 部分
⾸先插⼊⼀张YOLOV5 结构图
普通卷积Conv
即图中CBL部分
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)
self.act = nn .SiLU() if act is True else (act if isinstance(act, nn .Module) else nn .Identity())
def forward(self, x):
return self.act(self.bn(self.conv(x)))
def forward_fuse(self, x):
return self.act(self.conv(x))
深度可分离卷积DWConv
分组卷积为对输⼊feature map进⾏分组,然后每组分别卷积,即改变的是g分组部分
深度可分离卷积为分组数量等于输⼊通道数量,即每个通道作为⼀个⼩组分别进⾏卷积,结果联结作为输出,Cin = Cout = g,没有bias
项,如图中上⾯部分,Output channels作为DWCONV的输⼊,划分了输⼊通道数量相等的分组,通道之间完全没有信息流通。
class DWConv(Conv):
# Depth-wise convolution class
def __init__(self, c1 , c2 , k=1, s=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super().__init__(c1, c2 , k, s, g=math.gcd(c1, c2), act=act)
跨尺度连接1—Bottleneck
图中Res unit 结构
class Bottleneck(nn.Module):
# Standard bottleneck
def __init__(self, c1 , c2 , shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_ , 1, 1)
self.cv2 = Conv(c_, c2 , 3, 1, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
跨尺度连接2—BottleneckCSP
图中CSP1_X 结构
class BottleneckCSP(nn.Module):
# CSP Bottleneck /WongKinYiu/CrossStagePartialNetworks
def __init__(self, c1 , c2 , n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_ , 1, 1)
self.cv2 = nn .Conv2d(c1, c_ , 1, 1, bias=False)
文档评论(0)