基于matlab基于预训练的膨胀双流卷积神经网络的视频分类器执行活动识别(附源码)

一、前言

此示例首先展示了如何使用基于预训练的膨胀 3-D (I3D) 双流卷积神经网络的视频分类器执行活动识别,然后展示了如何使用迁移学习来训练此类视频分类器使用 RGB 和来自视频的光流数据 [1]。

基于视觉的活动识别涉及使用一组视频帧预测物体的动作,例如走路、游泳或坐着。视频活动识别有很多应用,如人机交互、机器人学习、异常检测、监控、物体检测等。例如,在线预测来自多个摄像头的传入视频的多个动作对于机器人学习非常重要。与图像分类相比,使用视频的动作识别建模具有挑战性,因为视频数据集的地面实况数据不准确,视频中的参与者可以执行的各种手势,严重类不平衡的数据集,以及从头开始训练强大的分类器所需的大量数据。深度学习技术,如I3D双流卷积网络[1],R(2+1)D [4]和SlowFast [5],已经显示出使用迁移学习和在大型视频活动识别数据集(如Kinetics-400)上预先训练的网络在较小数据集上的性能有所提高[6]。注意:此示例需要用于膨胀 3D 视频分类的计算机视觉工具箱模型。可以从加载项资源管理器安装用于膨胀 3D 视频分类的计算机视觉工具箱模型。

二、使用预训练的充气 3D 视频分类器执行活动识别

下载预训练的膨胀 3D 视频分类器以及要执行活动识别的视频文件。下载的zip文件的大小约为89 MB。加载预训练的充气 3D 视频分类器。

显示预训练视频分类器的类标签名称。使用 和 读取和显示视频。选择10个随机选择的视频序列对视频进行分类,以统一覆盖整个文件以找到视频中占主导地位的动作类。使用该函数对视频文件进行分类。

三、训练用于手势识别的视频分类器

示例的这一部分显示了如何使用迁移学习训练上面显示的视频分类器。将变量设置为 使用预训练的视频分类器,而无需等待训练完成。

3.1下载训练和验证数

 此示例使用 HMDB3 数据集训练膨胀 3D (I51D) 视频分类器。使用此示例末尾列出的支持函数将 HMDB51 数据集下载到名为 的文件夹中。下载完成后,将 RAR 文件解压缩到文件夹中。接下来,使用此示例末尾列出的支持函数来确认下载和提取的文件已到位。

该数据集包含大约 2 GB 的视频数据,涉及 7000 个类别的 51 个剪辑,例如喝酒跑步握手。每个视频帧的高度为 240 像素,最小宽度为 176 像素。帧数范围从 18 到大约 1000。

为了减少训练时间,此示例训练活动识别网络对 5 个动作类进行分类,而不是数据集中的所有 51 个类。设置为使用所有 51 个类进行训练。

将数据集拆分为用于训练分类器的训练集和用于评估分类器的测试集。将 80% 的数据用于训练集,其余数据用于测试集。使用 和 从文件夹中创建标签信息,并通过从每个标签中随机选择一定比例的文件,将基于每个标签的数据拆分为训练数据集和测试数据集。

为了规范化网络的输入数据,数据集的最小值和最大值在附加到此示例的MAT文件中提供。

3.2加载数据集

此示例使用数据存储从视频文件中读取视频场景、相应的光流数据和相应的标签。

指定每次从数据存储读取数据时应将数据存储配置为输出的视频帧数。

此处使用值 64 来平衡内存使用情况和分类时间。要考虑的常见值是 16、32、64 或 128。使用更多帧有助于捕获其他时态信息,但需要更多的内存。您可能需要降低此值,具体取决于您的系统资源。需要进行实证分析以确定最佳帧数。

接下来,指定应将数据存储配置为输出的帧的高度和宽度。数据存储会自动将原始视频帧的大小调整为指定大小,以启用多个视频序列的批处理。

值 [112 112] 用于捕获视频场景中较长的时间关系,这有助于对持续时间较长的活动进行分类。大小的常见值是 [112 112]、[224 224] 或 [256 256]。较小的尺寸允许使用更多的视频帧,但代价是内存使用量、处理时间和空间分辨率。HMDB51数据集中视频帧的最小高度和宽度分别为240和176。如果要为数据存储指定大于最小值的帧大小(如 [256, 256]),请先使用 调整帧大小。与帧数一样,需要进行实证分析以确定最佳值。imresize

指定 RGB 视频子网和 I3D 视频分类器的光流子网的通道数。

使用帮助程序函数 配置两个用于加载数据的对象,一个用于训练,另一个用于验证。此示例末尾列出了帮助程序函数。每个数据存储读取一个视频文件以提供 RGB 数据和相应的标签信息。

3.3定义网络架构

I3D 网络

