cornernet------loss

在这里插入图片描述

  • 首先我们使用网络训练出左上角的heatmap_tl以及右下角的hetmap_br,这个heatmap维度为(batch,128,128,80)其中80是类别数。在制作数据集的时候,将数据也同样制作成了(batch,128,128,80)。以左上角为例,我们每一类都有一个(128,128)的矩阵与之对应。输入网络一张图片,我们会得到左上角以及右下角的heatmap,这个heatmap里面又包括了每一类的(128,128)矩阵。
  • 这里再看我们的facal loss函数,if Ycij == 1 可以理解,那么others怎么理解呢?难道others不就是0吗?如果这样的话,我们的facal loss不就是交叉熵了吗?当然不是这样。我们看论文作者的解释。
  • if Ycij == 1的时候,也就是这个物体是neg样本,预测值越接近于1那么损失函数越小,惩罚越小,预测值越接近于0,说明预测误差越大,损失越大,惩罚越大,其中α是来控制样本难易分类的参数,这里为α=2.
  • others 对于一般的算法来说,损失函数的设计others也就是Ycij==0,也就是制作数据集的时候,(batch,128,128,80)中针对80那个维度来说,每一个维度下只有一个值为1,而这里每个维度下以1为中心,计算了这个中心点的高斯分布。也就是(128,128)这个矩阵中,之前只有一个为1,经高斯分布变化后,转换为一个矩阵,越接近于中心点,越接近于1,越远离中心的,越接近于0。这里我们怎么理解高斯分布变化,以及为什么要进行这样的变化呢?看图
  • 在这里插入图片描述
  • 这个图中红色框为真实的目标框,也就是我们数据集中的bboxes坐标,而由图中可以看到,其实我们用绿色框标出来的,也是符合我们检测标准的,也就是绿色框的角点,也可以近似的认为是真实的坐标。这个也就是引入高斯分布的原因。在这里不仅仅固定一个点来对损失进行惩罚,而是规定一个范围来进行惩罚。那么这个范围我们大概了解了,就是以真实的角点为中心为1,往边上辐射值逐渐变小。但是怎么变化呢?也就是在这里高斯分布怎么变化呢?圆圈内的点的数值是以圆心往外呈二维的高斯分布exp(-(x2+y2)/2σ^2),σ=1/3设置的这里x,y为以真实坐标为原点新建坐标系,旁边的坐标输入得出的就是高斯分布后的值。
  • 我们的facal 损失基本完成,那么最后我们从训练好的模型中输出heatmap,那么从这个heatmap可以decode出什么信息呢?这里说一下,1.每个点的score,2.坐标x,y3.类别class。其实我们所有的信息都是从heatmap中得到的,至于其他俩个,embeeding和offset都是辅助decode的,后面会进行专门解释

  • 现在开始,解释第二个损失,embeeding损失。损失函数见上述图片,这里其实刚开始的时候困惑了很久,以之前的经验来说embedding一般是一个一维数组,但是看了网络的输出发现,tag_tl和tag_br的输出维度为(batch,128,128),what ****? 这里先说下自己刚开始的理解,首先根据论文,每一个点对应一个embedding,我们分为左上,和右下,也就是说,以左上为例,我们每个点应该由一个一维数组的embedding,然后使用左上,和右下的embedding来分别计算每个点在左上和右下的dist,但是细拔了论文代码发现,自己too yang too sample!这里真正的实现,直接使用每个点对应的值,也就是经过cornerpooling后生成了(batch,128,128)每个坐标点就是一个值,例如,左上的(2,3)点为4.5,右下的(2,3)点为4.3,这个embedding就是一个数值来表示。

  • 现在理清了embedding的维度概念,那么如图所示的embedding损失也就很简单来实现了。


最后还有一个损失角offset损失。损失函数如图
在这里插入图片描述

-首先解释下label,也就是我们数据集中怎么体现的offset。offset从字面上可以很好的理解,就是偏差。这里我们的最终目标就是找到角点的坐标,所有也就很明确offset就是角点的偏差,那么这个偏差是怎么形成的呢?因为在网络的设计中,输入数据的维度为(batch,512,512,3)而输出为(batch,128,128,256)(cornernet之后,heatmap,offset,embedding卷积(之所以卷积是为了分别生成相应维度的数据)之前)。可以看到图片由512变为了128,我们在运算中,降维的ratio=512/128,那么每个坐标对应的值都要乘以这个ratio,因为是坐标需要int()。说白了就是在转换坐标大小的时候,会因为计算四舍五入一些值,而这些值导致最终会形成偏差。也就是论文里面说的在取整时丢失的精度信息。为什么要这么苛刻呢?因为在检测一些小物体的时候,一点小偏差会很容易导致预测错误。导致预测的准确率降低。这类offsets网络的输出为(batch,128,2)

  • 这里解释下为什么要使用SmoothL1Loss
  • 原因:当预测框与真实框差别过大时,梯度不至于太大
  • 当预测框与真实框差别过小时,梯度值足够小
    在这里插入图片描述
    上图为L1,L2和smoothL1损失函数
    其导数为
    在这里插入图片描述
    这里l1损失l2损失和l1正则,l2正则可不是一回事儿!
    对于公式4来说,梯度的值与w成线性关系,当x越大的时候,梯度越大,导致参数更新时训练不稳定。
    对于公式5来说,再训练后期,当x在0附近波动时,会出现导数一下是1,一下是-1的情况,
    所以结合L1,L2损失的优缺点,提出了smoothL1损失。参考文章https://www.zhihu.com/question/58200555?sort=created
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值