浅析目标检测入门算法:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4

本文致力于让读者对以下这些模型的创新点和设计思想有一个大体的认识,从而知晓YOLOv1到YOLOv4的发展源流和历史演进,进而对目标检测技术有更为宏观和深入的认知。本文讲解的模型包括:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4。

R-CNN

        候选区域

SPP-Net

        和R-CNN最大区别是什么?

                先提取特征,再对候选区域做处理?

Fast R-CNN: 

        并行选择性搜索算法和ConvNet提取特征

        将SPPNet中的金字塔池化替换为RoI池化层

Faster R-CNN

        每个候选框一个分数,就不用手工设计算法来筛选候选框了,用CNN进行候选区域的提取

二阶段目标检测算法 将目标检测作为一个     分类问题  来解决,(S1)一个模块提出一些候选框,(S2)后续的网络将其分类为目标或背景

YOLO将  目标检测问题  重构成一个    回归问题   ,直接将图片中的每个像素分类为  (1)目标、(2)边界框、 (3)不是目标(也就是背景)  这三种类型

单阶段目标检测算法 

YOLOv1

        YOLOv1的设计灵感来自于GoogLeNet模型,使用较小的卷积网络的级联模块。使用的具体细节是,使用GoogLeNet在ImageNet上预训练过、精度已经很高的预训练模型。在此基础上,添加随机初始化的卷积层和全连接层进行微调fine-tuning

        YOLOv1在准确性和速度都远远超过当时的两阶段实时目标检测模型,但是小目标检测和密集目标检测效果不好

