yolo系列的head模块

YOLO系列中的Head侧主要包含了Head检测头,损失函数部分以及Head侧的优化策略

1.yolov1的head

将1470reshape成7*7*30,其中1*1*30表示:

Loss

 由公式可以看出YOLOv1的损失函数可以分为检测框的回归损失置信度误差损失以及分类误差损失

(1)检测框的回归损失:

 (2)置信度误差损失

类别不均衡问题:在一张图像中物体往往只占一小部分,大部分还是背景为主。故在置信度误差损失中设置了\frac{}{}\lambda _{coord}=5和\frac{}{}\lambda _{noobj}=0.5来平衡含物体的置信度误差损失和不含物体的置信度误差损失两者的权重,让模型更加重视含物体的置信度误差损失。

(3)分类误差损失

 Head侧的优化策略

 缺点:

 2. yolov2的head

YOLOv2的Head侧在YOLOv1的基础上进行了网络结构和损失函数的改进,并且大名鼎鼎的anchor box也在此引入

YOLOv2在YOLOv1的基础上去掉了最后的全连接层,采用了卷积和anchor boxes来预测检测框。由于使用卷积对特征图进行下采样会使很多细粒度特征(Fine-Grained Features)的损失,导致小物体的识别效果不佳。故在YOLOv2Head侧中引入了passthrough layer结构,将特征图一分为四,并进行concat操作,保存了珍贵的细粒度特征。

YOLOv2Head侧输出的feature map大小为13*13,每个grid cell设置了5个anchor box预测得到5个检测框,一共有个13*13*5=845个检测框,与YOLOv1相比大大提高目标的定位准确率。

损失函数:

3.yolov3的head

YOLOv3Head侧在YOLOv2的基础上引入了多尺度检测逻辑和多标签分类思想,优化了损失函数

 多尺度检测逻辑:检测大中小目标

多标签分类思想:一个样本总可能有多个类别的目标,使用sigmoid

 YOLOv3中置信度误差损失和分类误差损失都使用交叉熵来表示

 

4.yolox

yolox使用Decoupled Head

yolox提出Decoupled Head

 

### YOLO Head 改进的技术细节 #### Decoupled Head 的设计思路 在传统的YOLO架构中,预测头(Head)通常采用耦合的方式处理分类和回归任务。然而,在改进版本中引入了去耦合头部(Decouple_Head),该结构通过分离不同类型的输出层来提高模型性能[^1]。 对于目标检测而言,Decouple_Head能够更精确地捕捉物体的位置信息并提升小尺寸对象识别的效果。具体来说,此方法会创建两个独立分支分别负责类别置信度估计与边界框坐标预测,从而减少了两者之间的相互干扰,使得训练过程更加稳定高效。 ```python class DecoupledHead(nn.Module): def __init__(self, num_classes=80): super(DecoupledHead, self).__init__() # 类别预测分支 self.cls_conv = nn.Conv2d(in_channels, out_channels=num_classes, kernel_size=1) # 边界框回归分支 self.reg_conv = nn.Conv2d(in_channels, out_channels=4, kernel_size=1) def forward(self, x): cls_pred = self.cls_conv(x) # 分类预测 reg_pred = self.reg_conv(x) # 回归预测 return torch.cat([cls_pred, reg_pred], dim=1) ``` #### ASFF (Adaptive Spatial Feature Fusion) 头部机制 为了进一步优化多尺度特征融合效果,提出了自适应空间特征融合(ASFF)技术用于YOLO的头部组件。这项技术创新之处在于它可以根据输入图像的不同区域动态调整各层次特征的重要性权重,进而获得更为鲁棒的目标表示形式。 ASFF不仅增强了跨尺度上下文关联性,还有效缓解了传统固定比例混合策略所带来的局限性问题;特别是在复杂场景下表现尤为突出,比如当存在遮挡或者光照变化等情况时仍能保持较高的准确性。 ```python import math def asff_fusion(features_list): levels = len(features_list) weights = [] for i in range(levels): weight_i = F.softmax(getattr(self,'level_%d_weight'%i)(features_list[i]),dim=-1).unsqueeze(-1).unsqueeze(-1) weights.append(weight_i) fused_feature = sum([weights[l]*F.interpolate(feat,scale_factor=pow(2,l-levels//2),mode='nearest') \ for l,(feat,wgt) in enumerate(zip(features_list,weights))]) return fused_feature ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值