3D卷积入门 | 多论文笔记 | R2D C3D P3D MCx R(2+1)D

article/2025/10/14 15:32:22

文章转自微信公众号:【机器学习炼丹术】。有问题或者需要加入粉丝交流群可以私信作者~

文章目录

    • 0 前言
    • 1 R2D
    • 2 C3D
      • 2.1 R3D
    • 3 P3D
    • 4 MCx
    • 5 R(2+1)D

【前前沿】:某一次和粉丝交流的时候,收获一句话:

人点亮技能书,不是一次性电量的。是反复折腾,反复批判,反复否定与肯定,加深了记忆轴。 —某位粉丝

0 前言

看到这篇论文是因为之前看到一篇Nature上的某一篇医疗影像的论文中用到了这几个算法,R3D,MC3和R2+1D的3D卷积的算法。因为对3D卷积的算法了解比较局限,所以开始补一补这方面的算法。

1 R2D

这个就完全是把一个视频当成一个图片来处理,一个视频假设有10帧,那么就把这个视频当成一个10通道的图片进行处理,如果是10帧的彩色图片,那么这个就是30通道的图片。

正常情况下,一个视频是有四个维度的:
c h a n n e l × t i m e × h × w channel \times time \times h \times w channel×time×h×w

假设有一个10帧的1080x960的彩色视频,那么是个视频转换成张量应该是:

3 × 10 × 960 × 1080 3\times 10 \times 960\times 1080 3×10×960×1080

但是对于R2D算法来说,这个视频的张量为:

30 × 960 × 1080 30 \times 960 \times 1080 30×960×1080

这样的话,就完全的放弃了时间的信息。当然,与这个R2D类似的算法,还有一个叫做f-R2D的算法,这个f-R2D是对每一帧进行2D的操作,然后在最后全局池化层去融合全部的信息,某种角度上也是牺牲了时间连续的信息。

  • f-R2D是frame-based R2D的缩写。

2 C3D

这个就是使用了3D卷积的方法,对于3D卷积构建的网络,需要注意的就是池化层的时候需要注意stride的参数是3个,不仅有w和h的步长,还要考虑时间维度上的步长。

在C3D的论文中给出了这样的一个网络结构:

8个卷积层和2个全连接层,其中包含5个池化层(filter:2×2×2,stride: 2×2×2,除了第一个池化层的filter:1×2×2,stride: 1×2×2)

2.1 R3D

R2D和C3D我们都有所了解,那么什么是R3D呢?这个其实就是使用了Resnet网络的C3D罢了,由此可见,这个R3D的R的含义是Resnet网络的意思。

3 P3D

这个类似2D网络中的googleNet提出的inception中的概念,将7x7的卷积核拆分成1x7和7x1的两个。

P3D是Pseudo-3D伪3D卷积的含义,把3x3x3的卷积核拆分成1x3x3的空间卷积和3x1x1的时间卷积。这样做的好处有:

  • 减少计算量,这个是肯定的
  • 可以使用2D图像经典的卷积模型的训练参数作为3D模型的空间卷积层参数的初始化

P3D网络提出了3个不用的block,讲道理我觉得这三个差别不大:

再多说两句好了,P3D卷积把3D卷积解耦成2D的空间卷积和1D的时间卷积,这样可以防止在resnet的残差模块中,实现迁移学习:

关于这P3D的ABC三个样式的效果论文中也给出了结果:

效果最好的是P3D Resnet,这个是对三个模块的混合,混合顺序是:

P3D-A->P3D-B->P3D-C

但是我还是觉得这个有些冗余,没有什么道理。

4 MCx

这个方法是结合了R2D和R3D(C3D)两种方法,MC是Mixed Convolution混合卷积的含义。我们先看一下网络结构对比图:

  • 这个的MCx的结构是前面3层是2D卷积,之后跟上两个3D卷积,因为是有3层的2D卷积,之后才换成3D卷积的,所以这个叫做MC3;
  • 后面的rMCx是和MCx相反的,是先3D卷积,然后再2D卷积,这里是rMC3;
    先2D还是3D取决于:你认识时间的信息处理是依赖于浅层网络还是深层的网络。论文中给出的实验结果表明,时间信息应该更加依赖于深层的网络,MCx的效果更好一些。

5 R(2+1)D

这个和MCx同属于混合卷积,用2D卷积和1D卷积来逼近3D卷积。