使用 3-D CNN 是从视频中提取时空特征的自然方法。您可以通过扩展二维过滤器并将内核池化为 3-D,从预先训练的 2-D 图像分类网络(如 Inception v1 或 ResNet-50)创建 I2D 网络。此过程重用从图像分类任务中学习的权重来引导视频识别任务。

下图是一个示例,显示了如何将 2-D 卷积层膨胀为 3-D 卷积层。膨胀涉及通过添加第三个维度(时间维度)来扩展滤波器大小、权重和偏差。

双流 I3D 网络

视频数据可以认为分为两部分:空间分量和时间分量。

  • 空间组件包含有关视频中对象的形状、纹理和颜色的信息。RGB 数据包含此信息。

  • 时间分量包括有关对象在帧中的运动的信息,并描绘了摄像机和场景中对象之间的重要运动。计算光流是从视频中提取时间信息的常用技术。

双流 CNN 包含一个空间子网和一个时间子网 [2]。与原始堆叠 RGB 帧相比,在密集光流和视频数据流上训练的卷积神经网络可以在有限的训练数据下获得更好的性能。下图显示了典型的双流 I3D 网络。

3.5 配置膨胀 3D (I3D) 视频分类器以进行迁移学习

在此示例中,您将创建一个基于 GoogLeNet 架构的 I3D 视频分类器,这是一个在 Kinetics-3 数据集上预训练的 400D 卷积神经网络视频分类器。

指定 GoogLeNet 作为 I3D 视频分类器的骨干卷积神经网络体系结构,该分类器包含两个子网,一个用于视频数据,另一个用于光流数据。

指定膨胀 3D 视频分类器的输入大小。从文件加载的结构中获取 RGB 和光流数据的最小值和最大值。需要这些值来规范化输入数据。使用该函数创建 I3D 视频分类器。指定视频分类器的模型名称。

3.6 扩充和预处理训练数据

数据增强提供了一种使用有限数据集进行训练的方法。对于基于网络输入大小的帧集合(即视频序列),视频数据的增强必须相同。细微的更改(例如翻译、裁剪或转换图像)可提供新的、独特的和独特的图像,您可以使用这些图像来训练强大的视频分类器。数据存储是读取和扩充数据集合的便捷方式。使用此示例末尾定义的支持函数扩充训练视频数据。

使用此示例末尾定义的 ,预处理训练视频数据以调整为膨胀的 3D 视频分类器输入大小。将视频分类器的属性和预处理函数的输入大小指定为结构中的字段值。该属性用于在 -1 和 1 之间重新缩放视频帧和光流数据。输入大小用于根据结构中的值调整视频帧的大小。或者,您可以使用 或 将输入数据随机裁剪或居中裁剪为视频分类器的输入大小。请注意,数据增强不适用于测试和验证数据。理想情况下,测试和验证数据应代表原始数据,并且不加修改以进行无偏评估。

创建本示例末尾列出的支持函数。该函数将 I3D 视频分类器、一小批输入数据和 以及一小批地面实况标签数据作为输入。该函数返回训练损失值、相对于分类器可学习参数的损失梯度以及分类器的小批量精度。

损失是通过计算来自每个子网的预测的交叉熵损失的平均值来计算的。网络的输出预测是每个类的 0 到 1 之间的概率。

3.7 训练 I3D 视频分类器

使用 RGB 视频数据和光流数据训练 I3D 视频分类器。

对于每个纪元:

  • 在循环访问小批量数据之前随机排列数据。

  • 用于循环访问小批量。本示例末尾列出的支持函数使用给定的训练数据存储来创建 .minibatchqueuecreateMiniBatchQueueminibatchqueue

  • 使用验证数据验证网络。dsVal

  • 使用本示例末尾列出的支持函数显示每个时期的损失和精度结果。displayVerboseOutputEveryEpoch

对于每个小批量:

  • 将视频数据或光流数据和标签转换为具有底层类型单一的对象。dlarray

  • 要使用 I3D 视频分类器处理视频数据的时间维度,请指定时态序列维度。为视频数据和标签数据指定维度标签(空间、空间、通道、时间、批次)。"T""SSCTB""CB"

该对象使用此示例末尾列出的支持函数对 RGB 视频和光流数据进行批处理。

四、评估训练的网络

使用测试数据集评估经过训练的视频分类器的准确性。

加载训练期间保存的最佳模型或使用预训练模型。创建一个对象以加载测试数据的批次。对于每批测试数据,使用 RGB 和光流网络进行预测,取预测的平均值,并使用混淆矩阵计算预测精度。计算已训练网络的平均分类精度。显示混淆矩阵。

