EdgeYOLO学习笔记
EdgeYOLO学习笔记
EdgeYOLO: An Edge-Real-Time Object Detector
Abstract
本文基于最先进的YOLO框架,提出了一种高效、低复杂度、无锚的目标检测器,该检测器可以在边缘计算平台上实时实现。为了有效抑制训练过程中的过拟合,我们开发了一种增强的数据增强方法,并设计了混合随机损失函数来提高小目标的检测精度。在FCOS的启发下,提出了一种更轻、更高效的解耦磁头,在不损失精度的情况下提高了推理速度。我们的基线模型在MS COCO2017数据集中可以达到50.6% AP50:95和69.8% AP50的精度,在VisDrone2019-DET数据集中可以达到26.4% AP50:95和44.8% AP50的精度,在Nvidia Jetson AGX Xavier边缘计算设备上可以满足实时(FPS≥30)的要求。如图1所示,我们还为计算能力较低的边缘计算设备设计了更轻、参数更少的模型,也表现出了更好的性能。我们的源代码、超参数和模型权重都可以在https://github.com/LSH9832/edgeyolo上找到。
Key Words: Anchor-free, edge-real-time, object detector, hybrid random loss
1 Introduction
随着计算硬件性能的不断提高,基于深度神经网络的计算机视觉技术在近十年得到了迅速发展,其中目标检测是自主智能系统[1]应用的重要组成部分。目前,主流的目标检测策略有两种。一种是以R-CNN系列[2,5]为代表的两阶段策略,另一种是以YOLO[9-11]为最流行的框架之一的一阶段策略。对于两阶段策略,在第一阶段采用启发式方法或区域建议生成方法获得多个候选盒,然后在第二阶段对这些候选盒进行筛选、分类和回归。单阶段策略以端到端的方式给出结果,其中目标检测问题转化为全局回归问题。全局回归不仅能够同时为多个候选框分配位置和类别,而且能够使模型更清晰地分离对象和背景。
在常见对象检测数据集(如MS COCO2017[3])上,使用两阶段策略的模型比使用一阶段策略的模型表现稍好。然而,由于两阶段框架的内在局限性,它远远不能满足传统计算设备上的实时性要求,在大多数高性能计算平台上也可能面临同样的情况。相比之下,单级目标检测器可以在实时指标和性能之间保持平衡。因此,它们更受到研究人员的关注,YOLO系列算法以高速迭代更新。从YOLOv1到YOLOv3[9-11]的更新主要是对底层框架结构的改进,之后的YOLO主流版本大多侧重于提高精度和推理速度。此外,他们的优化测试平台主要是具有高性能gpu的大型工作站。然而,他们最先进的模型通常在这些边缘计算设备上以令人不满意的低FPS运行。为此,一些研究人员提出了参数更少、结构更轻的网络结构,如MobileNet和ShuffleNet,以取代原有的骨干网,从而在移动设备和边缘设备上获得更好的实时性,但牺牲了一些精度。在本文中,我们的目标是设计一个具有良好精度的对象检测器,可以实时运行在边缘设备上。
本文的主要贡献如下:
i)设计了一种无锚目标检测器,该检测器可在MS COCO2017数据集上实时运行在边缘设备上,AP精度为50.6%;
ii)提出了一种更强大的数据增强方法,进一步保证了训练数据的数量和有效性;
iii)在我们的模型中使用可以重新参数化的结构,以减少推理时间;
iv)设计损失函数以提高对小目标的精度。
2 Related Work
2.1 Anchor-free Object Detector
自YOLOv1问世以来,YOLO系列在实时目标检测领域长期处于领先地位。还有一些其他优秀的检测器,如SSD [4], FCOS[15]等。在测试目标检测任务中的FPS时,以往的研究大多只计算模型推断的时间成本,而一个完整的目标检测任务包含预处理、模型推断和后处理三个部分。由于预处理可以在视频流中完成,因此在计算目标检测的FPS时,需要考虑后处理的时间成本。在高性能GPU工作站或服务器上,预处理和后处理的时间只占很小的比例,而在边缘计算设备上,其延迟时间甚至是其十倍以上。因此,减少后处理计算可以显著提高边缘计算设备的速度。当使用基于锚点的策略时,后处理中的时间延迟几乎与每个网格单元的锚点数量成正比。基于锚的YOLO系列通常为每个网格单元分配3个锚。与基于锚点的检测框架相比,无锚点检测在后处理部分可以节省一半以上的时间
为了保证检测器在边缘计算设备上的实时性,我们选择构建一个基于无锚策略的目标检测器。目前无锚检测器主要有两种类型,一种是基于锚点的检测器,另一种是基于关键点的检测器。在本文中,我们采用了基于锚点的范式。
2.2 Data Augmentation
数据增强是神经网络训练中一个重要的数据处理步骤。合理使用数据增强方法可以有效缓解模型过拟合。对于图像数据集,几何增强(随机裁剪、旋转、镜像、缩放等)和光度增强(HSV和亮度调整)通常应用于单个图像。这些基本增强方法通常用于多图像混合和拼接之前或之后。目前主流的数据增强技术,如Mosaic[18]、Mixup[7]、CopyPaste[17]等,通过不同的方法将多张图片的像素信息放在同一张图片中,丰富图像信息,降低过拟合概率。
如图2(b)所示,我们设计了一种更加灵活和强大的组合增强方法,进一步保证了输入数据的丰富性和有效性。
2.3 Model Reduction
通过模型约简,降低了计算成本,可以有效提高模型推理速度。模型约简方法可分为有损约简和无损约简两类。有损缩减通常通过减少网络层数和信道数来构建更小的网络。无损缩减集成和耦合多个分支模块,通过重新参数化技术[25]构建更精简的等效模块。有损缩减通过牺牲精度来实现更快的速度,并且由于耦合结构容易降低训练效果,一般采用重参数化方法在模型训练完成后进行推理。
本文结合有损约简和无损约简方法,构建了多个不同大小的模型(如图1所示),拟合不同计算能力的边缘器件,加快了模型推断过程。
2.4 Decoupled Regression
从YOLOv1到YOLOv5[9 - 11,18,19],对于每个不同比例比的特征图,回归获得对象的位置、类别和置信度使用统一的卷积核集。一般来说,不同的任务如果关系密切,则使用相同的卷积核。然而,在数值逻辑中,对象的位置、置信度和类别之间的关系还不够密切。而且,相关实验证明,使用解耦的回归检测头[15,23]与直接统一所有任务的回归检测头相比,可以获得更好的结果,并且可以加速损失收敛。尽管如此,解耦的头部会带来额外的推断成本。作为改进,我们设计了一种更轻的解耦头,同时考虑了模型的推理速度和精度。
2.5 Small Object Detecting Optimization
自目标检测研究开始以来,小目标检测问题一直受到广泛关注。随着物体在图像中的比例减少,用于表达物体的像素信息也会减少。大物体往往比小物体占用几十倍甚至上百倍的信息,小物体的检测精度往往明显低于大物体。而且,这种差距不能通过位图图像的属性来消除。此外,研究人员发现,在训练[14]时,小物体在总损失中所占的比例总是较小。
为了提高小目标的检测效果,以往的研究提出了以下方法:(a)复制小目标,并随机放置在图像的其他位置,以增加数据增强过程中小目标的训练数据样本,称为复制增强[14]。(b)对图像进行缩放和拼接,将原始图像中较大的物体放大为较小的物体。©损失函数通过增加小物体损失的比例[8],使其更加关注小物体。
由于使用方法(a)处理的图像存在尺度不匹配和背景不匹配的问题,我们仅参考方法(b)和方法©来优化训练过程。我们的数据增强中加入了缩放和拼接方法,并重新设计了损失函数,可以有效提高中小目标的检测和模型的整体精度。
3 Approach
3.1 Enhanced-Mosaic & Mixup
许多实时目标检测器在训练过程中使用Mosaic+Mixup策略进行数据增强,可以有效缓解训练过程中的过拟合情况。如图3(a)和(b)所示,有两种常见的组合方法,当数据集中的单幅图像有相对足够的标签时,它们表现良好。由于数据论证中的随机过程,在图3(a)中,当标签空间有响应时,数据加载器可能会提供没有有效对象的图像,这种情况的概率随着每张原始图像中标签数量的减少而增加。
我们设计了如图3©所示的数据增强结构。首先,我们对多组图像使用Mosaic方法,可以根据数据集中单张图片平均标签数量的丰富度来设置组数。然后,利用Mixup方法将最后的简单处理图像与这些经过马赛克处理的图像进行混合。在这些步骤中,我们最后一个图像的原始图像边界在变换后最终输出图像的边界内。这种数据增强方法有效地增加了图像的丰富度以缓解过拟合,并确保输出图像必须包含足够的有效信息。
3.2 Lite-Decoupled Head
首先在FCOS[15]中提出了图4中的解耦头,然后应用于其他无锚目标探测器,如YOLOX[23]。最后几层采用解耦结构可以加快网络收敛速度,提高回归性能。
由于解耦头采用分支结构,导致额外的推理成本,因此提出了高效解耦头[20],其推理速度更快,将中间3×3卷积层数减少到只有一层,同时保持与输入特征图相同的较大通道数。然而,在我们的实验测试中,这种额外的推断成本随着通道和输入大小的增加而变得更加明显。因此,我们设计了一个更轻的解耦头部,具有更少的通道和卷积层。此外,我们将隐式表示层[24]添加到所有最后的卷积层,以获得更好的回归性能。采用重新参数化的方法,将隐式表示层集成到卷积层中,以降低推理成本。最后的卷积层盒和置信度回归也合并,使模型可以进行推理与高并行计算。
3.3 Staged Loss Function
对于目标检测,损失函数一般可以写成如下形式
其中Lcls、Liou、Lobj、L∆L_cls、L_iou、L_obj、L_∆Lcls、Liou、Lobj、L∆为分类损失、IOU损失、对象损失和调控损失,α、λ、µ、ζα、λ、µ、ζα、λ、µ、ζ为超参数。在实验中,我们将训练过程分为三个阶段。
在第一阶段,我们采用一种最常见的损失函数配置:gIOU损失为IOU损失,分类损失和对象损失为平衡交叉熵损失,调节损失设为零。在最后几个支持数据增强的时代,培训过程进入了第二个阶段。将分类损失和目标损失的损失函数替换为混合随机损失
其中p代表预测结果,t代表ground truth, r是0到1之间的随机数。对于一个图像中的所有结果,我们有这个
这表明小物体的精度和总精度之间有更好的平衡。第三阶段,我们关闭数据扩充,将L1损耗作为我们的调节损耗,将gIOU损耗替换为cIOU损耗。下一节将介绍更多细节。
4 Experiments
5 Conclusion
我们提出了一种边缘实时无锚的一级检测器EdgeYOLO,其代表性结果如图5和图6所示。实验表明,EdgeYOLO可以在边缘设备上实时高精度运行,对小物体的检测能力得到了进一步提高。由于EdgeYOLO采用无锚结构,降低了设计复杂度和计算复杂度,在边缘设备上的部署更加友好。此外,我们相信该框架可以扩展到其他像素级识别任务,如实例分割。在未来的工作中,我们将进一步提高框架对小目标的检测精度,并对高效优化进行探索。
相关文章:

EdgeYOLO学习笔记
EdgeYOLO学习笔记 EdgeYOLO: An Edge-Real-Time Object Detector Abstract 本文基于最先进的YOLO框架,提出了一种高效、低复杂度、无锚的目标检测器,该检测器可以在边缘计算平台上实时实现。为了有效抑制训练过程中的过拟合,我们开发了一种…...
【分布式】什么是分布式锁?正文揭晓
分布式锁的概念 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。 举个例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人, 分布式锁…...

超详细JDK1.8所有版本下载地址
JDK1.8即为JDK8,JDK8是目前是最成熟最稳定的版本,本文将详细介绍JDK1.8历史版本的下载方式。 在此附上JDK1.8安装与配置教程 超详细JDK1.8安装与配置 一、JDK官网 首先打开oracle官网,官网首页地址为 JDK官网首页地址 点击Products 点击…...

论文解析[11] CAT: Cross Attention in Vision Transformer
发表时间:2021 论文地址:https://arxiv.org/abs/2106.05786v1 文章目录摘要3 方法3.1 总体结构3.1.1 Inner-Patch Self-Attention Block3.1.2 Cross-Patch Self-Attention Block3.1.3 Cross Attention based Transformer结论摘要 使用图像patch来替换tr…...

嵌入式和Python(一):python环境搭建的详细步骤
目录 ● 安装python ① 更新软件列表 ② 安装编译python需要用到的环境 ③ 下载python源码 ④ 解压源码包 ⑤ 配置 ⑥ 编译 ⑦ 安装 ● 建立软连接 说明 ① 删除原来的软连接 ② 在/usr/bin/目录创建软连接python,定向/usr/local/bin/python3.9 ③ 检查…...

