赞
踩
YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本。是一款强大、灵活的目标检测和图像分割工具,它提供了最新的 SOTA 技术。
Github: yolov8
网络结构优化的一种方法:替换基本组件;
对不同尺度模型调整了通道数和模型的深度,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,综合考虑模型的精度和推理速度
对比spp,将简单的并行max pooling 改为串行+并行的方式。对比如下(左边是SPP,右边是SPPF)
NECK部分和yolov5结构基本一致,区别主要有两点
正负样本分配策略上目标检测领域的一个常见的优化方向,典型的如 YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet DynamicSoftLabelAssigner,这类 Assigner 大都是动态分配策略,而 YOLOv5 采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。
TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本
具体执行步骤
# 1. 基于分类分数与回归的 IoU 计算对齐分数 alignment_metrics
alignment_metrics = bbox_scores.pow(self.alpha) * overlaps.pow(
self.beta)
# 2. 保证中心点在 GT 内部的 mask
is_in_gts = select_candidates_in_gts(priors, gt_bboxes)
# 3. 选取 TopK 大的对齐分数的样本
topk_metric = self.select_topk_candidates(
alignment_metrics * is_in_gts,
topk_mask=pad_bbox_flag.repeat([1, 1, self.topk]).bool())
常规的坐标点回归方式是一种狄拉克分布,即认为某一点的概率无穷大,而其他点的概率为0(概率密度是一条尖锐的竖线),这种方式认为标签是绝对正确的;在实际应用中,对于遮挡、模糊场景下目标框的边界存在一定的不确定性,如滑板左侧边界和大象右侧边界;而常规的回归方式不能解决这种不确定的问题,所以这种情况下学习边界一个分布更为合理;
但如果分布过于任意,网络学习的效率可能会不高,原因是一个积分目标可能对应了无穷多种分布模式。考虑到真实的分布通常不会距离标注的位置太远,因此优化与标签y最接近的一左一右两个位置的概率,从而让网络快速地聚焦到目标位置的邻近区域的分布中去较为合理;也就是说网络学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。
具体执行
def distribution_focal_loss(pred, label): r""" 参数: pred (torch.Tensor): 预测的bbox的分布(未经softmax)(N, n+1), n是y的最大值对应的下标,配置里是reg_max,具体见论文. label (torch.Tensor): anchor中心到gt bbox四条边的距离标签(N,). 返回值: torch.Tensor: 损失张量 (N,). """ #将label 划分到 dis_left 和 dis_right 两个整数之间 dis_left = label.long() dis_right = dis_left + 1 # label 与其右边界的差值 weight_left = dis_right.float() - label # label 与其左边界的差值 weight_right = label - dis_left.float() # 求交叉熵损失乘权重 loss = F.cross_entropy(pred, dis_left, reduction='none') * weight_left \ + F.cross_entropy(pred, dis_right, reduction='none') * weight_right return loss
几点理解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。