【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles
文章目录
- 摘要
- Introduction
- Revisiting Video Object Detection Baseline
- Practice for Mobiles
- Model Architecture for Mobiles
- Light Flow
摘要
尽管在桌面GPU上取得了视频目标检测的最近成功,但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算资源下,稀疏特征传播和多帧特征聚合的关键原则是否适用。在本文中,我们提出了一种适用于移动设备的轻量级视频目标检测网络架构。我们在稀疏关键帧上应用了轻量级图像目标检测器。设计了一个非常小的网络,名为Light Flow,用于在帧之间建立对应关系。我们还设计了一个流引导的GRU模块,以有效地聚合关键帧上的特征。
对于非关键帧,进行了稀疏特征传播。整个网络可以端到端地进行训练。所提出的系统在移动设备上(例如华为Mate 8)以25.6 fps的速度在ImageNet VID验证集上实现了60.2%的mAP分数。
Introduction
近年来,利用深度神经网络进行目标检测取得了显著的进展[1]。一般趋势是构建更深、更复杂的目标检测网络[2,3,4,5,6,7,8,9,10,11],以达到更高的准确性。然而,这些提高准确性的进展未必能使网络在尺寸和速度方面更加高效。在许多实际应用中,如机器人、自动驾驶汽车、增强现实和移动手机等,目标检测任务需要在计算资源有限的平台上实时执行。
最近,越来越多的人开始关注构建非常小、低延迟的模型,以便轻松适应移动和嵌入式视觉应用的设计要求,例如SqueezeNet [12]、MobileNet [13] 和ShuffleNet [14]。这些结构是通用的,但并非专门为目标检测任务设计。为此,已经探索了一些适用于静态图像目标检测的小型深度神经网络架构,如YOLO [15]、YOLOv2 [11]、Tiny YOLO [16] 和Tiny SSD [17]。然而,直接将这些检测器应用于视频面临新的挑战。首先,在所有视频帧上应用深度网络会带来无法承受的计算成本。其次,识别准确度会受到视频中很少在静止图像中观察到的恶化外观的影响,如运动模糊、视频散焦、罕见的姿势等。
为了解决这些问题,当前的最佳实践[19,20,21]利用了时间信息来加速和提高视频的检测准确性。一方面,在[19,21]中使用稀疏特征传播来节省大部分帧上昂贵的特征计算。在这些帧上的特征从稀疏的关键帧传播而来。另一方面,在[20,21]中进行了多帧特征聚合,以提高特征质量和检测准确性。
基于这两个原则,最新的工作[21]在桌面GPU上实现了很好的速度-准确性权衡。然而,该架构对于移动设备来说并不友好。例如,作为特征传播和聚合的关键和共同组成部分,流估计在移动设备上的实时计算需求仍然远远不够。具有长期依赖性的聚合也受到移动设备有限运行时内存的限制。
本文描述了一种适用于移动设备的轻量级视频目标检测网络架构。它主要基于两个原则——在大多数非关键帧上传播特征,同时在稀疏的关键帧上计算和聚合特征。然而,我们需要仔细重新设计这两个结构,以考虑速度、尺寸和准确性。在所有帧上,我们提出了Light Flow,一个非常小的深度神经网络,用于估计特征流,可在移动设备上立即使用。在稀疏关键帧上,我们提出了基于流引导的门控循环单元(GRU)特征聚合,这是在内存有限的平台上的有效聚合。此外,我们还利用了轻量级图像目标检测器来在关键帧上计算特征,其中使用了先进而高效的技术,如深度可分离卷积 [22] 和Light-Head R-CNN [23]。
所提出的技术统一为一个端到端的学习系统。全面的实验表明,该模型稳步推进了性能(速度-准确性权衡)的界限,朝着在移动设备上实现高性能的视频目标检测前进。例如,我们在移动设备上(例如华为Mate 8)以25.6帧每秒的速度,在ImageNet VID验证集上实现了60.2%的mAP分数。它比先前在快速目标检测方面的最佳努力速度快一个数量级,并且准确性相当(见图1)。据我们所知,我们首次在移动设备上实现了具有合理准确性的实时视频目标检测。
Revisiting Video Object Detection Baseline
在静态图像中的目标检测在近年来利用深度卷积神经网络(CNN)取得了显著的进展[1]。最先进的检测器共享相似的网络架构,包括两个概念步骤。第一个步骤是特征网络,它通过一个完全卷积的主干网络[24,25,26,27,28,29,30,13,14]从输入图像I中提取一组卷积特征图F,表示为Nf eat(I) = F。第二个步骤是检测网络,它通过在特征图F上执行区域分类和边界框回归,使用多分支子网络生成检测结果y,可以是针对稀疏物体提案[2,3,4,5,6,7,8,9]或密集滑动窗口[10,15,11,31],即Ndet(F) = y。
它是随机初始化并与Nf eat一起进行训练。
将这些检测器直接应用于视频目标检测面临两个方面的挑战。就速度而言,将单一图像检测器应用于所有视频帧并不高效,因为主干网络Nf eat通常较深且较慢。
就准确性而言,检测准确性会受到视频中很少在静态图像中观察到的恶化外观的影响,如运动模糊、视频散焦、罕见的姿势。
目前的最佳实践[19,20,21]通过稀疏特征传播和多帧特征聚合分别利用时间信息来解决速度和准确性问题。
稀疏特征传播 由于连续帧之间的内容之间存在很强的关联性,不必在大多数帧上进行详尽的特征提取计算。深度特征流[19]提供了一种高效的方法,它仅在稀疏的关键帧(例如每10帧)上计算昂贵的特征网络,并将关键帧特征图传播到大多数非关键帧,从而实现了5倍的速度提升,但准确性略微降低。
在推断过程中,任何非关键帧i上的特征图都是通过从其前面的关键帧k传播而来的,即:
多帧特征聚合 为了提高检测准确性,流导引特征聚合(FGFA)[20]从附近的帧中聚合特征图,这些特征图通过估计的光流进行了很好的对齐。
在帧i上的聚合特征图 ˆFi 是通过加权平均附近帧的特征图得到的,其表达式为:
为了避免在所有帧上进行密集的聚合,[21] 提出了稀疏递归特征聚合,仅在稀疏的关键帧上操作。这种方法保留了聚合的特征质量,同时降低了计算成本。
具体而言,在连续的两个关键帧 k 和 k0 上,帧 k0 上的聚合特征被计算为:
Practice for Mobiles
由于稀疏特征传播和多帧特征聚合这两个原则在桌面GPU上产生了最佳实践,以实现高性能(速度和准确性的权衡)的视频目标检测[21]。然而,在移动设备上的计算能力和运行时内存非常有限,因此需要探索适用于移动设备的原则。
- 特征提取和聚合仅在稀疏的关键帧上操作,而在大多数非关键帧上执行轻量级特征传播。
- 流估计是特征传播和聚合的关键。然而,在[19、20、21]中使用的流网络Nf low在移动实时处理方面仍然远远不够。具体而言,FlowNet [32] 在相同的输入分辨率下是MobileNet [13] 的11.8倍FLOPs。即使在[19]中使用的最小的FlowNet Inception也多了1.6倍的FLOPs。因此,需要更加轻量级的Nf low。
- 特征聚合应该在根据光流对齐的特征图上进行操作。否则,由于大目标运动引起的位移会导致聚合严重错误。聚合中的长期依赖也是受欢迎的,因为可以融合更多的时间信息以获得更好的特征质量。
- 单张图像检测器的主干网络应尽可能小,因为我们需要它来计算稀疏关键帧上的特征。
Model Architecture for Mobiles
基于上述原则,我们设计了一个更小的移动视频目标检测网络架构。推理管道如图2所示。
接下来,我们将介绍两种专门为移动设备设计的新技术,包括Light Flow,一种更有效的移动设备流量网络,以及一种基于流导向GRU的特征聚合,用于更好地建模长期依赖关系,从而获得更好的质量和准确性。
Light Flow
FlowNet [32]最初是为像素级光流估计而提出的。它设计为编码-解码模式,后面是多分辨率光流预测器。两个输入的RGB帧被连接在一起形成一个6通道的输入。在编码器中,通过一系列卷积层,输入被转换成在空间维度上缩小到输入大小的1/64的特征图束。在解码器中,特征图被馈送到多个反卷积层,以实现高分辨率的光流预测。在每个反卷积层之后,特征图与编码器中的最后特征图连接在一起,它们具有相同的空间分辨率和上采样的粗糙光流预测。每个解码器中连接的特征图后面跟随多个光流预测器。对每个预测器应用损失函数,但在推断过程中仅使用最精细的预测。
为了极大地加速流网络Nf low,我们提出了Light Flow,它是一个基于FlowNet [32]进行若干有意设计的轻量级流网络。它在准确性方面只会带来轻微的降低(端点误差增加了15%),但在理论上速度提高了近65倍(见表2)。
在编码器部分,卷积始终是计算的瓶颈。受MobileNet [13]的启发,我们将所有的卷积替换为3×3的深度可分离卷积[22](每个3×3的深度可分离卷积后面跟着一个1×1的点卷积)。与标准的3×3卷积相比,3×3深度可分离卷积的计算成本减少了8~9倍,而准确性略有降低[13]。
在解码器部分,每个反卷积操作都被最近邻上采样和随后的深度可分离卷积所取代。[33]用最近邻上采样代替了反卷积,然后是标准卷积,以解决反卷积引起的棋盘状伪影。相比之下,我们借鉴了这个想法,进一步将标准卷积替换为深度可分离卷积,以减少计算成本。
最后,我们采用了一种简单有效的方式来考虑多分辨率的预测。这受到了FCN [34]的启发,FCN在明确的求和方式下融合了多分辨率的语义分割预测作为最终预测。
与[32]不同,我们在推断过程中不仅使用最精细的光流预测作为最终预测。相反,多分辨率的预测被上采样到与最精细预测相同的空间分辨率,然后求平均作为最终预测。此外,在训练期间,仅对平均光流预测应用单个损失函数,而不是在每个预测之后应用多个损失函数。这种方法可以将端点误差减少近10%。
Light Flow的网络架构和实现在表1中进行了说明。每个卷积操作之后都跟随批量归一化[35]和Leaky ReLU非线性变换[36],斜率固定为0.1。与[32,37]类似,Light Flow在Flying Chairs数据集上进行了预训练。在训练Light Flow时,使用Adam [38]作为优化方法,权重衰减为0.00004。在4个GPU上进行了70k次迭代,每个GPU持有64个图像对。
采用了热身学习率策略,首先训练学习率为0.001的模型进行10k次迭代。然后使用学习率为0.01进行20k次迭代,并在每10k次迭代后将学习率除以2。
在将Light Flow应用于我们的方法时,为了进一步提速,进行了两个修改。首先,与[19,20,21]一样,Light Flow应用于输入分辨率为特征网络的一半,并且输出步幅为4的图像。由于特征网络的输出步幅为16,流场被下采样以匹配特征图的分辨率。其次,由于Light Flow非常小,计算量与检测网络Ndet相当,因此在检测网络的中间特征图上应用稀疏特征传播(参见第3.3节,RPN [5]中的256维特征图和Light-Head R-CNN [23]中的490维特征图),以进一步减少非关键帧的计算量。
后面略
相关文章:

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles
文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功,但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…...

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比
时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …...

