草庐IT

【深度学习】YOLOv1论文精读

shaoxx333 2023-03-28 原文

原论文链接:https://gitee.com/shaoxuxu/DeepLearning_PaperNotes/blob/master/YOLOv1.pdf

笔记版论文链接:https://gitee.com/shaoxuxu/DeepLearning_PaperNotes/blob/master/YOLOv1-PaperNotes.pdf

你只需要看一次:统一的、实时的目标检测

1. 简介

(1)主要作者简介: 

    Joseph Redmon:YOLOv1、YOLOv2、YOLOv3、DarkNet深度学习框架。

    Ross Girshick:人称RGB大神,主要论文有DPM、R-CNN、Fast R-CNN、Faster R-CNN、FPN、Mask R-CNN、RetinaNet、YOLOv1等。

    Ali Farhadi:Joseph Redmon在华盛顿大学的导师。

(2)YOLOv1特点:

    R-CNN、SPP-Net、Fast R-CNN,Faster R-CNN等都是two-stage目标检测器,即第一阶段生成潜在候选框(Region Proposal);第二阶段用CNN分类器逐一筛选每个候选框。这类网络虽然准确性较好,但速度太慢,很难达到实时检测(>30FPS)的需求。而YOLO属于one-stage(单阶段)目标检测器,可以直接端对端的优化检测性能,通常输入图像只需要经过一次前向预测就可回归得到类别和定位信息,且速度极快,能够很好地实现实时的目标检测(YOLO实时最准、Fast YOLO实时最快)。

2. 论文思想

2.1 算法流程

 (1)将原图划分为S*S网格(grid cell);

 (2)物体的中心点(也即Ground Truth人工标记框的中心点)落到哪个grid cell里, 就由该grid cell负责检测这个物体,且检测这个物体的bounding box由该grid cell生成;

 (3)每个grid cell预测B个bounding box(每个bounding box由5个参数组成:4个坐标(x, y, w, h)和一个置信度confidence);

        x, y 是bounding box中心点相对于所在grid cell左上角格点的坐标;

        w, h 是bounding box相对于整幅图像的宽和高;

        bounding box的confidence score定义如下:

  • Pr(Object):bounding box是否包含物体,包含为1不包含为0;
  • IOU:Intersection Over Union,是指bounding box与ground truth的交并比,也就是预测框和真实标记框的交并比。
  • 其乘积就是confidence score的标签值,对于负责预测的bounding box,Pr=1,这个标签值就相当于IOU。
  • 注意上述的步骤是训练阶段,而在预测阶段是直接回归得到confidence,不需要计算Pr和IOU,而是隐式地包含了两者。

 (4)B个bounding box中与Ground Truth框的IOU最大的bounding box负责检测这个物体;

 (5)每个grid cell预测C个条件类别概率:Pr(Classi|Object) ,C表示目标检测的类别数,Pr(Classi|Object) 表示确认grid cell内有物体的前提下该物体是某类别的概率;

        最终每个bounding box分类的confidence就是上述的Pr(Classi|Object)与(3)中bounding box置信度预测的乘积:

         上式代表每个bounding box中第i个类别的概率,包含物体的分类精度和定位精度。

 (6)训练阶段,就是不断迭代上述步骤,通过监督学习使得损失函数最小化的过程;而预测阶段,输入448*448*3的图像,只需经过一次神经网络,即可输出7*7*30的张量(包含定位和分类信息)。

2.2 网络结构

    该网络模型由24个卷积层+2个全连接层构成。输入448*448*3的图像,输出7*7*30的张量。网络中的1*1卷积层,出自Network in network(NiN),在这里的作用是降维,减少权重个数和计算量。 

Tips:CNN小知识补充

    预训练:使用大型数据集预先训练模型的过程。常用预训练模型有VGG16/19、ResNet50等。

    微调:将预训练过的模型作用于自己的数据集,并使参数适应自己数据集的过程。

    卷积神经网络的核心是:

    (1)浅层卷积层提取基础特征,比如边缘、轮廓等;

    (2)深层卷积层提取抽象特征,比如整个脸型;

    (3)全连接层根据特征组合进行评分分类。

    预训练模型的特点就是:用大型数据集做训练,已经具备了提取浅层基础特征和深层抽象特征的能力

2.3 预训练分类网络

    在ImageNet 1000-class competition dataset上预训练了一个分类器,预训练网络使用图中前20个卷积 + 1个GAP(Global Average Pooling) + 1个全连接层,网络输入为224*224大小。

