YOLOv8轻量化(CSPPC模块替换c2f)
YOLOv8模型参数:
YOLOv8模型(CSPPC模块替换c2f)参数:
1.在…/ultralytics/ultralytics/nn/modules下新建CSPPC.py文件夹
import torch
import torch. nn as nn
__all__ = [ 'CSPPC' ]
def autopad ( k, p= None , d= 1 ) :
if d > 1 :
k = d * ( k - 1 ) + 1 if isinstance ( k, int ) else [ d * ( x - 1 ) + 1 for x in k]
if p is None :
p = k // 2 if isinstance ( k, int ) else [ x // 2 for x in k]
return p
class Conv ( nn. Module) :
default_act = nn. SiLU( )
def __init__ ( self, c1, c2, k= 1 , s= 1 , p= None , g= 1 , d= 1 , act= True ) :
super ( ) . __init__( )
self. conv = nn. Conv2d( c1, c2, k, s, autopad( k, p, d) , groups= g, dilation= d, bias= False )
self. bn = nn. BatchNorm2d( c2)
self. act = self. default_act 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) )
class Partial_conv3 ( nn. Module) :
def __init__ ( self, dim, n_div, forward) :
super ( ) . __init__( )
self. dim_conv3 = dim // n_div
self. dim_untouched = dim - self. dim_conv3
self. partial_conv3 = nn. Conv2d( self. dim_conv3, self. dim_conv3, 3 , 1 , 1 , bias= False )
if forward == 'slicing' :
self. forward = self. forward_slicing
elif forward == 'split_cat' :
self. forward = self. forward_split_cat
else :
raise NotImplementedError
def forward_slicing ( self, x) :
x = x. clone( )
x[ : , : self. dim_conv3, : , : ] = self. partial_conv3( x[ : , : self. dim_conv3, : , : ] )
return x
def forward_split_cat ( self, x) :
x1, x2 = torch. split( x, [ self. dim_conv3, self. dim_untouched] , dim= 1 )
x1 = self. partial_conv3( x1)
x = torch. cat( ( x1, x2) , 1 )
return x
class CSPPC_Bottleneck ( nn. Module) :
def __init__ ( self, dim) :
super ( ) . __init__( )
self. DualPConv = nn. Sequential( Partial_conv3( dim, n_div= 4 , forward= 'split_cat' ) , Partial_conv3( dim, n_div= 4 , forward= 'split_cat' ) )
def forward ( self, x) :
return self. DualPConv( x)
class CSPPC ( nn. Module) :
def __init__ ( self, c1, c2, n= 1 , shortcut= False , g= 1 , e= 0.5 ) :
super ( ) . __init__( )
self. c = int ( c2 * e)
self. cv1 = Conv( c1, 2 * self. c, 1 , 1 )
self. cv2 = Conv( ( 2 + n) * self. c, c2, 1 )
self. m = nn. ModuleList( CSPPC_Bottleneck( self. c) for _ in range ( n) )
def forward ( self, x) :
y = list ( self. cv1( x) . split( ( self. c, self. c) , 1 ) )
y. extend( m( y[ - 1 ] ) for m in self. m)
return self. cv2( torch. cat( y, 1 ) )
2.在…/ultralytics/ultralytics/nn/modules/init .py文件中导入CSPPC
3.在…/ultralytics/ultralytics/nn/tasks.py文件中添加CSPPC
1)先导入
2)在parse_model函数中导入CSPPC
4.在…/ultralytics/ultralytics/cfg/models/v8中新建文件夹yolov8-CSPPC.yaml
nc : 80
scales :
n : [ 0.33 , 0.25 , 1024 ]
s : [ 0.33 , 0.50 , 1024 ]
m : [ 0.67 , 0.75 , 768 ]
l : [ 1.00 , 1.00 , 512 ]
x : [ 1.00 , 1.25 , 512 ]
backbone :
- [ -1 , 1 , Conv, [ 64 , 3 , 2 ] ]
- [ -1 , 1 , Conv, [ 128 , 3 , 2 ] ]
- [ -1 , 3 , CSPPC, [ 128 , True ] ]
- [ -1 , 1 , Conv, [ 256 , 3 , 2 ] ]
- [ -1 , 6 , CSPPC, [ 256 , True ] ]
- [ -1 , 1 , Conv, [ 512 , 3 , 2 ] ]
- [ -1 , 6 , CSPPC, [ 512 , True ] ]
- [ -1 , 1 , Conv, [ 1024 , 3 , 2 ] ]
- [ -1 , 3 , CSPPC, [ 1024 , True ] ]
- [ -1 , 1 , SPPF, [ 1024 , 5 ] ]
head :
- [ -1 , 1 , nn.Upsample, [ None, 2 , 'nearest' ] ]
- [ [ -1 , 6 ] , 1 , Concat, [ 1 ] ]
- [ -1 , 3 , CSPPC, [ 512 ] ]
- [ -1 , 1 , nn.Upsample, [ None, 2 , 'nearest' ] ]
- [ [ -1 , 4 ] , 1 , Concat, [ 1 ] ]
- [ -1 , 3 , CSPPC, [ 256 ] ]
- [ -1 , 1 , Conv, [ 256 , 3 , 2 ] ]
- [ [ -1 , 12 ] , 1 , Concat, [ 1 ] ]
- [ -1 , 3 , CSPPC, [ 512 ] ]
- [ -1 , 1 , Conv, [ 512 , 3 , 2 ] ]
- [ [ -1 , 9 ] , 1 , Concat, [ 1 ] ]
- [ -1 , 3 , CSPPC, [ 1024 ] ]
- [ [ 15 , 18 , 21 ] , 1 , Detect, [ nc] ]
5.在…/ultralytics文件夹中新建train.py文件夹
from ultralytics import YOLO
if __name__ == '__main__' :
model = YOLO( 'yolov8-CSPPC.yaml' )
results = model. train( data= 'your_data.yaml' , epochs= 300 , imgsz= 640 , batch= 32 )