赞
踩
YOLOV5是一系列在COCO数据集上预训练的目标检测架构和模型,结合了在数千个小时的研究和开发中获得的经验教训和最佳实践。本文主要以yolov5s为例介绍YOLOV5-v7.0版本的网络架构及初始化超参数。
网络结构主要包含以下部分:
1.输入端:自适应锚框计算、自适应图片缩放、Mosaic数据增强
2.Backbone:CBS模块、C3模块、SPPF模块
3.Neck:FPN+PAN结构
4.Head:CIOU Loss
在YOLOV5中,每次训练前,都会根据数据集来自适应计算anchor锚框大小
若觉得计算的锚框效果不好,可以在train.py的参数设置部分将--noautoanchor的default设置为False
1.1计算过程
1.2默认锚框
在models下的配置文件yaml下预设了一些针对COCO数据集在640*640图像下的锚定框的尺寸:
anchor的参数一共有三行,每行6个数值;每一行代表不同的特征图;
1.3自定义锚框
锚框核查函数/utils/autoanchor.py文件中:
- def check_anchors(dataset, model, thr=4.0, imgsz=640):
- # Check anchor fit to data, recompute if necessary
- m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1] # Detect()
- shapes = imgsz * dataset.shapes / dataset.shapes.max(1, keepdims=True)
- scale = np.random.uniform(0.9, 1.1, size=(shapes.shape[0], 1)) # augment scale
- wh = torch.tensor(np.concatenate([l[:, 3:5] * s for s, l in zip(shapes * scale, dataset.labels)])).float() # wh
-
- def metric(k): # compute metric
- r = wh[:, None] / k[None]
- x = torch.min(r, 1 / r).min(2)[0] # ratio metric
- best = x.max(1)[0] # best_x
- aat = (x > 1 / thr).float().sum(1).mean() # anchors above threshold
- bpr = (best > 1 / thr).float().mean() # best possible recall
- return bpr, aat
-
- stride = m.stride.to(m.anchors.device).view(-1, 1, 1) # model strides
- anchors = m.anchors.clone() * stride # current anchors
- bpr, aat = metric(anchors.cpu().view(-1, 2))
- s = f'\n{PREFIX}{aat:.2f} anchors/target, {bpr:.3f} Best Possible Recall (BPR). '
- if bpr > 0.98: # threshold to recompute
- LOGGER.info(f'{s}Current anchors are a good fit to dataset ✅')
- else:
- LOGGER.info(f'{s}Anchors are a poor fit to dataset ⚠️, attempting to improve...')
- na = m.anchors.numel() // 2 # number of anchors
- anchors = kmean_anchors(dataset, n=na, img_size=imgsz, thr=thr, gen=1000, verbose=False)
- new_bpr = metric(anchors)[0]
- if new_bpr > bpr: # replace anchors
- anchors = torch.tensor(anchors, device=m.anchors.device).type_as(m.anchors)
- m.anchors[:] = anchors.clone().view_as(m.anchors)
- check_anchor_order(m) # must be in pixel-space (not grid-space)
- m.anchors /= stride
- s = f'{PREFIX}Done ✅ (optional: update model *.yaml to use these anchors in the future)'
- else:
- s = f'{PREFIX}Done ⚠️ (original anchors better than new anchors, proceeding with original anchors)'
- LOGGER.info(s)

YOLOV5在开始训练前会计算数据集标注信息针对默认锚定框的最佳召回率,如果最佳召回率大于或等于0.98,则不需要重新计算锚定框,使用默认锚定框;否则会重新计算符合此数据集的锚定框。
- def metric(k, wh): # compute metrics
- r = wh[:, None] / k[None]
- x = torch.min(r, 1 / r).min(2)[0] # ratio metric
- # x = wh_iou(wh, torch.tensor(k)) # iou metric
- return x, x.max(1)[0] # x, best_x
其中,bpr参数就是判断是否需要重新计算锚定框的依据(是否小于0.98)
重新计算符合此数据集标注的锚定框,是利用k均值聚类算法和遗传算法实现的
最早出现在YOLOV4,V5也沿用了此技术。
Mosaic数据增强的主要思想是将多张图片按一定比例组合成一张图片,实则是参考了CutMix的数据增强方式,CUtMix是将两张图片进行拼接,Mosaic则是对四张图片进行拼接,拼接后得到一张新的图片,同时也获得了对应的检测框。然后把他传入网络中学习,相当于一下子传入四张图片学习。
Mosaic数据增强的主要步骤:
Mosaic数据增强的优点:
BN原理为计算每一个特征层的均值和方差, 如果批样本总量越大,那么BN计算的均值和方差就越接近于整个数据集的均值和方
差,效果越好。
Backbone主干网络的主要作用是提取特征,并不断缩小特征图。他的主要结构有Conv模块、C3模块、SPPF模块
有一个COnv2d、一个BatchNorm2d和SiLU激活函数构成
- def autopad(k, p=None, d=1): # kernel, padding, dilation
- # Pad to 'same' shape outputs
- if d > 1:
- k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-size
- if p is None:
- p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad
- return p
C3模块有三个CBS模块和一个BottleNeck模块组成,因此得名。在Backbone中,C3是更为重要的特征提取模块。其结构如图:
SPP是空间金字塔池化,采用1 x 1, 5x 5, 9x 9, 13 x 13的最大池化的方式,进行多尺度融合。YOLOv5 6.0版本开始使用了在SPP基础上改进的SPPF。
注意:图像的尺度并非指图像的大小,而是指图像的模糊程度(σ) ,例如,人近距离看一个物体和远距离看一 个物体模糊程度是不一样的,从近距离到远距离图像越来越模糊的过程,也是图像的尺度越来越大的过程。
(4)Foucs结果(6.0版本开始启用)
Focus模块是对图片进行切片操作,具体操作是在-张图片中每隔一 个像拿到一个值,这样获得了四个独立的特征层,然后将四个独立的特征层进行堆叠,此时宽高信息就集中到了通道信息,输入通道扩充了四倍。拼接起来的特征层相对于原先的三通道变成了十二个通道,后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
YOLOv5 6 0开始将Focus模块替换成了一个6 * 6的卷积层。两者的计算量是等价的,但使用6 * 6的卷积会更加高效。
Neck的作用就是从Backbone中获取相对于较浅的特征,再与深层的语义特征Concat到-起。
FPN结构通过自顶向下进行上采样,使得底层特征图包含更强的图像强语义信息
总结: FPN层自顶向下可以捕获强语义特征,而PAN则通过自底向上传达强定位特征。
Head层为Detect模块,Detect模 块的网络结构很简单,仅由三个1 * 1卷积构成,对应三个检测特征层。
最后的255可以拆分成3个85,对应3个先验框的85个参数, 85可以拆分成4 + 1 + 80。
这里的3是指每个位置先验框(锚框)的数量;
前4个参数用于判断每一个特征点的回归参数, 回归参数调整后可以获得预测框;
第5个参数用于判断每一个特征点是否包含物体;
最后80个参数用于判断每一个特征点所包含的物体种类。
文件位于data/hyps文件夹下
- # YOLOv5 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/320095推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。