focal loss dice loss源码_SSD源码解析——使用SSD训练自己的数据+源码(pytorch)学习记录(二)...

624cd72c991c487de4a86982d6acb5e9.png

目录:

模型的整个前向传播过程
train.py入手
detector模块
backbone模块
build_box_head
先验框/数据集生成有关
build模块
transform模块
prior_bbox的生成
box_utils
余下的一些模块
loss模块
配置文件模块

SSD源码解析

本片文章主要是承接上一篇,记录了对pytorch SSD源码的一个解析(主要是怕自己过段时间忘了,当然也希望发出来和大家分享一下学习心得),过于细枝末节的东西不是很多,主要是对整个流程的结构进行梳理,整个梳理过程建议配合讲解SSD原理的文章食用,推荐:

小小将:目标检测|SSD原理与实现​zhuanlan.zhihu.com
fbcd2aee16ee3ec6062ad3e2321073df.png

的这篇硬核讲解

先看讲原理的文章(多半是蒙圈的),然后来看这里的代码细节,这样一来基本上就能够对整个SSD的核心流程有一个大概的把握。鉴于自己水平有限,难免会有理解不到位或者错误的地方,希望大佬拍砖

本文所用源码地址:

lufficc/SSD​github.com
0cf9c027d7dd0065aeee48d9a3e0cad8.png

模型的整个前向传播过程

train.py入手

从train.py入手,先看模型的整个调用关系

from 

detector模块

  • ssd/modeling/detector/_init_.py
from 
  • 找SSDDetector的定义位置
from 

由此可知:build_backbone和build_box_head是关键,下面分别解释

backbone模块

  • build_backbone:对于backbone部分的定义在ssd.modeling.backbone文件夹下面,作者提供了vggnet, mobileNetv2,efficient_net三个backbone。可以在代码中看到具体的定义,最需要关注的是从backbone不同阶段取出来(进行下一步卷积得到框的类别,位置)的几个特征图。以vggnet为例:

build_box_head

  • build_box_head,这部分是最不好理解但又是极为关键的,
# ssd/modeling/box_head/下面定义的 SSDBoxHead 类
  • make_box_predictor:上面的计算预测值的过程由ssd/modeling/box_head/box_predictor 中的make_box_predictor来执行,这是一个相当关键的步骤

这样一来,基本就理清楚了整个网络的前向过程,接下来需要搞清楚的是上面提到的我们的target是怎么来的,我们现在知道了模型总共预测了8732个框,也知道target中对应的gt_labels和gt_boxes负责和预测得到的cls_logits ,bbox_pred一一对应计算loss 所以接下来就是要知道target中的gt_labels([32, 8732])和gt_boxes[32, 8732, 4]是怎么来的。这里也就引出了SSD中很关键的一部分了,那就是prior boxes的产生。

先验框/数据集生成有关

target中对应的gt_labels和gt_boxes负责和预测得到的cls_logits ,bbox_pred一一对应计算loss。所以接下来从源码中来解读target中的gt_labels([32, 8732])和gt_boxes[32, 8732, 4]是怎么来的

build模块

还是回到train.py

from 

下面要仔细的解释一下为什么我们的原始标签和bbox的坐标就突然和先验框联系起来了。上面的整个追溯流程中make_data_loader的定义是关键,

'''

transform模块

虽然说transform模块的工作就是对原始的标注数据作出各种数据增强的变换:随机裁剪,镜像,对比度/亮度,通道交换顺序等操作。但是在build_target_transform中还调用到了PriorBox,从而联系到了target_transform.py中调用的 box_utils模块,这其实就突破点。

要把这个说清楚,还得先搞清楚一个东西,那就是prior_bbox的产生

prior_bbox的生成

这个在网上许多讲SSD原理的文章中都会重点讲,其实前面的代码分析中也出现过一些铺垫。简而言之:就是在原图的尺度下产生了8732个先验框,这些框和我们取的6个特征图大小是有关的,按照这六个的大小设计会产生出原图尺度上的8732个框

#在ssd/modeling/anchors/prior_box.py

box_utils

  • /ssd/data/transforms的init.py: 继续回到transform模块,可以在/ssd/data/transforms的init.py中第30行看到调用了Prior_box类!
def 
  • ssd/data/transforms/target_transform.py下面的SSDTargetTransform类:
#ssd/data/transforms/target_transform.py下面的SSDTargetTransform类
  • 显然,这一步就需要去研究box_utils模块
#convert_locations_to_boxes其实是把ssd的输出location(这里的输出其实是位置的偏置)

前面理顺了网络的整体前向结构,刚刚又分析了prior_boxes有关的datasets的一系列操作,最后就是来分析一下loss和一些配置文件了

余下的一些模块

loss模块

整个关于loss的定义在loss.py模块下的MultiBoxLoss类,具体的计算公式在许多的讲SSD原理的文章中都有提到,结合下面原作者已经很详细的注释了的源码,其实也不难理解,所以此处不再赘述

class 

配置文件模块

defaults.py:这个是整个工程的基本配置文件,有了上面的一系列铺垫,现在来看配置文件里面的各项参数设置就显得明了多了

#......
Dice损失和Focal Loss都是用于分类或多分类问题的损失函数,特别是在处理类别不平衡数据时非常有效。Dice Loss特别关注预测结果的精确度,而Focal Loss则是为了解决经典交叉熵损失在难样本上梯度消失的问题。 Dice Loss(也称为F Dice系数或Sørensen-Dice Coefficient)公式通常用于医疗图像分析等任务,计算形式为: ```python DiceLoss = 1 - (2 * intersection / (union + smoothness)) ``` 其中`intersection`是真实值和预测值相交部分,`union`是两者并集,`smoothness`是一个小常数防止分母为零。 Focal Loss则引入了一个动态调整因子,其公式为: ```python FL(p_t) = -(1-p_t) ** gamma * log(p_t) ``` `p_t`是模型对每个类别的预测概率,`gamma`是一个聚焦参数,使得容易分类的样本(高概率预测)的权重下降,更关注难以分类的样本(低概率预测)。 以下是使用PyTorch编写Dice+Focal Loss的基本代码示例: ```python import torch from torch.nn import BCEWithLogitsLoss class FocalDiceLoss(nn.Module): def __init__(self, gamma=2.0, smooth=1e-5): super(FocalDiceLoss, self).__init__() self.bce_loss = BCEWithLogitsLoss() self.smooth = smooth self.gamma = gamma def forward(self, input, target): pred = torch.sigmoid(input) # 计算Dice Loss intersection = (pred * target).sum(dim=(1, 2, 3)) dice = (2. * intersection + self.smooth) / (pred.sum(dim=(1, 2, 3)) + target.sum(dim=(1, 2, 3)) + self.smooth) dice_loss = 1 - dice.mean() # 计算Focal Loss focal_weight = torch.pow(1 - pred, self.gamma) bce_loss = self.bce_loss(pred, target) focal_dice = focal_weight * dice_loss return focal_dice # 使用 loss_fn = FocalDiceLoss() input = torch.randn(16, 1, 32, 32) # 预测tensor target = torch.randint(0, 2, (16, 1, 32, 32)) # 真实标签 loss = loss_fn(input, target) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值