【软件工程】面向对象方法-RUP
RUP(Rational Unified Process,统一软件开发过程)。 RUP特点 以用况驱动的,以体系结构为中心的,迭代增量式开发 用况驱动 用况是能够向用户提供有价值结果的系统中的一种功能用况获取的是功能需求 在系统的生存周期中…...
Golang 的面向对象
文章目录 duck typingnil不一定是空接口组合代替继承接口转换回具体的类型使用switch匹配接口的原始类型 duck typing golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可 package mainimport "fmt&qu…...

STABLE DIFFUSION模型及插件的存放路径
记录下学习SD的一些心得,使用的是秋叶大佬的集成webui,下载了之后点击启动器即可开启,文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内,一些扩展类的插件是存放在extensions文件夹下...

Three.js 设置模型材质纹理贴图和修改材质颜色,材质透明度,材质网格
相关API的使用: 1 traverse (模型循环遍历方法) 2. THREE.TextureLoader(用于加载和处理图片纹理) 3. THREE.MeshLambertMaterial(用于创建材质) 4. getObjectByProperty(通过材…...

docker 安装mongodb 虚拟机安装mongodb
生产环境直接安装比较好,以及使用集群环境,本文仅测试交流使用,我用来写分布式im测试使用: nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务&…...
在SockJS+Spring Websocket中convertAndSendToUser中的“用户”来自哪里?
目录 一、前言二、Principal三、使用 一、前言 我们知道可以使用客户端订阅的主题前缀从 stomp 服务器向客户端发送消息,例如 /topic/hello。我们还知道我们可以向特定用户发送消息,因为 spring 提供了convertAndSendToUser(username, destination, mes…...

【软件测试】我的2023面试经验谈
最近行业里有个苦涩的笑话:公司扛过了之前的三年,没扛过摘下最近的一年,真是让人想笑又笑不出来。年前听说政策的变化,大家都满怀希望觉得年后行情一片大好,工作岗位激增,至少能有更多的机会拥抱未来。然而…...

SpringBoot 整合JDBC
SpringData简介 Sping Data 官网:https://spring.io/projects/spring-data数据库相关的启动器 :可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.6.5/reference/htmlsingle/#using-boot-starter 整合JDBC 创建测试项目测试数据…...

TypeScript使用npm安装报错问题
问题如图: 问题原因: 权限不足导致,可以输入如下命令: sudo npm install i -g typescript该命令会要求输入登录密码相关,稍等片刻,即可安装成功。检测安装的命令: tsc -v...

2023国赛数学建模思路 - 复盘:人力资源安排的最优化模型
文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …...

学习pytorch 3 tensorboard的使用
tensorboard的使用 1. 安装2. add_scalar 查看函数图形3. 查看结果4. add_image() 查看训练步骤中间结果的图片 1. 安装 pytorch conda环境 pip install tensorboard pip install opencv-python2. add_scalar 查看函数图形 常用来查看 train val loss等函数图形 from torch…...
Linux 命令篇
一、启动网络命令 ip addr 查看网卡信息 service network start 启动网卡 service network stop 关闭网卡 service network restart 重启网络 二、pwd 命令 查看当前目录的路径 linux 下所有的绝对路径都是从根目录 "/" 开始 root:是linux下root用户的根目…...
OpenCV-SIFT算法详解
系列文章目录 文章目录 系列文章目录引言一、高斯金字塔二、高斯差分金字塔三、特征点处理四、特征点描述子总结 引言 SIFT算法是为了解决图片的匹配问题,想要从图像中提取一种对图像的大小和旋转变化保持鲁棒的特征,从而实现匹配。这一算法的灵感也十分…...
Java中的接口到底是什么?
要说Java的【接口】,可以将其类比为现实生活中的一种约定或规范。在Java中,接口定义了一组方法的集合,但没有提供这些方法的具体实现。 你可以将接口看作是一个合同,它规定了一个类必须实现的一组方法。这些方法描述了类所需具备…...

Jpa与Druid线程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久层
Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 (一)Jpa与Druid连接池及Spring Boot整合作为持久层,遇到系列问题,下面一 一记录: pom.xml 文件中加入必须的…...

helm部署vmalert
先决条件 安装以下软件包:git, kubectl, helm, helm-docs,请参阅本教程。 在 CentOS 上启用 snap 并安装 helm 启用 snapd 使用以下命令将 EPEL 存储库添加到您的系统中: sudo yum install epel-release 按如下方式安装 Snap࿱…...
加工厂数字孪生3D可视化展示系统重塑管理模式
近年来“数字化转型”成立各行业聚焦的发展方向,在工业制造领域,智慧工业数字孪生可视化平台作为一种新型的技术手段,或将成为助力企业跑赢数字化转型最后一公里。 提高生产效率 传统的生产方式往往需要大量的人工干预,不仅耗时耗…...

php从静态资源到动态内容
1、从HTML到PHP demo.php:后缀由html直接改为php,实际上当前页面已经变成了动态的php应用程序脚本 demo.php: 允许通过<?php ... ?>标签,添加php代码到当前脚本中 php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析 <!DOCTYPE html>…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...