当前位置: 首页 > 编程日记 > 正文

【目标检测】yolo系列:从yolov1到yolov5之YOLOv3详解及复现

在v1、v2的原理和技巧介绍之后,v3除了网络结构,其余的改变并不多。本文着重描述yolov3的原理细节。

相关阅读:
论文:YOLOv3: An Incremental Improvement
源码:https://github.com/ultralytics/yolov3

1. Yolov3网络结构

1.1 backbone:Darknet-53

Yolov3使用Darknet-53作为整个网络的分类骨干部分。backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的跨层加和操作
在这里插入图片描述

1.2 网络结构解析

借鉴Yolo三部曲解读——Yolov3

主要结构

Yolov3是一个全卷积网络,只有卷积层,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,通过调节卷积步长控制输出特征图的尺寸,即用conv的stride来实现降采样。所以对于输入图片尺寸没有特别限制。

下图流程图中,输入图片以256✖️256✖️3作为样例。
在这里插入图片描述

思想

Yolov3借鉴了金字塔特征图思想,小尺寸特征图用于检测大尺寸物体,而大尺寸特征图检测小尺寸物体。特征图的输出维度为N✖️N✖️[3✖️(4+1+80)] ,N✖️N为输出特征图格点数,一共3个Anchor框,每个框有4维预测框数值txt_xtx, tyt_yty, twt_wtw, tht_hth,1维预测框置信度,80维物体类别数。所以第一层特征图的输出维度为8✖️8✖️255。

输出

Yolov3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下采样8倍。输入图像经过Darknet-53(无全连接层),再经过Yoloblock生成的特征图被当作两用,第一用为经过33卷积层、11卷积之后生成特征图一第二用为经过1*1卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的循环之后产生特征图三。

concat操作

concat操作与加和操作的区别

  • 加和操作来源于ResNet思想,将输入的特征图,与输出特征图对应维度进行相加,即 y = f(x) + x;
  • concat操作源于DenseNet网络的设计思路,将特征图按照通道维度直接进行拼接,例如8✖️8✖️16的特征图与8✖️8✖️16的特征图拼接后生成8✖️8✖️32的特征图。

上采样层

