YOLO: Real-Time Object Detection解读

2024-06-20 19:32

本文主要是介绍YOLO: Real-Time Object Detection解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

YOLO不同于RCNN系列分为region proposal和classification,YOLO是直接输出box位置和box所属的类别,整张图都是网络的输入,是个回归问题。


YOLO的主要特点:

  • 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
  • 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
  • 泛化能力强。在自然图像上训练好的结果在艺术作品中的依然具有很好的效果。

这里写图片描述
YOLO的主要思想就是把一副图片分成7x7的网格,如果某个物体中心落在网格中,这个网格就负责这个物体,在最后一层会输出一个7x7x((4+1)x2+20)维度,每个1x1 x((4+1)x2+20)代表原图中的7x7中的一个,其中4表示坐标,1表示得分,x2表示预测两个box,20表示20个类别。(4+1)的意思是每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:

confidence=这里写图片描述
其中如果有ground true box落在一个格子里,第一项取1,否则取0。第二项是预测的bounding box和实际的ground truth box之间的IOU值。即:每个bounding box要预测 ,共5个值,2个bounding box共10个值,对应 1*1*30维度特征中的前10个。大致流程如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
NMS算法(非极大值抑制),主要的作用就是来抑制冗余的框,大致过程是迭代-遍历-消除。
1、 将所有的框按得分排序,选中最高分及其对应的框;
2、 遍历余下的框,如果和当前框(得分最高)的IOU大于某个阈值,便将框删除;
3、 从未处理的框中选中一个得分最高的,重复上述步骤
Yolo中的nms执行步骤大致如下:
这里写图片描述
这里写图片描述


训练策略:

该论文的训练策略,总体给人的感觉:比较复杂,技巧性比较强。可以看得出作者为了提升性能花了不少功夫。

  • 首先利用 ImageNet 的数据集 Pretrain 卷积层。使用上述网络中的前 20 个卷积层,外加一个全连接层,作为
    Pretrain 的网络,训练大约一周的时间,使得在 ImageNet 2012 的验证数据集 Top-5 的准确度达到
    88%,这个结果跟 GoogleNet 的效果相当。
  • 将 Pretrain 的结果应用到 Detection 中,将剩下的 4 个卷积层及 2 个全连接成加入到 Pretrain
    的网络中。同时为了获取更精细化的结果,将输入图像的分辨率由 224*224 提升到 448*448。
  • 将所有的预测结果都归一化到 0~1, 使用 Leaky RELU 作为激活函数。
  • 对比 localization error 和 classification error,加大 localization 的权重
  • 在 Pascal VOC 2007 和 2012 上训练 135 个 epochs, Batchsize 设置为 64, Momentum
    为 0.9, Decay 为 0.0005.
  • 在第一个 epoch 中 学习率是逐渐从10−3增大到10−2,然后保持学习率为10−2,一直训练到 75个
    epochs,然后学习率为10−3训练 30 个 epochs,最后 学习率为10−4训练 30 个 epochs。
  • 为了防止过拟合,在第一个全连接层后面接了一个ratio=0.5的 Dropout
    层。并且对原始图像做了一些随机采样和缩放,甚至对调节图像的在 HSV 空间的饱和度。

损失函数:

采用sum-squared error loss,做如下调整:
1、 更重视8维坐标的预测,乘以更大的loss weight,在VOC中取λcoord = 5;
2、 对于没有object的box的confidence loss,赋予更小的loss weight,在VOC中取λnoobj = 0.5
3、 对于有object的box的confidence loss和class loss的loss weight 取1。
4、 训练过程中,小的 Box 对位置回归错误比大的 Box 更加敏感,由于w和h都已经归一化到 0~1,之间,作者使用了一个 trick,不是直接使用w和h,而是使用它们的平方根,这样使得,w和h在较小时,相应的√w和√h会大一点。
这里写图片描述
5、 一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)(参考:参考链接)
在方程中S取7
这里写图片描述
这里写图片描述


缺陷:

  • 每个格子只预测一个类别的box,而且最后只取置信度最大的box,这就导致了如果多个不同物体(或者同类物体的不同实体)的中心在同一个网格找那个,会造成漏检(对挨着的物体和小物体检测效果不好);
  • 预测的 Box 对于尺度的变化比较敏感,在尺度上的泛化能力比较差;

本文很多都是参考:
http://blog.csdn.net/surgewong/article/details/51864859
图片来源: 可能需要翻墙
本文链接:http://blog.csdn.net/u011956147/article/details/73013106

这篇关于YOLO: Real-Time Object Detection解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079052

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Jupyter notebook安装步骤解读

《Jupyternotebook安装步骤解读》:本文主要介绍Jupyternotebook安装步骤,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、开始安装二、更改打开文件位置和快捷启动方式总结在安装Jupyter notebook 之前,确认您已安装pytho

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri