对于Loss函数的设计,我现在是越来越感觉到比模型搭建更难,虽然在理论上,就是几个loss函数的计算,比如交叉熵啥的,理论看起来很简单,但是对于ssd,yolo这些,真正要设计出来loss的计算,里面的细节太多也太杂了,让我很头大,但是没法,只能硬着头皮啃呗, 其实在现在这个时候,也就是我敲字的时候,我对于整个loss函数也只能说懂了百分之八十,还有一些细节,我依旧还是比较模糊,这也是写这篇文章的目的,在梳理我自己的思路的同时,也希望能帮到大家,开题先感谢一下,大家有兴趣或者看我的有些不明白,可以转向上面这个链接,我的整个思路的梳理,这个作者对我帮助很大,我也只是站在他的肩膀上写出我对整个loss的理解。
在上一篇文章中,我们知道整个网络最后搭建出来的模型最后的输出数据维度是类似[2, 38, 38, 84]这种,不是很清楚的可以看看上篇文章我们先看看整个流程图:
我们先看看第一步,第一步的原理如下:
好了,第一步我们完成了,这一步最后输出的维度是[8732, 4],接下来我们开始进行第二步,在这一步中,我们得设计到一个解码的操作,这里得解码,是指的真实的标签框和先验框共同处理,得到一个转化的关系,原理如下图:
处理上面这个encode,我们还得设计一个函数来求解iou,所谓的Iou就是针对两个边框而言的,iou就是两个边框重合部分占总面积的比例,原理如下:
知道这两个基本函数之后,我们就可以进行接下来的处理了,对先验框和标签框进行处理。需要注意的如下:
要注意,一个标签框可以对应多个box,但是一个box只能对应一个标签框
经过以上处理之后,我们就可以开始干第三步了,这一步,原理看图:
好了,以上原理的截图,均是我在最上面给的链接的作者的,那作者写的实在是太好了,关于原理部分我实在找不到补充了,只能在代码里面尽量为大家多注释一些,多写一点我的理解,希望能帮到各位。代码有些多,需要耐心的去看,没办法,我也是搞了好久才大致的将整个过程清楚了,没有什么简单的捷径方法,光是看看原理就简单,但是真实要代码复现出来,很复杂,里面很多细节。感谢能看到最后的朋友的支持,我相信,大多数看见这么多代码,会直接退出去,正常正常,因为我也这样,不到不得已,也不愿意看其他人写的代码,更不要说一行一行代码去理解了。
numpy中argsort函数用法,有需要的朋友可以参考下。
另一种方式实现按降序排序: