参考文章:
解析代码:
看了一下两个版本的代码,如上面链接所示,
**简单版,**代码和之前解析的源码类型是一致的,更容易理解些,但是只有预测部分而没有训练部分。虽然能很容易理解,但里面没有标签处理,损失计算等部分。即使看懂了,也有种啥都没学到的感觉。
复杂版,当时看到这个源代码是有点懵的,为啥呢?因为看不懂啊,之前没见过用这种方式写的代码,套路不太一样。反反复复犹犹豫豫了好几次,想着要不要花点精力看复杂版的,也尝试在github上搜了一下看看有没有更合适的版本,结果是并没有,所以就硬着头皮解析这个比较复杂的代码了。前期是先跳过了看不懂的部分,直接去看网络构建部分,anchor生成部分,计算损失部分,数据预处理部分,但是整体运行逻辑还是有点懵。后来看了一点有关TensorFlow的Estimator讲解,稍微有点眉目,但是还不是很了解,有点不知所以然。主要是Estimator的方式不太习惯,如果只把他当作一种框架,你按它固定的格式传入相应的参数就行,还可以接受些。具体的网络搭建,anchor创建,损失计算等和之前还是一样的。
SSD损失函数
相比较YOLOv3,SSD的损失函数相对直观些,这次就不贴手写的了,因为要贴损失计算实现的代码,手写太费事了。
SSD损失函数定义为**位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)**的加权和(实际代码中还会加上l2_loss以防止过拟合):
其中 是先验框的正样本数量。这里
为一个指示参数,当**
时表示第i 个先验框与第j 个ground truth匹配**,并且ground truth的类别为 p 。 c 为类别置信度预测值。
为先验框的所对应边界框的位置预测值,而 g 是ground truth的位置参数。
下面盗一张图再来说明一下:
1,对于位置误差
其采用Smooth L1 loss,定义如下:
由于 的存在,所以位置误差仅针对正样本进行计算。值得注意的是,要先对ground truth的g 进行编码得到
(偏移量),因为预测值
也是编码值,若设置variance_encoded_in_target=True,编码时要加上variance=[0.1, 0.1, 0.2, 0.2]:
上面公式在实际代码中的操作如下(encode_all_anchors()函数中):
gt_cy = (gt_cy - anchor_cy) / anchor_h / self._prior_scaling[0] # [0.1, 0.1, 0.2, 0.2]
gt_cx = (gt_cx - anchor_cx) / anchor_w / self._prior_scaling[1]
gt_h = tf.log(gt_h / anchor_h) / self._prior_scaling[2]
gt_w = tf.log(gt_w / anchor_w) / self._prior_scaling[3]
smooth_l1的公式如下,实际计算中x=g-l,g为ground_truth,l为预测值。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-PwbTRcjz-1712550480437)]