浅析目标检测入门算法: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尝试过,但是没提供代码
相关文章:
浅析目标检测入门算法:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4
本文致力于让读者对以下这些模型的创新点和设计思想有一个大体的认识,从而知晓YOLOv1到YOLOv4的发展源流和历史演进,进而对目标检测技术有更为宏观和深入的认知。本文讲解的模型包括:YOLOv1,SSD,YOLOv2,YOLOv3,CenterNet,EfficientDet,YOLOv4…...
C++:类和对象(三)
本文主要介绍初始化列表、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化。 目录 一、再谈构造函数 1.构造函数体赋值 2.初始化列表 3.explicit关键字 二、static成员 1.概念 2.特性 三、友元 1.友元函数 2.友元类 四、内部类 五、匿名对象 六、拷…...
分布式系统第三讲:全局唯一ID实现方案
分布式系统第三讲:全局唯一ID实现方案 本文主要介绍常见的分布式ID生成方式,大致分类的话可以分为两类:一种是类DB型的,根据设置不同起始值和步长来实现趋势递增,需要考虑服务的容错性和可用性; 另一种是类snowflake型…...
Ubuntu之apt-get系列--安装JDK8--方法/教程
原文网址:Ubuntu之apt-get系列--安装JDK8--方法/教程_IT利刃出鞘的博客 简介 本文介绍如何在Ubuntu下安装JDK8。 验证是否安装 可以通过如下命令判断系统是否有安装ssh服务: 命令 java -version 结果 如上所示,表示还没有安装。 查看…...
npm 实现原理
输入 npm install 命令并敲下回车后,会经历如下几个阶段(以 npm 5.5.1 为例): 1.执行工程自身 preinstall 当前 npm 工程如果定义了 preinstall 钩子此时会被执行。 2.确定首层依赖模块 首先需要做的是确定工程中的首层依赖&a…...
国家开放大学 练习题
学前儿童社会教育活动指导 参考试题 一、单项选择题(每小题3分,共30分) 1.《规程》第三十二条规定:“幼儿园应当充分尊重幼儿的个体差异,根据幼儿不同的心理 发展水平,研究有效的活动形式和方法&am…...
Kotlin
函数命名 针对您目前为止学到的 Kotlin 知识,下面给出了一些相关样式指南: 函数名称应采用驼峰式大小写形式,并且应该是动词或动词短语。每个语句都应单独占一行。左花括号应出现在函数开始行的末尾。左花括号前应有一个空格。 变量声明 变…...
和未来合伙人的共同价值观 - 初期
一定要互补,能力板块的互补。 价值观一定要正。 如何管理创业团队? 层级是一个公司逼不得已才要做的,每一个层级的堆积,都会带来一些压力和效率的损失,你一旦把这个团队,变成了十个十个人的团队…...
虚函数表存储的位置(解析C++内存分配及其编译分段)
先上结论:C虚函数表保存在.rdata只读数据段。编译时期由编译器确定虚函数表。虚函数表属于类,类的所有对象共享这个类的虚函数表。 c/c的内存分配 栈(stack):又称堆栈,栈是由编译器自动分配释放…...
JS如何正确销毁 VIDEO 和AUDIO 元素
销毁 VIDEO 元素意味着停止视频的播放,并释放与其相关的所有资源。 一般情况下,我们可以通过调用 VIDEO 元素的 pause() 方法来停止视频播放,然后使用 remove() 方法从 DOM 树中删除元素。 但是,仅仅这样做可能并不能完全卸载 V…...
SpringMvc第四战-【SpringMvc文件上传,下载】
目录 一.SpringMvc文件上传 1.导入依赖(在pom.xml中) 2.配置文件上传解析器(在spring-mvc.xml中) 3.前端标记多功能表单(构建一个jsp界面来操作) 4.将文件写出流,然后写入服务器 5.配置映…...
一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利四)
图像分块: 参见下图,一幅图像大小为5*6(像素),每个像素包含R、G、B三个分量,该图像划分为4个分块,第一分块的大小为3*3像素,第二分块的大小为3*3(像素),第三分块的大小为2*3像素,第四…...
华为数通方向HCIP-DataCom H12-821题库(单选题:301-320)
第301题 某台路由器运行 IS-IS,其输出信息如图所示,下列说法错误的是? [R1]display isis sdb local verboseDatabase information for ISIS(1) Level-1 Link State Database LSPID Seq Num Checksum Holdtime…...
dll文件反编译源代码 C#反编译 dotpeek反编译dll文件后export
目录 背景下载安装dotpeek导入dll文件export导出文件参考 背景 项目合作的时候,使用前人的或者其他部门dll文件直接在机台运行,会出现很多问题,逻辑,效率等等,此时我们可以选择对他们的代码进行反编译和重构ÿ…...
地图结构 | 图解占据栅格地图原理(附Matlab建图实验)
目录 0 专栏介绍1 栅格地图1.1 应用场景1.2 基本概念 2 占据栅格地图2.1 更新模型2.2 截断策略 3 仿真实现3.1 算法流程3.2 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索…...
element-plus点击菜单栏全部展开问题解决
这是由子菜单项的index属性引起的,子菜单项的index属性添加相同的值时就会出现这种情况。所以为每个子菜单项添加不同的index属性值就可解决。...
React 简便获取经纬度
以下是关于React获取定位经纬度的代码解释: import React, { useEffect, useState } from react;const LocationComponent () > {const [latitude, setLatitude] useState(null);const [longitude, setLongitude] useState(null);useEffect(() > {navigat…...
【多线程】线程安全的单例模式
线程安全的单例模式 饿汉模式懒汉模式单线程版多线程版多线程版(改进) 单例模式能保证某个类在程序中只存在 唯一 一份实例, 而不会创建出多个实例,从而节约了资源并实现数据共享。 比如 JDBC 中的 DataSource 实例就只需要一个. 单例模式具体的实现方式, 分成 “饿…...
Competitive Collaboration 论文阅读
论文信息 题目:Competitive Collaboration: Joint Unsupervised Learning of Depth, Camera Motion, Optical Flow and Motion Segmentation 作者:Anurag Ranjan, Varun Jampani, Lukas Balles 来源:CVPR 时间&#x…...
非科班菜鸡算法学习记录 | 代码随想录算法训练营完结!
这俩月终于结束了233333,之后就是反复复习和背八股了吧,然后整整项目春招再投投投,感觉大部分题都有思路了但是做过的题也会没思路,还是要复习 总结 数组: 双指针用的很多,一般一个指向遍历位置࿰…...
C语言实现三字棋
实现以下: 1游戏不退出,继续玩下一把(循环) 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储,可以使用3*3的二维数组 char bor…...
【LeetCode】35.复杂链表的复制
题目 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head [[7,null],[13,0],[11,4]…...
代码大全阅读随笔(五)
数据初始化要点: 数据初始化过程很容易出错,所以请使用本章介绍的方法,来初始化数据,从而避免由于非预期的初始化值而造成的错误。 最小化变量作用域。 使用相同的变量的语句尽可能的集中在一起。 早期绑定会减少灵活性࿰…...
No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集代码 下载)
时间告诉你什么叫衰老,回忆告诉你什么叫幼稚。不要总在过去的回忆里纠缠,昨天的太阳,晒不干今天的衣裳。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客…...
有什么好用的电容笔?apple pencil替代品推荐
近年来,电容笔越来越成为人们日常生活中常见的数码产品之一。电容笔的便捷性得到了消费者的认可。它逐渐取代无纸化书写。那么到底电容笔哪个品牌好呢,电容笔哪一款最好用呢,今天小编给大家总结几款市面好用的电容笔,让我们一起来…...
什么是回调函数?写出一个示例?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前…...
深度学习在医疗保健领域的应用:从图像识别到疾病预测
文章目录 深度学习在医学影像识别中的应用1. 癌症检测2. 病理学图像分析3. 医学图像分割 深度学习在疾病预测中的应用1. 疾病风险预测2. 疾病诊断辅助3. 药物研发 深度学习在个性化治疗中的应用1. 基因组学分析2. 临床数据集成 深度学习在医疗保健中的挑战和未来数据隐私和安全…...
SpringBoot实现自定义environment中的value加密
environment中的value为什么要加密? 未经过加密的配置文件,密码均是采用明文密码,很容易导致信息泄露。 SpringBoot environment中的value加密代码如下 package com.xxx.core.encryption;import com.google.common.collect.Maps; import lomb…...
celery的用法--任务调度
在Celery中,任务(Task)是执行特定操作的基本单元。任务可以异步执行,可以带有参数,可以返回结果,可以链式调用,还可以设置任务优先级、超时等属性。 1.定义任务: 使用app.task装饰器…...
MyBatis-Plus学习笔记总结
一、查询 构造器分为QueryWrapper和LambdaQueryWrapper 创建实体类User package com.system.mybatisplus.model;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.…...
二手书哪个网站做的好/付费推广外包
EnableAutoConfiguration注解通常用在Spring Boot项目的主类上,用于启用自动配置。它通过扫描项目中的依赖和类路径配置自动配置Spring应用程序上下文,从而简化了配置过程。这样,您可以快速构建和运行Spring Boot应用程序,而无需手…...
网站开发项目经验/seo薪资水平
摘要:上传大于8M的文件需要修改php的配置才可以生效。但是我在网上找了一堆修改配置的资料,但是自己修改之后就是没有生效。解决方法:修改php.ini这个选项,网上有很多的教程,可以随便搜。1、先用root账号,登…...
江苏泰州建设局网站/友情链接买卖代理
在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程。你也将了解列表推导和其它形式的推导。函数范式在命令式范式中,通过为计算机提供一系列指令然后执行它们来完成任务。在执行这些指令时,可以改变某些状态。例如&#…...
陕西省住房和城乡建设厅官网查询/域名seo站长工具
探究SpringBoot实现原理 注意: 难度较大,本版块作为选学内容,在开始前,必须完成SSM阶段源码解析部分的学习。 但是博主本人之前只了解过一点SSM知识,打算后面再补相关知识。 我们在前面的学习中切实感受到了SpringB…...
枣庄手机网站建设报价/爱站网关键词查询系统
百度地图api2.4.1 在发起步行路径检索的时候 onGetWalkingRouteResult回调方法中的结果总是空的,即使直接复制api的代码也不对。坐标我是用的百度地图的拾取坐标系统获取的坐标。开始的代码double cLat112.556305;double cLon32.975724;double cLat2112.560727;doub…...
彩页设计网站/抖音关键词排名优化软件
redis的事务是以命令multi开始,然后执行若干redis读写命令,最后以exec命令结束执行。整个过程中,在还没有执行 exec 命令前的所有 redis 的业务读写命令都没有真正的执行,只是放在了一个队列中,等 exec 命令执行时&…...