SSD

        基于VGG-16来构建的

        模型浅层的SSD(特征图的size比较大,小目标的信息被保留的比较完整)用来检测较小的目标。较深的层用来 检测较大的物体

        在训练期间,SSD将每个GT框(ground truth)与具有最佳IoU的默认框匹配,( 【我猜】truth的答案标签 框 和你模型预测的  框 相匹配),并相应的训练网络,类似Muti-Box。(啥是Multi-box?

        SSD作者还使用了困难负样本挖掘和(啥是困难负样本挖掘?)大量数据增强方法

        损失函数:与DPM(啥是DPM?)类似,SSD利用  定位损失    和       置信度损失   的   加权和,作为总的损失值来训练监督模型

        并通过执行菲最大抑制NMS(什么是是非最大抑制,有什么用?)获得最终输出 

        SSD在检测小目标方面也存在困难。这个问题可以通过使用更好的backbone网络(如ResNet)来解决

YOLOv2

        相比YOLOv1,YOLOv2提供了速度和准确性之间良好的平衡

        YOLOv2,是YOLO系列中,首次使用了DarkNet-19作为backbone的。,

        使用了BatchNormalization以提高收敛性

        分类和检测系统的联合训练以增加检测类别(意思是:分类  和 打bouding box  这两个任务一起训练, 然后类别就多了?  啥叫检测类别? 识别是人,是车,是摩托?这和前面的联合训练有什么关系

        移除Fully connected层以提高速度(参数量小了,计算量小了,速度自然块 )

        使用学习的anchor框(是可学习的anchor框吧?)来提高召回率recall并获得更好的先验(啥叫先验?事先就知道这些框有可能是真实的框?

                recall=TP/(TP+FN)。实际为正的样本里,预测正确的样本的比例。所有的罪犯里,有多少罪犯被你抓住了。

                precision=TP/(TP+FP)。在你预测为正的样本集合里,多大比例是被正确预测的。所有你认为是犯人,被抓进Police局里人里,多少人真的是犯人

        YOLOv2的作者Redmon等人,使用WordNet将分类和检测数据集,组合在层次结构中。此WordTree可以用于预测更高的上位词条件概率,从而提高系统的整体性能。(啥意思啊?不知所云!

YOLOv3

        YOLOv3是在YOLOv2基础上做增量改进,整个范式上没有太大的改进了。YOLOv3相比YOLOv2只是速度上更快了,但是上从技术上是没有突破的。

        使用了比YOLOv2的backbone Darknet-19更大更深的网络Darknet-53来做backbone。 Darknet-53和Darknet-19的不同是,53增加了残差结构。缓解了因为网络过深带来的梯度消失问题,从而使得网络变得更深。

        使用了 数据增强、多尺度训练 muti scale training、Batch Normalization。

        分类器中的softmax层被逻辑分类器所取代。(是logistics regression吗?

CenterNet

        抛弃了传统的bouding box这种对目标object进行建模的方式,将一个object用 一个  点   来表示。这个  点   是bouding box的中心点。

        输入图像通过高斯半径生成热力图Heatmap, Heatmap head用于确定目标中心,Dimension Head用于估计目标大小(从目标中心向外半径多少),Offset head用于校正目标点的偏移。

        CenterNet使用预训练的DLANet作为提取器网络(什么是DLANet?有什么独特的优良特性),这个DLANet网络有3个Head: Heatmap Head, Dimension Head, Offset Head。这三个Head的多任务损失在训练时被反向传播到特征提取器进行参数更新,梯度优化。

        他比之前的工作更准确,推理时间更短。 

EfficientDet

        比之前的模型准确率更高,效率更高(体现在哪里?),是可扩展的目标检测器(可扩展体现在哪里?——可以把这个EfficientDet很好的推广到其他任务上)

        引入了高效的多尺度特征、BiFPN和模型缩放(啥叫模型缩放?是不是指的,我串联堆叠3个BiFPN也行,五个也行,一个也行)。BiFPN是     具有可学习权重的      双向Bi-directional     特征金字塔Feature Pyramid Network,用于在不同尺度上将输入特征   交叉连接。

                上图想展示的是作者如何一步步改机和演进,从而设计出BiFPN这个网络

               第一步 (a) 是利用 top-down自上而下的方式去融合level 3到level 7的特征(P3-P7)

               第二步 (b)在top-down的FPN的基础之上 ,串联   一条 通路 path, 可以bottom-up 自底向上

               第三步(c)引入NAS(Neural Architecture Search)神经网络架构搜索技术,去找到一条不规则的特征提取网络Feature Network的拓扑结构topology,然后重复串行这个结构多次(我猜的,不知道对不对)。你看图(c)就会发现这个网络结构十分不规则和奇怪,但是这种奇怪的网络结构是最优的网络结构。(或者performance更好,或者保证前者的基础上参数量相对较少)

                第四步(d)在权衡的accuracy和efficiency的基础上,平衡二者最优的架构是这个样子的结构的BiFPN。

         EfficientDet利用EfficientNet作为主干网络(下图左边那个),将多组BiFPN层串联堆叠作为特征提取网络(下面这个示意图,从左到右,堆叠了三个BiFPN)。最终BiFPN层的每个输出都被送到分类网络和框检测。

YOLOv4

        YOLOv4相比YOLOv3在范式上没有太大的改进,只是一堆Trick(奇淫巧技)的集合,使得模型速度很快,易于训练。

        为了改进性能引入了,数据增强、正则化方法、类标签平滑、CIoU-loss、CmBN(Cross mini-Batch Normalization)、自对抗训练、余弦退火算法来改进其最终的性能。

        使用了Mish激活函数、跨阶段部分连接CSP(Cross Stage Partial)、SPP-block(Spatial Pyramid Pooling)、PAN路径聚合块(Path Aggregation Network)、多输入加权残差连接MiWRC(Multiple input Weighted Residual Connection)

        检测头沿用YOLOv3的,backbone在YOLOv3的Darknet-53的基础上加入CSPNet,骨干网络是CSPNetDarknet-53.

趋势总结

整体趋势,逐渐走向End-to-End端到端

        End-to-End的意思是,从输入数据的开始端到模型处理得到最终结果的结束段之间,不需要将问题拆分成多个独立的子问题。开始端到结束端整个过程一体化的进行优化。

        (1)Craft Free, 不再需要手工设计特征,用神经网络来自动提取特征

        (2)proposal free, 不需要候选区域推荐,从二阶段算法到单阶段算法

        (3)anchor free

        (4)NMS free, YOLOX尝试过,但是没提供代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128928.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript:赋予JavaScript数据类型新的力量,提升编程效率!

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 📚 前言 TypeScript:扩展JavaScript数据类型,赋予编程更强大的表达能力&#xff01…

React三属性之:props

作用 将父组件的参数传递给子组件 父组件 import ./App.css; import React from react; import PropsTest from ./pages/propsTest class App extends React.Component{render(){return(<div><h2>App组件</h2><PropsTest obj{{name:王惊涛,age:27}}>…

构建企业分支网络

构建企业分支网络 目录 1.1 项目背景 1.2 项目拓扑 1.3 项目需求 1.4 设备选型 1.5 技术选型 1.6 地址规划 1.6.1 交换设备地址规划表 1.6.2 路由设备地址规划表 1.6.3 ISP设备地址规划表 1.6.4 终端地址规划表 1.6.4.1 VLAN 规划 1.7 VLAN 规划 1.8 项目实施 1.…

无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“Newtonsoft.Json.Linq.JArray”解决方法

对于“Newtonsoft.Json.Linq.JObject”的对象强制类型转换为类型“Newtonsoft.Json.Linq.JArray”报错 第一的图为对象{“*************”:“********”} 第二个图片为数组[{“…”:“…”}] 在我这里进行强制转换对象转换为类型“Newtonsoft.Json.Linq.JArray”报错. 那我们…

Maven中导入jQuery,前端页面中引用jQuery

第一步pom文件中&#xff0c;配置maven坐标。 第二步&#xff0c;在前端页面中引用jQuery 注&#xff1a;该前端页面需要在web根目录即webapp目录下。可认为在maven中导入jQuery后&#xff0c;jquery.min.js文件放在目录webapp/webjars/jquery/3.3.1下。

新手小白制作产品册的攻略合集

在如今竞争激烈的市场中&#xff0c;一个精美而专业的产品册可以帮助你吸引更多的客户和提升品牌形象。然而&#xff0c;对于新手小白来说&#xff0c;制作产品册可能会显得有些困难。不用担心&#xff01;小编将告诉大家一些制作产品册的攻略&#xff0c;帮助你轻松入门 首先我…

MySQL触发器使用指南大全

一、介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名OLD和NEW来引…

yolov7添加pconv模块

连接pconv 1、复制到models-common.py文件最后 2、添加模块到yolo.py 3、修改网络&#xff0c;建议替换3x3的卷积&#xff0c;后面的参数不要了 4、不能替换步长为2的卷积

机器学习入门教学——交叉验证

1、简介 交叉验证是在机器学习建立模型和验证模型参数时常用的办法&#xff0c;一般被用于评估一个机器学习模型的表现。更多的情况下&#xff0c;我们也用交叉验证来进行模型选择。【注】在训练模型时&#xff0c;为了提高模型的质量&#xff0c;我们会将数据集划分为训练集、…

VTK实现裁剪删除模型功能

VTK高级裁剪删除模型功能 功能演示 删除框选面片 保护框选面片 功能介绍 纯VTK实现的高级裁剪删除功能&#xff0c;支持任意框选内容&#xff0c;支持以下功能&#xff1a; 鼠标任意框选面片范围&#xff0c;支持删除框内面片&#xff0c;或选择仅保留框内面片框选后可以…

K8S1.23.6版本详细安装教程以及错误解决方案(包括前置环境,使用部署工具kubeadm来引导集群)

准备工作&#xff08;来自官方文档&#xff09; 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。每台机器 2 GB 或更多的 RAM&#xff08;如果少于这个数字将会影响你应用的运行内存&#xf…

Git 提交时忽略某些文件

Git 提交时忽略某些文件 ①打开项目目录&#xff0c;找到.gitignore文件 ②编辑.gitignore文件&#xff0c;加上要忽略的文件后缀 以上是针对还没有提交过的文件进行过滤 如果已经这些后缀的文件已经提交过&#xff0c;则需要删除远程的该后缀文件 git rm --cached示例&…

Es6中的拓展运算符参数解构在实际项目当中应用

扩展操作符 … 是ES6中引入的&#xff0c;将可迭代对象展开到其单独的元素中,常见的应用场景有:拷贝数组对象,合并数组,参数传递,数组去重,字符串转字符数组,解构变量等 单纯的学习某个技术知识点,很容易的,但是能在实际项目中运用进去,那就不简单了的 单纯的学习某个语言的语法…

【LeetCode-简单题】69. x 的平方根

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 假设求8的平方根&#xff0c;那就设置left 0 &#xff0c;right 8&#xff1b; 每次取最中间的元素的平方和8对比&#xff0c;如果大于8&#xff0c;则right mid-1&#xff0c;如果小于8 left mi…

python趣味编程-数独游戏

数独游戏是一个用Python编程语言编写的应用程序。该项目包含可以显示实际应用程序的基本功能。该项目可以让修读 IT 相关课程并希望开发简单应用程序的学生受益。这个Python 数独游戏是一个简单的项目,可用于学习tkinter库的实践。这个数独游戏可以提供Python编程的基本编码技…

JAVASE事件监听

代码&#xff1a; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner;import javax.swing.JButton; import javax.…

PowerBI - 匹配并从另一个表中获取值

我有 2 个表通过列 A 相互连接。我想将列 C 与列 A 匹配并获得列 B 的值。 DAX 函数是 LOOKUPVALUE . MatchedOutput LOOKUPVALUE(Table2[ColB],Table2[ColA],Table1[ColC])这将查找 Table2[ColB] 中的值哪里Table2[ColA]匹配 Table1[ColC] .

信息系统项目管理师(第四版)教材精读思维导图-第十三章项目资源管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图源文件 13.1 管理基础 13.2 管理过程 13.3 规划资源管理 13.4 估算活动资源 13.5…

[Qt]基础数据类型和信号槽

文章目录 1. Qt基本结构1.1 Qt本有项目1.1.1 项目文件&#xff08;.pro&#xff09;1.1.2 main.cpp1.1.3 mainwindow.ui1.1.4 mainwindow.h1.1.5 mainwindow.cpp 1.2 Qt中的窗口类1.2.1基础窗口类1.2.2 窗口的显示 1.3 内存回收 2. Qt中的基础数据类型2.1 基础类型2.2 log输出2…

爬虫系统的核心:如何创建高质量的HTML文件?

在网页抓取或爬虫系统中&#xff0c;HTML文件的创建是一项重要的任务。HTML文件是网页的基础&#xff0c;包含了网页的所有内容和结构。在爬虫系统中&#xff0c;我们需要生成一个HTML文件&#xff0c;以便于保存和处理网页的内容。 在这种情况下&#xff0c;可以使用Java函数…