上采样层(upsample):作用是将小尺寸特征图通过插值等方法,生成大尺寸图像。例如使用最近邻插值算法,将88的图像变换为1616。上采样层不改变特征图的通道数。为了加强算法对小目标检测的精确度,YOLOv3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测。

  • 缩小图像(或称为下采样(subsampled),如池化)的主要目的有两个:使得图像符合显示区域的大小;生成对应图像的缩略图。
  • 放大图像(或称为上采样(upSampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。

总结:Yolo的整个网络,吸取了Resnet、Densenet、FPN的精髓,可以说是融合了目标检测当前业界最有效的全部技巧。

2. Yolo输出特征图解码(前向过程)

根据不同的输入尺寸,会得到不同大小的输出特征图,以上图为例,输入图片256 × 256 × 3为例,输出的特征图为8 × 8 × 255、16 × 16 × 255、32 × 32 × 255。在Yolov3的设计中,每个特征图的每个格子中,都配置3个不同的先验框,所以最后三个特征图,这里暂且reshape为8 × 8 × 3 × 85、16 × 16 × 3 × 85、32 × 32 × 3 × 85,这样更容易理解,在代码中也是reshape成这样之后更容易操作。

三张特征图就是整个Yolo输出的检测结果,检测框位置(4维)、检测置信度(1维)、类别(80维)都在其中,加起来正好是85维。特征图最后的维度85,代表的就是这些信息,而特征图其他维度N × N × 3,N × N代表了检测框的参考位置信息,3是3个不同尺度的先验框。下面详细描述怎么将检测信息解码出来:

先验框

在Yolov1中,网络直接回归检测框的宽、高,这样效果有限。所以在Yolov2中,改为了回归基于先验框的变化值,这样网络的学习难度降低,整体精度提升不小。
Yolov3沿用了Yolov2中关于先验框的技巧,并且使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框,作为先验框。在COCO数据集中(原始图片全部resize为416 × 416),九个框分别是 (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) ,顺序为w × h。

注:先验框只与检测框的w、h有关,与x、y无关。

检测框解码

有了先验框与输出特征图,就可以解码检测框 x,y,w,h。
bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethb_x = \sigma(t_x) + c_x \\ b_y = \sigma(t_y) + c_y \\ b_w = {p_w}e^{t_w} \\ b_h = {p_h}e^{t_h} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
如下图所示, σ(tx),σ(ty)\sigma(t_x), \sigma(t_y)σ(tx),σ(ty) 是通过 Euler integral是基于矩形框中心点左上角格点坐标的偏移量, sigma是激活函数,论文中作者使用sigmoidpw,ph{p_w}, {p_h}pw,ph 是先验框的宽、高,通过上述公式,计算出实际预测框的宽高bw,bh{b_w}, {b_h}bw,bhet{e^t}et为采样率。
在这里插入图片描述

置信度

置信度在输出85维中占固定一位,由sigmoid函数解码即可,解码之后数值区间在[0,1]中。

类别解码

COCO数据集有80个类别,所以类别数在85维输出中占了80维,每一维独立代表一个类别的置信度。使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。

三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:

  • 训练时:4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算。
  • 推理时:选取一个置信度阈值,取出每一类得分大于一定阈值的框和得分进行排序,过滤掉低阈值box,利用框的位置和得分进行经过NMS(非极大值抑制),最后可以得出概率最大的边界框,也就是整个网络的预测结果了。

3. 训练策略与损失函数(反向过程)

训练策略

预测框一共分为三种情况:正例(positive)、负例(negative)、忽略样例(ignore)

  • 正例:任取一个ground truth,与4032个框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的4031个检测框中,寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 [公式] );类别标签对应类别为1,其余为0;置信度标签为1。
  • 忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
  • 负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。

损失函数

YOLOv3重要改变之一:No more softmaxing the classes
YOLO v3现在对图像中检测到的对象执行多标签分类

logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。

一些训练策略的解释

1.ground truth为什么不按照中心点分配对应的预测box?

在Yolov3的训练策略中,不再像Yolov1那样,每个cell负责中心落在该cell中的ground truth。原因是Yolov3一共产生3个特征图,3个特征图上的cell,中心是有重合的。训练时,可能最契合的是特征图1的第3个box,但是推理的时候特征图2的第1个box置信度最高。所以Yolov3的训练,不再按照ground truth中心点,严格分配指定cell,而是根据预测值寻找IOU最大的预测框作为正例。

2.为什么有忽略样例?

忽略样例是Yolov3中的点睛之笔。由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分。比如有一个真实物体,在训练时被分配到的检测框是特征图1的第三个box,IOU达0.98,此时恰好特征图2的第一个box与该ground truth的IOU达0.95,也检测到了该ground truth,如果此时给其置信度强行打0的标签,网络学习效果会不理想.

参考文章:https://zhuanlan.zhihu.com/p/76802514

相关文章:

CSS之布局(盒子模型—边框)

盒子模型—边框&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子模型-边框</title><style>.box1{width: 200px;height: 200px;background-color: #bfa;/*border-width可以用来指定四个方向的…

SAP事务码f-02做账界面显示“页数”字段

事务码 f-02 做账界面&#xff0c;没有显示页数。 用户账号的参数添加 CSF &#xff08;Country-Specific Fields&#xff09;参数&#xff0c;参数值为 CN&#xff08;伟大的China&#xff09; 再次来到 f-02 的界面&#xff0c;显示了页数字段

【Leetcode】刷题之路4(python版)

接上章回溯专题&#xff0c;本章挑选了分割问题、子集问题、排列问题。 分割问题 131.分割回文串93.复原IP地址 子集问题 78.子集90.子集II 排列问题 46.全排列47.全排列II 分割问题 我们来分析一下切割&#xff0c;其实切割问题类似组合问题。 例如对于字符串abcdef&#…

织梦文章内容屏蔽替换词语多个敏感字词

后台-系统-基本参数-互动设置-替换词语&#xff0c;这个是用于评论和会员投稿&#xff0c;网站后台添加的文章是不受制于这里的&#xff0c;我们可以直接在模板标签里runphp字符串替换 文章内容页标签写法 {dede:field.body runphpyes} global $cfg_replacestr; me preg_repla…

CSS之布局(盒子模型--内边距)

盒子模型--内边距&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子模型--内边距</title><style>.box1{width: 200px;height: 200px;background-color: #bfa;border: solid 10px orange;/*内边…

网络管理员比赛回顾04-DHCP

目录 一、DHCP的配置 二、DHCP中继 2021年9月参加青年网络管理员比赛&#xff0c;因为网管超龄不能按照“青年”参赛&#xff0c;临时培训我们这批“青年”参赛&#xff0c;回顾一下经过以及学到的技能。本节回顾DHCP。 一、DHCP的配置 简单的启用一个DHCP功能。 <Huawe…

iOS-禁止scrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动...

禁止UIScrollView垂直方向滚动&#xff0c;只允许水平方向滚动 scrollview.contentSize CGSizeMake(你要的长度, 0); 禁止UIScrollView水平方向滚动&#xff0c;只允许垂直方向滚动 scrollview.contentSize CGSizeMake(0, 你要的宽度); 转载于:https://www.cnblogs.com/S…

go1.8之安装配置

说明&#xff1a; 之前学习过go语言&#xff08;大概是0.9版本&#xff09;&#xff0c;后来更新太快&#xff0c;也没怎么使用&#xff0c;就荒废掉了&#xff0c;今年有项目需要用go开发&#xff0c;重新捡起。 这是我在学习go语言过程中整理的内容&#xff0c;这里记录下&am…

栈和队列在python中的实现

栈和队列是两种基本的数据结构&#xff0c;同为容器类型&#xff0c;队列是先进先出&#xff0c;栈是先进后出。 栈 栈提供 push 和 pop 等等接口&#xff0c;所有元素必须符合先进后出规则&#xff0c;所以栈不提供走访功能&#xff0c;也不提供迭代器(iterator)。 不像是set…

CSS之布局(盒子模型--外边距)

盒子模型--外边距&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子模型--外边距</title><style>.box1{width: 200px;height: 200px;background-color: #bfa;border: solid 10px orange;/*外边…

SAP Netweaver 7.4 SR2 Application Java Installation

记录一下SAP Netweaver 7.4 Support Release 2 Application Server Java的安装过程。 一、下载 写本文时&#xff0c;SAP Netweaver 7.4 SR2 已经过了生命周期&#xff0c;直接去SAP Download Center 是找不到这个版本的。但是可以去 Maintenance > Product Availability …

Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

转载请注明出处&#xff1a;http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(九)——MyBatis和Spring整合 使用官方网站的mapper自动生成工具mybatis-generator-core-1.3.2来生成po类和mapper映射文件。 1.什么是…

(一)七种AOP实现方法

在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法。这里最主要的焦点是拦截&#xff0c;因为一旦有了拦截其它的事情都是细节。 Approach 方法 Advantages 优点 Disadvantages 缺点 Remoting Proxies 远程代理 Easy to implement, because of the .Net framewor…

[导入]Java线程的深入探讨

文章来源:http://blog.csdn.net/jeffreyren/archive/2001/03/29/6401.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2001/03/30/816654.html

CSS之布局(盒子的水平布局)

盒子的水平布局&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子的水平布局</title><style>.outer{width: 800px;height: 200px;border: 10px red solid;}.inner{width: 200px;height: 200px…

IssueVission的命令处理

模仿了IssueVission的命令处理&#xff0c;感觉真的很好。只是在用的过程中遇到这样的一个问题&#xff1a;当我有多个MenuItem&#xff08;或其他的控件&#xff09;绑定到同一个Command时&#xff0c;如果因为某些需要删除了其中的一个控件&#xff08;Dispose了&#xff09;…

下一版本Windowsreg; CE 开发工具Smart Device Extensions for Microsoft Visual Studioreg; .NET...

初识 Smart Device Extensions Larry RoofTonked.com 2001年10月23日 上个月我曾说过我会前往 Microsoft 学院&#xff0c;了解下一版本的小型工具的情况。此行的目的是为我不久要撰写的杂志文章和已签约的书籍搜集一些背景知识。但在回来的路上&#xff0c;我改变了我的初衷。…

vue 手机键盘把底部按钮顶上去

背景&#xff1a;在写提交订单页面时候&#xff0c;底部按钮当我点击输入留言信息的时候&#xff0c;底部提交订单按钮被输入法软键盘顶上去遮挡住了。 h5 ios输入框与键盘 兼容性优化实现原理&#xff1a;当页面高度发生变化的时候改变底部button的样式&#xff0c;没点击前bu…

CSS之布局(盒子的垂直布局)

盒子的垂直布局&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>盒子的垂直布局</title><style>.outer{background-color: #BBFFAA;/*默认情况下父元素的高度会被内容撑开*/}.inner{width: 100px…

microsoft 为microbit.org 设计的课程

这文章来至https://www.microbit.co.uk/blocks/lessons &#xff0c;是由microsoft 为microbit.org 设计的课程 Microbit Shop 入门课程 Beautiful Image, 用LEDs&#xff0c;秀美丽的图样Lucky 7, 秀数字在 LED 屏幕上Answering Machine, 使用字符串秀文字讯息Game of Chance…

Java, Mono, or C++?

Thoughts on the future of open source desktop development文章地址: http://ometer.com/desktop-language.html转载于:https://www.cnblogs.com/dudu/archive/2004/08/25/36317.html

CSS之布局(外边距的折叠)

外边距的折叠【重叠】&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>外边距的折叠</title><style>.box1,.box2{width: 200px;height: 200px;}/*垂直外边距的重叠(折叠)-相邻的垂直方向外边距会…

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意&#xff1a;又N个村庄&#xff0c;M条道路。问须要走几次才干将全部的路遍历 解题思路&#xff1a;这题问的是有关欧拉路的判定 欧拉路就是每条边仅仅能走一次&#xff0c;且要遍历全部的边&#xff0c;简单的说就是…

轻松一下,看看vs.net2002变态的智能提示,不知道算不算bug

https://images.cnblogs.com/cnblogs_com/jjstar/2750/r_joke.jpg转载于:https://www.cnblogs.com/jjstar/archive/2004/08/27/36953.html

C++构造函数(一)

本篇是介绍C的构造函数的第一篇&#xff08;共二篇&#xff09;&#xff0c;属于读书笔记&#xff0c;对C进行一个系统的复习。 构造函数的概念和作用 全局变量未初始化时为0&#xff0c;局部变量未初始化时的值却是无法预测的。这是因为&#xff0c;全局变量的初始化是再程序装…

CSS之布局(行内元素的盒模型)

行内元素的盒模型&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>行内元素的盒模型</title><style>.s1{background-color: yellow;/*行内元素的盒模型&#xff1a;-行内元素不支持设置宽度和高度…

es安装的时候遇到的所有的坑

不允许root用户启动。 解决办法&#xff0c;创建子用户。 在linux下需要注意。es默认不能用root用户启动。我们需要新建一个用户来启动。 groupadd es adduser es-user -g 用户组 -p 密码 #新建一个es-user用户 密码可以省略 chown -R es-user:es /usr/local/elk/ …

MD5 - Bump Mapping

使用《mathematics for 3d game programming & computer graphics》中介绍的方法计算tangent basis.需要注意的一点是&#xff0c;在计算tangent basis的时候&#xff0c;最好是采用顶点的法线而非三角形的&#xff0c;否则将会产生非常严重的不平滑过渡。没有开启Bump Map…

『03网络』 实验一:多功能浏览器的使用和个人Blog的创建和使用

实验一&#xff1a;多功能浏览器的使用和个人Blog的创建和使用<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />一、 实验目的1、熟悉各种浏览器的使用和配置&#xff1b;2、创建个人Blog&#xff0c;并加以完善。二、 …

SQL Server 最佳实践分析器使用小结

Best Practices Analyzer Tool for Microsoft SQL Server 2000是Microsoft SQL Server开发团队开发的一个数据库管理工具&#xff0c;可以让你检测设计的数据库是否遵循SQL Server操作和管理的最佳实践准则。这些准则公认有助于提高数据库的性能和效率&#xff0c;并让应用程序…