目标检测算法综述

1 研究背景

1.1 概述

        目标检测是计算机视觉的重要分支,主要任务是在给定的图片中精确找到物体所在位置,并标注出物体的类别,即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标检测作为基础。

目标检测
目标检测算法发展时间轴

1.2 深度学习算法比较  

         在基于深度学习算法的目标检测算法主要分两类:One-Stage与Two-Stage,比较如下图:

One-Stage和Two-Stage比较

主要算法:

One-Stage:YOLO系列(v1-v5),SSD系列(R-SSD、DSSD、FSSD等),Retina-Net

Two-Stage:RCNN系列(Fast-RCNN、Faster-RCNN、Mask-RCNN),SPPNet,R-FCN。

1.3 常用数据集

        目标检测常用数据集是用于训练和评估目标检测模型的重要资源。这些数据集通常包含大量带有标注信息的图像,包括目标对象的类别和边界框。

常用数据集

1.4 评价指标

        传统检测器在行人检测的应用研究中,以每个窗口的漏检率与误报率作为检测器性能的度量标准。卷积神经网络的应用和检测器检测方法改变后,以平均检测精度作为同类检测准确性的评价指标,以类平均检测精度作为不同类别间的平均AP,以表现目标检测算法检测精度的综合性能,并引入交并比来描述目标检测算法的定位准确性。        

评价指标

2 传统目标检测方法

        早期的目标检测算法大多是基于人工设计滤波器特征构建的。通过滑动窗口的方法对待检测图片提取候选框,接着进行特征提取,然后利用分类器进行分类判定。通过非极大值抑制(NMS)可以对候选框进行合并,消去重叠或冗余的候选框,输出最终结果。典型算法有2001年的V-JViola-Jones)检测算法、2006年诞生的HOG+SVM检测算法和2008年诞生的DPM算法等。然而,这种方法使得滑动窗口的计算量随着图像像素的增加呈指数增长,且手工设计的特征对于目标多样性的变化并没有很好的鲁棒性,检测效率和精度都不高。

传统目标检测分类

代表方法的实现

        传统目标检测方法通常依赖于手工设计的特征(如HOGSIFTHaar-like)和经典的机器学习算法(如SVMAdaBoost)。虽然这些方法在一定程度上取得了成功,它们通常存在以下局限性:

  1. 特征表达能力有限:手工设计的特征无法捕捉图像中丰富的高层语义信息。
  2. 计算复杂度高:滑动窗口方法计算量大,实时性差。
  3. 鲁棒性不足:对目标的形变、遮挡和光照变化等情况适应性差。

3 两阶段检测算法

        两阶段目标检测算法是当前目标检测领域中最为经典且广泛应用的一类方法。它们的核心思想是将目标检测任务分为两个阶段:首先生成候选区域(Region Proposals),然后对这些候选区域进行分类和边界框回归。这种方法的代表性算法包括R-CNN系列(R-CNN, Fast R-CNN, Faster R-CNN)和Mask R-CNN等。

两阶段检测算法时间流程图

        两阶段算法首先根据输入的图像生成候选框(Region Proposals),候选框的生成方法可分为选择性搜索和基于锚框的方法。选择性搜索首先对图像进行分割,得到一些小的区域,然后通过合并相邻的区域,得到一些更大的候选框,最后对这些候选框进行筛选,保留与目标物体较为相似的候选框。基于锚框的方法先在图像上生成一些固定大小和宽高比的锚框,然后通过卷积神经网络对每个锚框进行分类和回归,得到每个锚框的置信度和位置偏移量,最后根据置信度对锚框进行筛选,保留置信度较高的候选框。

单阶段目标检测结构表征

        两阶段目标检测算法通过将候选区域生成和目标检测分为两个阶段,对传统的目标检测方法进行了优化和改进,其优点和缺点如下:

优点:

  1. 高精度:在候选区域生成后进行进一步的精细分类和回归,通常在准确性上表现优异。
  2. 处理复杂背景和小目标物体:候选区域生成阶段提供了初步的筛选,减少了背景干扰,精细检测阶段则进一步提高了检测质量。
  3. 候选区域质量高:通过RPN等机制生成的候选区域质量较高,减少了误检和漏检,提高了检测的整体性能。

缺点:

1、计算效率低               2、实现复杂性高               3、对于硬件资源要求高

4 单阶段检测算法

        单阶段目标检测算法是一类在单个网络中同时完成候选区域生成和目标分类的算法,具有更高的检测速度。它们直接在特征图上进行密集预测,不像两阶段方法那样先生成候选区域再进行精细检测。

单阶段检测算法时间流程图

        单阶段检测算法通过简单的一次网络处理即可成功输出检测分类和预测框的边界,如图8所示。因此该类检测算法具备良好的检测速度,适合移动端使用,同时为算法模块的添加保留了足够的结构空间,用以实现检测应用的各种需求。

