CSPdarknet的网络结构如下图所示(该图来自别的博客【目标检测】yolov5模型详解-CSDN博客),是下图最左边的input和下面长方形的网络结构,该结构输出的是1X128X80X80,1X256X40X40和1X512X20X20三个数据。
代码如下:
import cv2
import numpy as np
import torch
import torch.nn as nn
#silu激活函数
class SiLU(nn.Module):
@staticmethod
def forward(x):
return x*torch.sigmoid(x)
def autopad(k, p=None):
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k]
return p
#1.单个卷积结构的的conv函数
class Conv(nn.Module):
def __init__(self,c1,c2,k=1,s=1,p=None,g=1,act=True):
super(Conv,self).__init__()
#卷积、标准化、激活函数
self.conv=nn.Conv2d(c1,c2,k,s,autopad(k,p),groups=g, bias=False)
self.bn=nn.BatchNorm2d(c2,eps=0.001, momentum=0.03)
self.act=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)))#卷积->BatchNorm2d->激活函数->output
def fuseforward(self,x):
return self.act(self.conv(x))#这个forward函数不存在BN操作
#2.focus函数
class Focus(nn.Module):
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups
super(Focus, self).__init__()
# 通道数变为原来 4 倍
self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
def forward(self,x):
# 320, 320, 12 => 320, 320, 64
return self.conv(
# 640, 640, 3 => 320, 320, 12
torch.cat(
[
x[...,::2,::2],
x[...,1::2,::2],