【YOLOV5】训练自己的数据集,CBAM,CIoU,Soft-nms,网络结构修改

Ultralytics:https://github.com/ultralytics/yolov5
本文链接: https://github.com/ghostype98/yolov5-aug

  1. 使用VOC数据集
    在Annotations放置标签,images放置图片,建立ImageSets/Main 目录,samples目录,label目录
    在这里插入图片描述

  2. 划分训练集,验证集、测试集
    2.1 make_txt.py, 划分
    训练验证集:测试集=8:2,训练验证集包括 训练集和验证集,比例为3:1,
    这样划分最后为了增加训练集数量,训练使用训练验证集,测试和验证使用测试集
    在这里插入图片描述

    2.2 voc_label.py, 将图像转化为标签
    2.3 test2sample.py, 将测试集图片放入 samples,方便后续推理,也可以自己加其他数据

  3. 修改数据集配置
    3.1新建 data/yolo.yaml , 加入train、test 地址 , 修改类别数量与名称 (注意“:”后面有一个空格)

train: data/trainval.txt
val: data/test.txt
test: data/test.txt

# Classes
nc: 4  # number of classes
names: ['0', '1', '2', '3']
**3.2修改模型参数**
	model/yolov5s.yaml	:nc为目标类别数量,同上
	yolov5可以自动计算anchor,不需要修改

在这里插入图片描述

  1. 下载预训练模型
    github readme.md
    在这里插入图片描述

  2. 修改train.py 的参数
    主要就是权重文件,参数文件,数据集链接,超参数文件,训练epochs,batchsize,输入图像尺寸11在这里插入图片描述

  3. 训练

python train.py --img 640 --batch 16 --data data/yolo.yaml --cfg smodels/yolov5s.yaml --weights weights/yolov5s.pt
--epochs 300
  1. 可视化 tensorboard
tensorboard --logdir runs/~/
生成日志的文件夹上一层目录
  1. 测试 修改test.py 参数
    python test.py --data data/yolo.yaml --weights runs/best.py #数据路径,训练好的权重路径,

tips:yolov5会自动计算anchor box
3.1中地址冒号后面需要加一个空格

  1. 调参
    9.1 置信度阈值 val.py line 89
  def run(conf_thres=0.3
)

9.2 nms的IoU阈值 train.py line413 默认0.6

val.run(iou_thres = 0.6
)

9.3 损失函数 loss.py line135

iou = bbox_iou(CIoU=False
)

使用其他函数在utils/metrics.py line 192所示,

在这里插入图片描述EIoU开源,可以去本文github去看,在 bbox_iou函数中:
在这里插入图片描述

9.4 NMS筛选算法
val.py line185

out=non_max_suppression()

utils/general.py line630
merge=FALSE,不使用merge-nms

val.py line 112

soft=TRUE

自己增加的soft-nms 函数在utils/general.py line703

def soft_nms(prediction, conf_thres=0.25, iou_thres=0.45, multi_label=False):

9.5 超参数
data/hyps/hyp.scratch.yaml
lr0 初始学习率
lrf 最终学习率=lr0*lrf
momenrum 优化器SGD动量
iou_t已经在6.0注释掉,没有用
fl_gamma focal loss的系数,默认1.5,0是不使用

box:0.05, 预测框损失系数
cls:0.5, 类别损失系数
cls_pw:1, 分类BCEloss的正样本权重,
obj:物体损失系数 obj_pw :物体BCEloss中正样本权重
iou_t:0.2 iou训练阈值
anchor_t:4 anchor多尺度阈值
fl_gamma:0 focal loss 不使用
hsv_h,hsv_s,hsv_v 图像色调、饱和度、亮度
degress 图像旋转
translate 图像转换
scale 图像比例
shear 图像裁剪(度)
perspective :图像透视(分数)
flipud :上下翻转概率
fliplr :左右翻转概率
mosaic :马赛克增强概率
mixup :图像混合概率
copy_paste : 复制粘贴(概率)

参考链接:https://blog.csdn.net/qq_36756866/article/details/109111065
https://blog.csdn.net/qq_39542170/article/details/109242027

  1. CBAM修改
    yolov5-aug/models/common.py 是读取网络模型函数定义,添加
#CBAM
class CBAM(nn.Module):
    def __init__(self, c1, c2, e = 0.5):
        super(CBAM, self).__init__()
        #c_ = int(c2 * e)
        # self.channel_attention = ChannelAttention(c_)
        self.channel_attention = ChannelAttention(c1)
        self.spatial_attention = SpatialAttention(7)

    def forward(self, x):
        out = self.channel_attention(x) * x
        out = self.spatial_attention(out) * out
        return out
class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        # #Method 1
        # self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        # self.relu = nn.ReLU()
        # self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)

        # # Method 2 : Sequential
        self.shareMLP = nn.Sequential(
            nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),
            nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
        )
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.shareMLP(self.avg_pool(x))
        max_out = self.shareMLP(self.max_pool(x))
        out = self.sigmoid(avg_out + max_out)
        return out

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avg_out, max_out], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)

models/yolo.py中,注册CBAM

在这里插入图片描述

yolov5s.yaml 中使用,可以从models/v5s-18.yaml查看
在这里插入图片描述

  1. 网络结构修改
    参考models/v5s-18.yaml和model/hub内容
  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值