在 Kinetics-3 数据集上预训练的 Inflated-400D 视频分类器为迁移学习中的人类活动识别提供了更好的性能。上述训练在 24GB Titan-X GPU 上运行了大约 100 分钟。在小型活动识别视频数据集上从头开始训练时,训练时间和收敛时间比预训练视频分类器花费的时间要长得多。使用 Kinetics-400 预训练的 Inflated-3D 视频分类器的 Transer 学习还可以避免在运行大量 epoch 时过度拟合分类器。但是,与膨胀的 2D 视频分类器相比,在 Kinetics-1 数据集上预训练的 SlowFast 视频分类器和 R(400+3)D 视频分类器在训练期间提供了更好的性能和更快的收敛。

五、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

程序下载:基于matlab基于预训练的膨胀双流卷积神经网络的视频分类器执行活动识别资源-CSDN文库

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

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

相关文章

PHY芯片的使用(一)之基本概念讲解(MII相关)2

今天想和大家交流一下MAC和PHY之间的接口MII。 MII(Media Independent Interface )是介质无关接口。MII接口定义了在MAC层和物理层之间传送数据和控制状态等信息的接口,它是10M和100M兼容的接口,经过扩展后还可以用于1000M的MAC层与物理层的接口&#x…

【国产复旦微FMQL45教程】-小试牛刀之LED

本教程采用 FMQL7045 FPGA开发板来完成整个试验,板卡照片如下: 具有丰富的接口资源,系统框图如下: 本教程用于完成基于Vivado的FMQL45的LED实验,目标是能够将这款开发板PL端先跑起来。 对于纯 PL 设计,我们…

计算机网络—局域网

文章目录 ARP协议以太网以太网帧结构交换机交换机的端口划分 PPP协议 MAC地址 封装在链路帧中的地址,作为每一个接口的地址。(一般是48bit大小) MAC地址是刻画到我们物理接口上的,我们的网卡一旦出厂之后就会携带一个唯一的物理地…

SAP 后台配置之FM基金管理篇

SAP FM基金管理后台配置及应用 1 二话不说先上后台配置,能跑通为先1.1 基础设置1.1.1 维护财务管理区1.1.2 分配财务管理区1.1.3 激活全局基金管理功能1.1.4 定义全局参数1.1.5 定义编号区间编号并分配1.1.6 创建更改层次变式1.1.3 激活科目分配元素1.1.4 设置允许空…

微信小程序 rich-text富文本框 怎么设置里面节点的样式

1、在JS中我们获取数据&#xff0c;在没有类名的情况下 使用正则匹配你想要添加演示的节点 res[1].data[0].f_content为rich-text里面的节点 如图 代码&#xff1a;让获取的节点中的图片的最大宽度为100%,高度为auto this.content res[1].data[0].f_content.replace(/\<…

Java泛型详解:为什么使用泛型?如何使用泛型?

Java泛型详解&#xff1a;为什么使用泛型&#xff1f;如何使用泛型&#xff1f; &#x1f498;一、为什么使用泛型&#xff1f;&#x1f498;二、如何使用泛型&#xff1f;&#x1f496;1. 泛型类的使用&#xff1a;&#x1f496;2. 泛型方法的使用&#xff1a;&#x1f496;3.…

Python高级教程:简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 FastAPI是一个高性能、易于使用、快速编写API的…

java实现布隆过滤器(手写和Guava库提供的)

目录 前言 布隆过滤器的原理 插入​编辑 查询 删除 布隆过滤器优缺点 优点&#xff1a; 缺点&#xff1a; 代码实现 方式一&#xff1a; Google Guava 提供的 BloomFilter 类来实现布隆过滤器 到底经过几次哈希计算 解决缓存穿透 方式二&#xff1a;手写 前言 在学…

Springboot 核心注解和基本配置解读

目录 1. Springboot 入门与原理 1.1 Springboot 简介 1.1.1 什么是Springboot 1.1.2 Springboot 主要优点 1.2 Springboot 相关注解 1.2.1 元注解 1.2.1.1 Target 1.2.1.2 Retention 1.2.2 Configuration 1.2.3 Import 1.2.3.1 直接注入 1.2.3.2 实现 ImportSelector…

基于Java+Vue前后端分离开放式教学评价管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

关于u(x,t)=f(x)*g(t)形式证明的思考

突然想起来&#xff0c;二维高斯函数是可以拆分成两个一维高斯函数相乘的&#xff1a; 原来在学概率论的时候&#xff0c;证明过&#xff0c;这只能说高斯函数可以&#xff0c;这是一个思路。 一维波动函数应该也是这个套路。 那么还有没有其他函数可以如此&#xff0c;有如此…

burpsuite踩坑(一)

今天在使用burpsuite的时候&#xff0c;能抓到https或者http的包。 但是repeater模块无法使用&#xff0c;而且放行包之后&#xff0c;会出现提示。 搞了半天&#xff0c;以为是证书的问题&#xff0c;或者是burp汉化版的原因&#xff0c;还把汉化版的burp给删除了。 发现都…