2.4 训练检测网络

 (1)由于检测需要细粒度的图像信息,所以网络输入由预训练的224*224改为448*448;

 (2)任少卿等人提出在预训练网络上增加卷积层和全连接层能够提升性能,所以训练网络改为上图所示:24个卷积层 + 2个全连接层;

 (3)检测框的位置信息(x, y, w, h)都做了归一化处理; 

        x, y 是bounding box中心点相对于所在grid cell左上角格点的坐标;

        w, h 是相对于整幅图像的宽和高。

 (4)使用Leaky ReLU非线性激活函数;

        θ(x) = x,      x>0

        θ(x) = 0.1x, otherwise

 (5)使用sum-squared error损失函数;

 (6)训练过程中采用变化的学习率;

        最初的epoch,慢慢从10e-3升到10e-2(一上来就10e-2容易造成发散);

        紧接着75个epoch,学习率设为10e-2;

        再接下来30个epoch,学习率降为10e-3;

        最后30个epoch,学习率将为10e-4。

 (7)为了避免过拟合,使用dropout和数据增强,数据增强包括:随机缩放,20%全图大小的平移,调整HSV色彩空间。

2.5 损失函数(L2 Loss)

损失函数分五部分,第1、2项为坐标回归误差;第3、4项为Confidence(置信度)回归误差;第5项为类别预测误差,即分类误差。

 (1)负责检测物体的bbox中心定位误差

 

    此处λcoord 取值为5,而(4)中λnoobj 取值为0.5,之所以如此设定,是因为图像中有很多grid cell是不包含物体的,这些grid cell中bbox的置信度都为0,这通常会压制或者说弱化那些含有包含物体的grid cell的梯度,导致模型不稳定,造成训练过早发散。所以设定λcoord = 5,λnoobj = 0.5,相当于加强bbox坐标预测损失(也就是定位误差),削弱不包含物体的bbox的置信度损失。

 (2)负责检测物体的bbox宽高定位误差

 

    式中,使用宽和高的平方根来代替宽和高,是因为在小框里边小的偏差比在大框里边影响更大,如下图示:

     

 (3)负责检测物体的bbox的confidence误差

 

 (4)不负责检测物体的bbox的confidence误差

 

 (5)负责检测物体的grid cell的分类误差

3. YOLOv1的缺陷

 (1)小目标检测差强人意,由于空间的约束导致可预测的目标数量受限,每个grid cell只能预测一个目标,整幅图像最多预测7*7=49个目标;

 (2)很难泛化到新的或不常见纵横比或形状的目标;

 (3)预测框使用了相对较粗粒度的特征(由于存在很多下采样层),这导致其定位误差较高;

 (4)小框里的小的误差比在大框里的影响更大。(这个在损失函数的第二项中有相应的优化措施,即用宽高的平方根来代替宽高。个人猜测可能并没有达到预期效果)

4. 其他一些检测器的特点

  • DPM(Deformable parts models)

        传统特征HOG、传统分类器SVM、滑动窗口方法、弹簧模型:子模型+主模型。

  • R-CNN 使用region proposals代替sliding window apporoach

        选择性搜索(Selective Search)生成潜在边界框、卷积网络提取特征、SVM打分、线性模型调整边界框、NMS非最大值抑制剔除重复检测框。

  • Fast R-CNN

        相比于R-CNN,做了以下几点改进

        (1)卷积不再是对每个Region Proposal进行,而是直接对整张图像,相当于共享计算;

        (2)用ROI Pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能把Region Proposal作为输入;

(3)用SoftMax代替原来的SVM分类器。

  • Faster R-CNN

        核心改进是使用RPNRegion Propose Network)提取区域,代替Selective Search,极大的提升了检测框的生成速度。

         RPN模块主要执行的流程为输入Faster R-CNN的公共Feature Map,生成Anchors,通过SoftMax分类器提取Positive Anchors;最后Proposal Layer负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除重叠和超出边界的proposals。

  • Deep MultiBox

        使用卷积神经网路代替Selective Search来预测ROI;但无法进行通用目标检测。

  • OverFeat

        使用卷积神经网路定位(高效实现了滑窗);但是其优化的是定位而非检测性能,且是基于局部来预测的,无法推理全局背景。

  • MultiGrasp

        提出regression方法来预测抓取物体,但它只是一个更简单的目标检测任务,只需要预测目标的区域,而不需要预测目标的大小、位置、边界信息以及类别。

5. 论文精读笔记

    可以点击链接下载高清原版笔记pdf,论文重点、专有名词解释、公式推导、复杂单词释义等都有清晰的标注。

参考资料

1、b站子豪兄YOLOv1论文精度(讲的特别清晰,建议一看)

2、模型微调fine-tune

3、一文详解R-CNN、Fast R-CNN、Faster R-CNN

4、读论文:YOLO

有关【深度学习】YOLOv1论文精读的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  8. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby Hash 包括另一个哈希,深度检查 - 2

    进行这种深度检查的最佳方法是什么:{:a=>1,:b=>{:c=>2,:f=>3,:d=>4}}.include?({:b=>{:c=>2,:f=>3}})#=>true谢谢 最佳答案 我想我从那个例子中明白了你的意思(不知何故)。我们检查子哈希中的每个键是否在超哈希中,然后检查这些键的对应值是否以某种方式匹配:如果值是哈希,则执行另一次深度检查,否则,检查值是否相等:classHashdefdeep_include?(sub_hash)sub_hash.keys.all?do|key|self.has_key?(key)&&ifs

随机推荐