其实从图中来看,这个和P3D-A没什么区别,其实我也觉得没什么区别。硬要说的话:

  • 就是P3D的第一层是2D卷积,之后才是P3D模块,而R(2+1)D的网络是从一开始都是这种模块的;
  • R(2+1)D模块计算了超参数,通过增加通道数,来让分解之后的R(2+1)D模型和之前的3D模型的参数量相同。这里是控制哪里的通道数呢?是2D卷积之后,要输入到1D时间卷积的那个特征图的通道数,从上图中可以看到 M i M_i Mi这个参数。这个参数可以通过这样计算:
    M i = f l o o r ( t d 2 N i − 1 N i d 2 N i − 1 + t N i ) M_i=floor(\frac{td^2N_{i-1}N_i}{d^2N_{i-1}+tN_i}) Mi=floor(d2Ni1+tNitd2Ni1Ni)

总之这个的好处,在论文中是跟C3D进行比较的(并没有和P3D进行比较):

  1. 第一就是两个子卷积之间多出来一个非线性操作,和原来同样参数量的3维卷积相比double了非线性操作,增强了网络的表达能力。
  2. 第二个好处就是时空分解让优化的过程也分解开来,事实上之前发现,3维时空卷积把空间信息和动态信息拧巴在一起,不容易优化。2+1维卷积更容易优化,loss更低。

上个图:


总结:总体来说3D卷积的论文是以实验为主,用实验结果来数结论。尽可能的利用2D预训练模型的参数。

参考论文:

  1. C3D:Learning Spatiotemporal Features with 3D Convolutional Networks
  2. P3D:Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks
  3. R(2+1)D:A Closer Look at Spatiotemporal Convolutions for Action Recognition

http://chatgpt.dhexx.cn/article/gHtxToTv.shtml

相关文章

基于pytorch实现的视频分类——C3D模型论文复现

最近在学习视频分类任务,想要跑通一个更换数据集用到自己的课题上。 看到了这篇文章及代码 论文链接:http://vlg.cs.dartmouth.edu/c3d/c3d_video.pdf 代码链接:https://github.com/jfzhang95/pytorch-video-recognition 贴一下学习这个代…

我的一些视觉工具(1)之动作预测--逐行详解C3D代码(Pytorch)

该博客主要参考这个工程提供的代码 我们在他们代码的基础之上进行魔改 当然了,既然要魔改人家的数据,肯定要先把人家的思路看明白。 对于3D神经网络来讲,好多小伙伴最关心的肯定还是数据的喂入方法和数据集的格式喽。 下第一个部分就是详细第…

C3D-network论文笔记

前几天一直在看Faster-Rcnn源码和YOLOv3(C语言)源码,感觉时间浪费了不少,但是一个都没有看懂,总结出一句话就是:这TM写的是个啥?我为啥一个都看不懂,原理理解是一回事,看…

c3d代码

##c3d代码 原文链接:https://blog.csdn.net/ZJRN1027/article/details/80199248 cross_entropy_mean tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(labelslabels,logitslogit) ) tf.summary.scalar( name_scope ‘_cross_entropy’, cross_en…

【C3D代码运行步骤】

1. 克隆或者下载项目 方法一:在github上直接下载项目:项目地址 方法二:使用git克隆(推荐),相关内容参考Git的安装及github远程仓库ssh连接 git clone https://github.com/Niki173/C3D.git https://github.com/jfzhan…

行为识别C3D代码(pytorch)实现过程及常见错误