嵌入式学习笔记——STM32硬件基础知识
STM32开发硬件知识前言单片机参数主频位数STM32最小系统电源电路晶振电路复位电路BOOT选择电路调试接口电路其他电路本文重点本文参考博客链接前言 上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题࿰…...

Mybatis插件开发及执行原理
mybatis源码下载 https://github.com/mybatis/mybatis-3,本文分析源码版本3.4.5 mybatis启动大致流程 在看这篇文章前,建议查看我另一篇文章,以了解框架启动的流程和框架中一些重要对象:https://blog.csdn.net/Aqu415/article/…...
vue父子组件通信,兄弟组件通信
目录 一、父子组件通信 1、子组件通过 props 获取父组件变量和父组件调用子组件中的方法(这两个都是父传子的思想) a:子组件通过 props 获取父组件变量 b:父组件调用子组件中的方法 2、父组件通过ref获取子组件变量和子组件调用父组件的方法(这两个都是子传父的…...

大数据技术之Hadoop集群配置
作者简介:大家好我是小唐同学(๑><๑),好久不见,为梦想而努力的小唐又回来了,让我们一起加油!!! 个人主页:小唐同学(๑><๑)的博客主页 目前…...

MicroBlaze系列教程(7):AXI_SPI的使用(M25P16)
文章目录 AXI_SPI简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第7篇文章。 AXI_SPI简介 Xilinx AXI-SPI IP共有两个:一个是标准的AXI_SPI,即4线制SPI,CS、SCLK、MOSI和MISO,另一个是AXI_Quad SPI,支持配置成标准SP…...

使用Python通过拉马努金公式快速求π
使用Python通过拉马努金公式快速求π 一、前言 π是一个数学常数,定义为:圆的周长与直径的比值。 π是一个无理数,也是一个超越数,它的小数部分无限不循环。 π可以用来精确计算圆周长、圆面积、球体积等几何形状的关键值。 有关…...
第六章 使用系统类提供国家语言支持 - 创建自定义语言环境
文章目录第六章 使用系统类提供国家语言支持 - 创建自定义语言环境创建自定义语言环境第六章 使用系统类提供国家语言支持 - 创建自定义语言环境 创建自定义语言环境 此示例将提供一个模板,用于使用自定义表创建自定义语言环境。自定义表将在 EBCDIC(美…...
「题解」解决二进制数中1的个数
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练 🔥座右铭:“不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错…...

泛型详解.
1 泛型的引入 问题:我们之前实现过的顺序表,只能保存 int 类型的元素,如果现在需要保存 指向 Person 类型对象的引用的顺序表,请问应该如何解决?如果又需要保存指向 Book 对象类型的引用呢? 之前写的顺序表…...
Vue 3.0 响应性 深入响应性原理 【Vue3 从零开始】
现在是时候深入了!Vue 最独特的特性之一,是其非侵入性的响应性系统。数据模型是被代理的 JavaScript 对象。而当你修改它们时,视图会进行更新。这让状态管理非常简单直观,不过理解其工作原理同样重要,这样你可以避开一…...

升级 vue3 常见问题总汇
Ⅰ、前言 虽然 vue3 是没有删除 vue2 的 选项式 API , 但是我们升级vue3 还是需要修改很多问题的下面来看看我们升级常见的一些问题 👇 文章目录Ⅰ、前言Ⅱ、解决兼容问题1、路由的创建方式2、路由的方法变化3、升级 vuex 到 4.x4、作用域 插槽语法修改…...

汽车 Automotive > T-BOX GNSS高精定位测试相关知识
参考:https://en.wikipedia.org/wiki/Global_Positioning_SystemGPS和GNSS的关系GPS(Global Positioning System),全球定位系统是美国军民两用的导航定位卫星系统,GPS包含双频信号,频点L1、L2和L5GNSS&…...
大数据面试核心101问【大厂超级喜欢这些题】
之前出过《史上最全的大数据开发八股文》这篇文章,同学们都觉得还不错,但是有些同学觉得那个背起来还是有些吃力,于是我再次回顾了自己之前面试所有大厂的一些面试题以及牛客上面的一些面经,然后总结了频率问的最高的101问&#x…...
代码随想录算法训练营第四十八天 | leetcode 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II
代码随想录算法训练营第四十八天 | leetcode 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II121. 买卖股票的最佳时机122.买卖股票的最佳时机II121. 买卖股票的最佳时机 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支…...

RAD 11.3 delphi和C++改进后新增、废弃及优化的功能
RAD 11.3 delphi和C改进后新增和废弃的功能 目录 RAD 11.3 delphi和C改进后新增和废弃的功能 一、版本RAD 11.3 delphi和C改进后新增功能 1、官方视频位置: 2、官方文档的链接位置: 二、版本RAD 11.3 delphi和C改进后废弃的功能 2.1、编译器不再使…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...

ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
TMC2226超静音步进电机驱动控制模块
目前已经使用TMC2226量产超过20K,发现在静音方面做的还是很不错。 一、TMC2226管脚定义说明 二、原理图及下载地址 一、TMC2226管脚定义说明 引脚编号类型功能OB11电机线圈 B 输出 1BRB2线圈 B 的检测电阻连接端。将检测电阻靠近该引脚连接到地。使用内部检测电阻时,将此引…...

React与原生事件:核心差异与性能对比解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

【VLAs篇】02:Impromptu VLA—用于驱动视觉-语言-动作模型的开放权重和开放数据
项目描述论文标题Impromptu VLA:用于驱动视觉-语言-动作模型的开放权重和开放数据 (Impromptu VLA: Open Weights and Open Data for Driving Vision-Language-Action Models)研究问题自动驾驶的视觉-语言-动作 (VLA) 模型在非结构化角落案例场景中表现不佳…...