Ultralytics:https://github.com/ultralytics/yolov5
本文链接: https://github.com/ghostype98/yolov5-aug
-
使用VOC数据集
在Annotations放置标签,images放置图片,建立ImageSets/Main 目录,samples目录,label目录
-
划分训练集,验证集、测试集
2.1 make_txt.py, 划分
训练验证集:测试集=8:2,训练验证集包括 训练集和验证集,比例为3:1,
这样划分最后为了增加训练集数量,训练使用训练验证集,测试和验证使用测试集
2.2 voc_label.py, 将图像转化为标签
2.3 test2sample.py, 将测试集图片放入 samples,方便后续推理,也可以自己加其他数据 -
修改数据集配置
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,不需要修改
-
下载预训练模型
github readme.md
-
修改train.py 的参数
主要就是权重文件,参数文件,数据集链接,超参数文件,训练epochs,batchsize,输入图像尺寸11 -
训练
python train.py --img 640 --batch 16 --data data/yolo.yaml --cfg smodels/yolov5s.yaml --weights weights/yolov5s.pt
--epochs 300
- 可视化 tensorboard
tensorboard --logdir runs/~/
生成日志的文件夹上一层目录
- 测试 修改test.py 参数
python test.py --data data/yolo.yaml --weights runs/best.py #数据路径,训练好的权重路径,
tips:yolov5会自动计算anchor box
3.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
- 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查看
- 网络结构修改
参考models/v5s-18.yaml和model/hub内容