行为识别C3D代码(pytorch)实现过程及常见错误 1.C3D网络代码 C3D(pytorch)实现代码链接: C3D代码 2.C3D代码复现过程 (1)环境版本要求 pytorch:3.5及以上 opencv:3.4.2(我是这样…

C3D的视频分类

很久之前做了C3D的视频分类,现在详细把整个项目的细节描述一下。 首先介绍一下C3D:对于一段视频来说,它是连续的帧图像叠加起来的,所以可以考虑在生成通道图像的时候,把多帧图像叠加的特性讨论进去。 一个视频段输入&…

C3D源码解读(基于3D卷积的动作识别)

UCF数据集下载地址:https://www.crcv.ucf.edu/data/UCF101.php 1.推理效果与项目配置 执行inference.py,需要指定3个参数,第一个是标签文件地址,存储了各个标签的含义,第二个是权重文件地址,第三个是要进行推理的视频…

C3D代码总结(Pytorch)

C3D代码总结(Pytorch) github:https://github.com/Niki173/C3D 介绍数据介绍文件介绍具体操作流程运行结果 介绍: 本次C3D模型用的是pytorch框架,我们在UCF101和HMDB51数据集上训练这些模型,本次实验以U…

C3D论文笔记

论文链接:http://vlg.cs.dartmouth.edu/c3d/c3d_video.pdf 代码链接:https://github.com/jfzhang95/pytorch-video-recognition 1. C3D是什么? C3D,全称Convolutional 3D,即3D卷积。3D卷积方法是把视频划分成很多固定…

C3D网络介绍

1. 模型简介 C3D模型广泛用于3D视觉任务。C3D网络的构造类似于常见的2D卷积网,主要区别在于C3D使用像卷积3D这样的3D操作,而2D卷积网则是通常的2D架构。要了解有关C3D网络的更多信息,您可以阅读原始论文学习3D卷积网络的时空特征。 3D卷积图…

视频分析模型(行为识别):C3D

C3D 文章目录 C3D1. 简介1.1 背景1.2 C3D特点1.3 视频描述符1.4 C3D的结果 2. 架构2.1 工作流程2.2 网络结构2.3 3D卷积和池化2.4 kernel 的时间深度 3. 可视化3.1 特征图3.2 特征嵌入 4. 应用场景4.1 动作识别4.2 动作相似度标注4.3 场景和目标识别4.4 运行时间分析 1. 简介 …

C3D论文精读

论文地址:https://vlg.cs.dartmouth.edu/c3d/c3d_video.pdf Abstract 作者的研究结果有三个方面: 1)与二维相比,三维卷积网更适合时空特征学习;2)所有层具有333的小卷积核的同构架构是3D卷积网的最佳架构之一;3)学习到的特征&am…

基于C3D网络的视频分析与动作识别

卷积神经网络(CNN)被广泛应用于计算机视觉中,包括分类、检测、分割等任务。这些任务一般都是针对图像进行的,使用的是二维卷积(即卷积核的维度为二维)。而对于基于视频分析的问题,2D convolutio…

《QDebug 2022年12月》

一、Qt Widgets 问题交流 二、Qt Quick 问题交流 1、在 C 中关联 QQuickWindow 的 closing 信号提示 "使用了未定义类型QQuickCloseEvent" 因为 closing 信号中的参数类型是 private 模块中定义的,但是通过第二句提示我们知道找到了完整定义才能使用 Q_…

4.4 案例8 用qDebug()输出信息

本案例对应的源代码目录:src/chapter04/ks04_04。 在开发C/S(Client/Server,客户端/服务端)模式的软件时,服务端程序(有时也称作服务)经常运行在两种模式下。 (1)终端模…

Qt扫盲-QDebug理论总结

QDebug理论使用总结 一、概述二、使用1. 基础使用2. 格式化选项3.将自定义类型写入流 一、概述 每当开发人员需要将调试或跟踪信息写入设备、文件、字符串或控制台时,都会使用QDebug。这个就可以方便我们调试,基本上Qt所有的内容都能通过调试打印出来&a…

Qt重定向QDebug,自定义一个简易的日志管理类

0.前言 相对于第三方的日志库,在 Qt 中使用 QDebug 打印更便捷,有时候也需要对 QDebug 输出进行重定向,如写入文件等。 在 Qt4 中使用 qInstallMsgHandler 函数设置重定向的函数指针: typedef void (*QtMsgHandler)(QtMsgType,…

qDebug 控制台输出

做个小笔记:qDebug 控制台输出 Ⅰ&#xff1a;*.pro文件中添加 win32:CONFIG console Ⅱ&#xff1a;配置项目运行设置&#xff0c;将Run in terminal 复选框打勾 Ⅲ&#xff1a;添加头文件 #include <QDebug> Ⅳ&#xff1a;用qDebug()<<"xxxx";输…

Qt ——debug调试

程序调试&#xff1a; 方法一&#xff1a;断点调试法方法二&#xff1a;使用qDebug()函数 方法一&#xff1a;断点调试法 我们可以在程序加断点&#xff0c;然后再利用单步调试查看变量的值是否异常。 1. 设置断点。 可以左击相应的代码行前的区域&#xff08;下图用红色框标…