经过一段时间的代码解读和反复试验,加上与各位网友的交流,写下一点个人理解,希望对大家有所帮助。

yolo3算法属于one-stage算法,主要体现在,可以直接输出框和类型,这一点和faster-rcnn不一样。在faster-rcnn中,会先进行rpn网络进行proposal的提取,得到roi,随后再与特征图进行roi-pooling,得出结果。而yolo3直接由输入图片和kmean预先设定尺寸的锚框anchor进行预测,直接得出结果,不同于faster-rcnn的two-stage。

yolo3的算法主体框架是darknet53,在yolo2的darknet19上进行了改进,为了解决darknet53层数增加可能带来的梯度消失,借鉴了resnet的残差块,使用了short-cut,网络层数的增加提高了yolo的检测性能。同时,为了提高对小目标的召回率(recall),darknet53借鉴了类似fpn网络的上采样,将更上层的上采样信息与网络更浅层的特征信息进行concat,而不仅仅是采用最后一层的卷积结果进行预测。这就是yolo3的三种尺度。yolo3的三种大小的特征图分别为13×13,26×26,52×52,特征图越大代表着检测小物体的能力更强。
下图是yolo3的骨架网络示意:

对于416×416的输入来说,13×13的特征图代表着32个像素经过网络后变成1个像素,也代表着,特征图的1个像素意味着输入原图的32个像素点,这样也就不难理解,为什么是13×13检测大的目标,而52×52是检测更小的目标(52代表着8个像素变成1个像素)。这里可能有人会有疑问,为什么不直接使用52×52的,既然可以检测小的目标,大的目标也应该更好检测。这里我的个人理解是,52×52代表着最后进行grid分割时会分割成52×52个cell,同时每个cell又有K个预设的anchor,这样极大的增加了计算成本,同时对于小目标的召回率提升了,但是在检测大目标时会进行更多重复性的计算。所以在作者发现Kmeans算法在k等于9时,avgIOU已经较优,当k继续增大时,avgIOU变换并不明显。所以作者使用了三种尺度9个预设尺寸的anchor来进行检测。

这是作者在voc训练集上得到的九种尺度的anchor分别按照大小分配给大中小三种尺度的特征图,也正好印证了大的特征图检测小的目标,而小的特征图检测大的目标。借鉴FPN网络这种做法,极大的改善了yolo之前对小目标检测漏检的问题。

同时需要注意的是,yolo3对于目标框的坐标和高宽,采用的是相对值,即相对于预设anchor的值,利用回归来训练这个相对值。对于目标存在多个框进行重复框选时,使用NMS(非极大值抑制)来筛选最优的。以13×13的特征图作为例子,若某个物体的中心落在一个grid cell中,则该cell负责检测该目标,使用预设的三种尺度的anchor,挑选与groundtruth IOU最大的anchor进行训练,使其与groundtruth的差别尽量小,这样训练就得到了一组相对值,经过多张图片多个目标进行反复的训练,使得模型能够得出正确的相对值预测,这样在后续的预测中就根据这个相对值来进行bbox的坐标和高宽的调整。
下图的红色框代表着负责检测的cell,黄色框代表着ground truth,而蓝色框则代表着三种尺寸的ahchor,最终我们要预测的是anchor与ground truth之间的相对值,并使预测值尽可能接近真值。

对于yolo3的损失函数,网上有诸多说法,根据Keras版本源码我个人理解为:

xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[...,0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh-raw_pred[...,2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \(1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)

坐标xy采用的二分类交叉熵损失,因为坐标xy的预测实际进行了归一化,是一个相对值。
而宽高wh则采用的差方和,等于1/2*(真值-预测的值)^2。这里使用1/2只是为了方便求导时约掉系数。

这里值得一提的是box_loss_scale 这个值,它等于2-目标面积,这个值是用于平衡大小目标之间的损失不均的问题,因为小目标在wh和xy的损失和大目标在wh和xy的损失不相同,大的目标的检测框的预测相对偏移值由于和大的anchor相比,所以相对值较小,但是小目标和小的anchor相比,所以小目标对于坐标和高宽的精确程度更加严格,所以采用box_loss_scale 来加重其损失权重。

置信度损失也采用的二分类交叉熵损失,代表着有无。
分类损失则只计算了有目标的损失,不计算无目标的框的损失。

在训练中,也有一些个人的心得,训练样本不能过少,且种类尽量不要相差太大,若发现检测重叠框较多,则须考虑iou 和score的阈值设定问题,若损失loss下降难以收敛,可以尝试加大batchsize的尺寸,同时尝试减小learning rate,最后希望大家在训练算法时,不出bug,loss收敛理想。以上时笔者参看了许多博文,与网友进行了交流,同时结合自己的一点实际所写,若对你理解算法有所帮助,不胜荣幸。

YOLO3算法个人算法理解心得相关推荐

  1. 重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性

    重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性摘要:我们评估了对抗性Logit Pairing的稳健性,这是最近针对广告范例提出的防御措施. 我们发现,使用Adversarial Lo ...

  2. [react] 说说你对React的reconciliation(一致化算法)的理解

    [react] 说说你对React的reconciliation(一致化算法)的理解 就是启发式Diff算法 ,时间复杂度从N的三次方下降到N ,通过博客途径了解到实现的策略是 tree diff , ...

  3. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  4. 协同过滤算法的简单理解《推荐系统实践》

    协同过滤算法的简单理解 本文主要是讲解一下<推荐系统实践>中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解. UserCF(基于用户的协同过滤算法) 这种推荐算法的出发 ...

  5. Mean-shift算法的直观理解

    Mean-shift算法的直观理解 0 前言 暑假的时候参加移动计算竞赛打了下酱油,接触到了Mean-shift算法,用于做目标跟踪.在那段时间也在网上查阅了不少关于这个算法的资料,可是总感觉它们都比 ...

  6. 工作6年,谈谈我对“算法岗”的理解

    文 | Severus 编 | 小轶 写在前面:本文完全基于我个人的工作经验,没有经过任何形式的行业调研,所以我的理解也有相当浓厚的个人印记,可以认作一家之言.如果能对读者朋友们起到任何帮助,都是我的 ...

  7. 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议

    国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...

  8. Hamiltonian Monte Carlo抽样算法的初步理解

    Hamiltonian Monte Carlo抽样算法的初步理解 接受拒绝采样算法 MCMC回顾 Hamiltonian dynamics 拉格朗日方程 从牛顿方程出发推导拉格朗日方程 勒让德变换 哈 ...

  9. Interview之AI:人工智能领域岗位求职面试—人工智能算法工程师知识框架及课程大纲(AI基础之数学基础/数据结构与算法/编程学习基础、ML算法简介、DL算法简介)来理解技术交互流程

    Interview之AI:人工智能领域岗位求职面试-人工智能算法工程师知识框架及课程大纲(AI基础之数学基础/数据结构与算法/编程学习基础.ML算法简介.DL算法简介)来理解技术交互流程 目录 一.A ...

  10. SIFT算法的个人理解

    SIFT算法的个人理解--理论篇 1. 前言 本人目前共使用过两个版本的sift算法: (1)Matlab中的sift算法,可以从http://www.cs.ubc.ca/~lowe/keypoint ...

最新文章

  1. Codeforces Gym 100650B Countdown (离线)
  2. action support分析
  3. python安装离线包window_python 离线安装unrar库
  4. SQL server 数据导入导出BCP工具使用详解
  5. App 版本更新 versionUpdate
  6. 浅析:通过自定义DSL实现一个序列号生成器
  7. 基于Springboot+websocket的web聊天项目(论文+程序设计源码+数据库文件)
  8. 数学建模灵敏度分析是什么?为什么获奖论文基本都有!【科研交流】
  9. S50VB100-ASEMI电机专用整流桥S50VB100
  10. 第三方支付对接-支付宝支付接入教程
  11. 【安全热点】阿里巴巴月饼门,观点两极化,孰对孰错?
  12. 《520婚恋报告》 20%的人婚后都无比后悔
  13. taskmgr跟着敲
  14. 雷蛇鼠标:单机偶尔变成双击
  15. mysql 存储过程 if !=_mysql 存储过程 if !=
  16. 无限火力跳跳机器人_2021LOL无限火力机器人最强出装和天赋介绍
  17. Paper Reading - 基础系列 - 常用评价指标 ROC、PR、mAP
  18. 202011 网络是通的,数据发不过去(接受不到)
  19. 想让你看的评论:我还是很喜欢你
  20. verilog study-初级

热门文章

  1. 计算机能力测试在线题库,全国计算机应用能力考试题库及答案2017
  2. 一款超好用的企业级URL采集软件(Msray-plus)
  3. webstrom使用es6语法报错
  4. 饥荒正版怎么创建专用服务器,饥荒联机版如何创建本地服务器 创建本地服务器步骤...
  5. gis 数据框裁剪_【更新80篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  6. 输入某班C语言考试成绩,人数未知,用-1作为结束标志,若大于100分,则重新输入,计算全班的最高分、最低分与平均分
  7. 软件无线电波测试软件,SDR软件无线电的测量
  8. IT牛人---3IE工程师的传奇
  9. 教务管理系统的设计与实践
  10. 实验六 教务管理数据库的设计