单阶段目标检测结构表征

        单阶段目标检测算法可以划分为四种网络,分别是YOLO全系、SSDRetinaNetEfficientDetYOLO自问世到现在已经发展至YOLOv10,其网络结构不断更替改进,性能不断提升,开源代码使得其被广泛使用。  

      

        单阶段目标检测算法在单个网络中同时完成候选区域生成和目标分类的算法,其改进了两阶段目标检测的算法性能。其主要优缺点如下:

优点:

  1. 高检测速度:单阶段方法将候选区域生成和目标检测整合在一个网络中,简化了处理流程,减少了计算量。
  2. 实现简单:单阶段方法的网络结构较为简单,只有一个网络模块,避免了复杂的候选区域生成和二次处理步骤。
  3. 端到端训练:单阶段方法通常可以进行端到端的训练,不需要像两阶段方法那样需要单独训练候选区域生成器和检测器。

缺点:

1、精度相对较低               2、模型调优复杂               3、正负样本不均衡

5 总结和展望

        简单介绍了传统目标检测方法的概念和结构,针对传统目标检测方法存在的问题,分析了基于卷积神经网络的目标检测算法的发展历程,根据检测算法分类综述了具有代表意义的检测器,包括R-CNN系列算法、YOLO系列算法和SSD算法等。

        在目标检测算法发展过程中,通过模型结构改进(如增加卷积层、改变激活函数等)提高了模型的准确率和速度,通过数据增强(如旋转、翻转、裁剪等)增加了数据样本的多样性并提高了模型的泛化能力,利用损失函数改进(如使用聚焦损失提高了模型对难样本的处理能力,通过将多个目标检测器进行融合提高了目标检测的准确率和鲁棒性,通过对GPU、现场可编程门阵列等硬件进行优化提高了目标检测算法的速度和效率。 

        在目标检测算法研究中,如何针对应用需求改进和创新检测算法仍值得思考,未来可能的研究方向包括以下几个方面:

        更快的检测速度。 随着物联网和边缘计算的发展,越来越多的应用场景需要实时目标检测。因此,目标检测算法需要更快的速度,以满足实时性要求。未来的研究方向包括更轻量级的网络结构、更高效的计算方法、更优化的硬件设备等。
        更高的定位精度。 目标检测算法的定位精度对于一些应用场景非常重要,如医学影像分析、工业质检等。未来可以通过研究更深、更宽的神经网络结构、更有效的特征提取方法、更精细的目标分类方法等实现定位精度和检测效率的提升。
        轻量级目标检测算法。 YOLOv3 开始,首次体现了移动设备对轻量级算法的需求。检测速度和精度得以保证之始,应用级的需求就开始向更轻、更便捷的方向转变,如移动机器人的目标识别抓取、农业应用等。尽管目前的检测算法在检测精度方面已经超越人类,但在细节和功能性上仍不及人眼,尤其是足够轻足够小的检测算法。
        小目标检测。 YOLO 等结构简单的算法对小目标的检测失真,导致泛化能力低下,解决了小目标检测问题的算法检测速度较低而应用受限。
        目标检测的多模态融合。 自动驾驶汽车凭借多种传感器实现对驾驶环境的机器识别,目标检测不仅可以通过图像进行,可以通过声音、红外线、雷达等多种传感器进行。将来自不同传感器的数据进行融合,从而实现对目标更加准确和全面地进行检测,可以使信息互补,实现误差校正、多样性增强以及实时性提高。
        目标检测的场景自适应。 目标检测算法不同场景下的表现可能存在差异,通过自适应学习等方法,提高目标检测算法在不同场景下的准确率和鲁棒性,将极大提升目标检测在各行业中的应用泛化性能。
        注意力机制。 检测算法区域划分、锚框选定等操作经常出现检测算法复杂性徒增的问题,注意力机制的引入能够大幅降低检测成本,高效关注图像有用信息,使现有检测算法检测性能快速提升成为可能。

       

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

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

相关文章

Java线程几种常用方法详细说明

在Java编程中,多线程编程是一个非常重要的主题。它允许我们同时运行多个任务,提高程序的性能和响应速度。在这篇博客中,我们将介绍一些常用的Java线程方法和构造器,并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…

速盾:速盾高防cdn的防御原理?

速盾高防CDN是一种专业的网络安全解决方案,通过多种防御措施保护网站不受各种网络攻击的影响。其防御原理主要包括以下几个方面: 高强度DDoS防护 速盾高防CDN采用了弹性云防护集群,能够应对大规模的分布式拒绝服务(DDoS&#xff0…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目,使用Postman测试 参考博文: 1、使用…

llvm 3.5 源码分析 clang for x86 001 之搭环境

0,目标 编译 针对x86 的,debug 的 c语言的编译器 1,下载代码 git clone --recursive 。。。llvm-project.git $ cd llvm-project 2,预备代码 llvm 3.5 版本的源代码,早期版本,可能比较小比较容易debug $…

Python知识点1---变量和数据类型

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 在所有知识开始前,先给大家介绍一下Python的注释&#xf…

使用STM32和TB6600驱动器控制42BYGH步进电机

项目概述 1. 系统组成 STM32微控制器:作为主控制器,负责发出控制指令。TB6600驱动器:用于接收STM32的指令并驱动步进电机。42BYGH步进电机:作为执行元件,根据控制信号进行转动。电源:为STM32、TB6600和步…

Unity MiniCPM-V 让引擎拥有视觉

Unity MiniCPM-V 让引擎拥有视觉 前言项目Python环境布置Unity场景布置代码编写添加并设置脚本总结 鸣谢AI提示 前言 新发布的MiniCPM-V,忍不住玩一下,可以让之前制作的语音助手拥有一定的视觉能力(不是OpenCV不行,而是AI更加符合…

深入理解Java关系运算符,避免常见错误!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

Java Web是前端吗:深入解析Java Web技术的定位与边界

Java Web是前端吗:深入解析Java Web技术的定位与边界 在探讨Java Web是否属于前端领域时,我们首先需要明确Java Web技术的定位和它所涉及的范畴。本文将从四个方面、五个方面、六个方面和七个方面来深入解析这一问题,带您领略Java Web技术的…

复现CELL文章图片,在线绘制scRNA-seq多个cluster的差异火山图

导读 火山图表示两组间的差异,而在scRNA-seq中,同时会有多个cluster(vs其他cluster)的差异。如果用常规火山图展示,可能需要绘制十几个图。有没有更高效的展示方法呢?今天给大家带来CELL文章“A Spatiotem…

linux pigz 多线程压缩解压

压缩: tar --use-compress-programpigz -cvpf abc.tgz ./abc 解压: tar --use-compress-programpigz -xvf ./abc.tgz 解压到指定位置:tar --use-compress-programpigz -xvf ./abc.tgz -C ./hhh

原生js访问http获取数据的方法

在原生JavaScript中,直接通过浏览器端的JavaScript访问HTTP接口获取数据通常涉及XMLHttpRequest对象或现代的fetch API。 1. 使用XMLHttpRequest XMLHttpRequest是一个老旧的API,但在某些情况下仍然很有用。以下是一个简单的例子: javascr…

打造SimPO新算法,微调8B模型超越Claude 3 Opus

前言 大型语言模型(LLM)近年来取得了巨大进展,但要将其与人类价值观和意图相一致,使其变得有用、诚实和无害,仍然是一个挑战。强化学习从人类反馈中(RLHF)是一种常用的方法,通过微调…

Charles的安装和web端抓包配置

1.Charles的安装 通过官网下载:https://www.charlesproxy.com/download/,我之前下载的是4.6.2版本,下载成功后点击安装包,点击下一步下一步即可安装成功。 ​​ ​ 安装成功后打开charles页面如下所示。 ​ 2.乱码问题解决 打开…

【C++】STL:栈和队列模拟实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

绘画参数配置及使用

绘画参数配置及使用 路径:站点后台-功能-AI绘画 进入参数配置 接口选择:多种接口自主选择(需自己准备key),对应接口的key对话和绘画通用 存储空间: 位置在超管后台-存储空间 自主选择存储(需…

【数据结构与算法】七大排序算法(下)

【数据结构与算法】七大排序算法(下) 🥕个人主页:开敲🍉 🔥所属专栏:数据结构与算法🍅 🌼文章目录🌼 2.3 交换排序 2.3.1 冒泡排序 2.3.2 快速排序 2.3.3 快速排序(非递归) 2.4 归并…

fpga入门 串口定时1秒发送1字节

一、 程序说明 FPGA通过串口定时发送数据,每秒发送1字节,数据不断自增 参考小梅哥教程 二、 uart_tx.v timescale 1ns / 1psmodule uart_tx(input wire sclk,input wire rst_n,output reg uart_tx);parameter …

Spring bean加载顺序

最近在开发过程中遇到一个Spring bean加载顺序的问题,容器在启动的时候 会通过InitializingBean 的afterPropertiesSet 加载两级缓存,但是加载的过程中因为没有将load的容器对象加载到Spring 容器中导致NPE ,所以今天来巩固一下spring bean的…

【Python Cookbook】S01E12 根据字段将记录分组

目录 问题解决方案讨论 问题 如果有一系列的字典或对象实例,我们想根据某个特定的字段来分组迭代数据。 解决方案 假设有如下字典列表: rows [{address: 5412 N CLARK, date: 07/01/2012},{address: 5148 N CLARK, date: 07/04/2012},{address: 580…