视频分类Video-Swin-Transformer

article/2025/9/19 8:40:52

视频分类Video-Swin-Transformer


视频分类Video-Swin-Transformer

  • 视频分类Video-Swin-Transformer
  • 前言
  • 一、Video-Swin-Transformer
  • 二、环境安装
  • 三、数据预测
  • 四、对源码进行更改
  • 五、总结
  • 六、参考资料


前言

提示:这里可以添加本文要记录的大概内容:

星光不问赶路人,时光不负有心人。
时间就是这样转瞬即逝,没有时间停留,加油赶路人!


提示:以下是本篇文章正文内容,下面案例可供参考

一、Video-Swin-Transformer

在计算机视觉领域,模型正在从CNN 向Transformer转变,并且纯transformer架构在主要的视频识别方向获得了最高的精度,这些模型建立在能够在时间和空间维度上将patches全局连接起来的transformer层上。CNN向transformer的转变开始于vision transformer(ViT),它通过 transformer encoder对非重叠的图像快的空间关系进行全局建模,由于在图像上取得的巨大成功,使得开始了对于基于transformer的视频识别任务的研究。
之前的对于视频主干结构就是将用于图像的主干结构扩展到时间轴即可,如C3D,对于时间和空间联合建模,但这种方法既不经济也不容易优化,因此提出了一种对时空域进行分解的方法,该方法在速度和精度上有所折中。并且最初将transformer用于视频识别是,也采用过分解的方法,通过分解编码器或者分解自注意力,这种方法能够极大的减小模型的规模,同时不会大幅降低模型的性能。

更多详细内容查看官方git:
https://github.com/SwinTransformer/Video-Swin-Transformer

二、环境安装

根据需要阅读git里面的README即可,训练和测试模型,这里记录一些问题即可。
1、环境安装
这里主要提到两个包,MMCV和MMAction2
mmcv安装官方给的安装,直接pip安装安不上,也会报错
官方安装方式:https://github.com/open-mmlab/mmcv/blob/master/README_zh-CN.md
例如:pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html
MMAction2安装
下面两种方式都可以
1、pip install -v -e .
2、python setup.py develop

三、数据预测

1、训练后进行验证
一个简单的demo

from mmaction.apis import init_recognizer, inference_recognizerconfig_file = '../configs/recognition/tsn/tsn_r50_video_inference_1x1x3_100e_kinetics400_rgb.py'
# download the checkpoint from model zoo and put it in `checkpoints/`
checkpoint_file = '../checkpoints/tsn_r50_1x1x3_100e_kinetics400_rgb_20200614-e508be42.pth'# build the model from a config file and a checkpoint file
model = init_recognizer(config_file, checkpoint_file, device='cpu')# test a single video and show the result:
video = 'demo.mp4'
label = 'label_map_k400.txt'
results = inference_recognizer(model, video, label)# show the results
for result in results:print(f'{result[0]}: ', result[1])

具体实现需要按照工程自己实现,不要使用test.py进行实时预测,里面冗余的东西太多

四、对源码进行更改

1、某些使用的包
下面谈一下在工程上需要进行更改的几个包
inference.py
位置: Video_swin\mmaction\apis\inference.py
对应inference_recognizer函数,根据自己的需要进行更改,比如当时我们要训练时候使用的是7张不同光照角度的同一张显微图像,开始是将7张图像合成视频进行分类,但会产生一些中间文件,为了避免产生,我们修改了原始代码,在inference_recognizer函数加入video_mapping,然后赋值给data

data['imgs_mapping'] = video_mapping

传入7张图像组成的frame_array
loading.py
Video_swin\mmaction\datasets\pipelines\loading.py
同时在loading.py文件需要定义DecordInit类,

 container = decord.VideoReader(file_obj, num_threads=self.num_threads)

不再使用decord.VideoReader对视频进行解码,使用自己合成相同维度的矩阵进行替换。

results['video_reader'] = results['imgs_mapping']
results['total_frames'] = len(results['imgs_mapping'])

还需要替换DecordDecode类,因为有类型错误

 frame_dict = {# idx: container[idx].asnumpy()idx: container[idx]for idx in np.unique(frame_inds)}

这样所有的代码更改完毕,如若更改,最好还是自己单独写一个类,毕竟改的是环境的代码,后面想跑原始数据,还需要更改回来。

注意这里有一个问题:
使用cv.imread()加载每一张图像以后形成的frame_array和使用视频解码器decord.VideoReader解码出的frame_array是有差别的,每个映射矩阵的数字在相同的位置差5(例如[144 130 130] 、[145 133 133])以至于预测结果会有偏差,大部分实在得分上,类别差的并不大,100个视频中只有2个有差别,本身这两个颗粒就有争议的。

这里展示一个博客来说的cv.imread()和decord.VideoReader差异
https://cloud.tencent.com/developer/ask/sof/1048047/answer/1474354

我正在使用opencv VideoWriter函数从摄像头捕获视频并保存它们。我将捕获的视频保存为未压缩的avi文件。当我完成录制视频时,我有另一个脚本,它应该逐帧读取视频,处理像素值。然而,当我尝试读取保存的视频的帧时,像素值有点偏离。

例如,比较正在写入的视频的第一帧和正在读取的视频(假设100%相同),我注意到像素值偏离了一个很小的数字(RGB值偏离了一个很小的数字,通常小于5)。

我已经确保我在写视频和阅读视频时使用的是完全相同的视频索引(下面的检查代码)

def write_video():out = cv2.VideoWriter("encrypted.avi" ,cv2.VideoWriter_fourcc(*'XVID'),30, (640,480))foreach frame:out.write(frame)def read_video():cap = cv2.VideoCapture("encrypted.avi")cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter_fourcc(*'XVID'))while(cap.isOpened()):ret, frame = cap.read()

对于我的应用程序,正在写入和读取的帧应该100%匹配。我已经添加了一张图像,突出了正在写入的视频中的第一帧和正在读取的视频之间的差异。任何帮助都是非常感谢的
在这里插入图片描述

五、总结

Video-Swin-Transformer代码值得深度学习,可以看看每个模块对数据的处理等,这个模型的工程化在我看来非常完美,从导包到数据处理到训练模型和最后解码,都值得细细的去品。
举一个例子:
我们来看一下他的configs

test_pipeline = [dict(type='DecordInit'),dict(type='SampleFrames',clip_len=32,frame_interval=2,num_clips=1,test_mode=True),dict(type='DecordDecode'),dict(type='Resize', scale=(-1, 256)),dict(type='CenterCrop', crop_size=224),dict(type='Flip', flip_ratio=0),dict(type='Normalize', **img_norm_cfg),dict(type='FormatShape', input_format='NCTHW'),dict(type='Collect', keys=['imgs', 'label'], meta_keys=[]),dict(type='ToTensor', keys=['imgs'])

从config中数据需要的处理就直接定义了,数据的整个流程都都写道这里面了,所以很好的代码,值得新人细细的学习一下

六、参考资料

https://github.com/SwinTransformer/Video-Swin-Transformer
https://cloud.tencent.com/developer/ask/sof/1048047/answer/1474354
https://blog.csdn.net/weixin_59340037/article/details/123635235


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

相关文章

Python - MoviePy 处理音视频

文章目录 一、关于 MoviePy相关教程安装工作原理 二、音频获取音频信息切割拼接音频叠加音频循环播放格式转换视频提取音频 三、视频获取视频信息预览视频视频/Gif 提取图片图片生成视频 / gif图片 音乐合成视频视频提取 gif视频添加文字视频拼接 concatenate_videoclips堆叠 …

音视频处理

问题背景:h265格式的视频转码之后ios存在兼容问题 原转码命令: /usr/local/bin/ffmpeg -y -i /data/tmp/1672385812000-tks3wa.mp4 -vf scale720:1281 -r 30 /data/tmp/1672385812000-tks3wa_720.mp4 -hide_banner解决办法: // 原视频格式为…

tune a video:one-shot tuning of image diffusion models for text-to-video generation

【Diffusion Models】新加坡国立大学、腾讯强强联手Tune-A-Video:One-Shot微调图像扩散模型用于文本到图像的生成!_哔哩哔哩_bilibili【Diffusion Models】新加坡国立大学、腾讯强强联手Tune-A-Video:One-Shot微调图像扩散模型用于文本到图像…

视频 处理

案例 Fu Xianjun. All Rights Reserved. 一.视频信号 视频信号(以下称为视频)是非常重要的视频信息来源,它是信息处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的。这一系列图像被称为帧,帧是以固定…

用Python剪辑视频?太简单了

人生苦短,快学Python! 最近我在网上下载一个视频,结果下载到本地是近百个视频片段,为了方便观看只能将这些片段合并为一个视频整体。 不过我并没有搜到能够处理类似情况的小工具,只是发现剪映等软件可以实现视频合并功…

图片与视频的处理

1.首先需要在mac上安装ffmpeg(参考社区的安装教程) 需要先安装drew 然后再安装ffmpeg 2.使用dlib工具进行人脸识别,获取特征点,并输出人脸坐标 import cv2 import dlib import numpy as np import matplotlib.pyplot as pltpat…

基本全局阈值处理

基本全局阈值处理 1、全局阈值处理 (1)计算步骤 通常,在图像处理中首选的方法是使用一种能基于图像数据自动地选择阈值的算法,为了自动选阈值,下列迭代过程采用的就是这样的方法: (1) 针对全局阈值选择初…

基本的全局阈值处理Otsu方法进行最佳全局阈值处理

前言 图像阈值处理在图像分割中处于核心地位!本节将重点介绍一些常见的阈值处理方法。 一、基本的全局阈值处理 选取阈值往往是通过直方图来选择的,一方面我们可以人为的设置一个阈值进行一次二值化处理达到全局阈值处理的目的,但这样的阈值…

阈值调整

1.不平衡分类问题的阈值调整 如上图所示,正负例样本不平衡,负样本多,分类器就会更容易把图片分成负样本,因此要设置阈值, 如何选择阈值: 1.ROC曲线上的最优阈值 2.PR曲线上的最优阈值

神经网络阈值是什么意思,神经网络阈值如何确定

BP神经网络中初始权值和阈值的设定 1、首先需要了解BP神经网络是一种多层前馈网络。2、以看一下在matlab中BP神经网络的训练函数,有梯度下降法traingd,弹性梯度下降法trainrp,自适应lr梯度下降法traingda等。 3、在matlab中命令行窗口中定义输入P&…

图像的阈值处理

一般情况下,一张图片分为前景和背景,我们感兴趣的一般的是前景部分,所以我们一般使用阈值将前景和背景分割开来,使我们感兴趣的图像的像素值为1,不感兴趣的我0,有时一张图我们会有几个不同的感兴趣区域&…

神经网络阈值是什么意思,神经网络的权值和阈值

神经网络权值怎么确定? 神经网络的权值是通过对网络的训练得到的。如果使用MATLAB的话不要自己设定,newff之后会自动赋值。也可以手动:{};{}。一般来说输入归一化,那么w和b取0-1的随机数就行。 神经网络的权值确定的目的是为了让…

opencv c++ 二值图像、阈值计算方法、全局阈值、自适应阈值

1、图像定义: 彩色图像 :三通道,像素值一般为0~255; 灰度图像:单通道,像素值一般为0~255; 二值图像:单通道,像素值一般为0(黑色)、255&#xff08…

图像分割 - 阈值处理 - 全局阈值处理

目录 1. 介绍 2. 代码实现 3. 代码讲解 1. 介绍 当目标和背景像素的灰度分布非常不同的时候,可以对整个图像使用全局阈值 在大多数的应用中,图像之间通常存在足够的变化,全局阈值是一种合适的办法。所以,需要一种对图像做阈值…

硬阈值 软阈值

1 定义 1.1 硬阈值 硬阈值的定义如下: 相当于 1.2 软阈值 软阈值的定义如下: 相当于 1.3 二者对比(可视化解释) 这是一张很经典地表述软阈值和硬阈值区别的图,其中软阈值是蓝色的线,他没有突变&#xff1…

神经网络阈值是什么意思,神经网络阈值怎么设置

BP神经网络中初始权值和阈值的设定 1、首先需要了解BP神经网络是一种多层前馈网络。2、以看一下在matlab中BP神经网络的训练函数,有梯度下降法traingd,弹性梯度下降法trainrp,自适应lr梯度下降法traingda等。 3、在matlab中命令行窗口中定义输入P&…

图像处理--阈值处理

图像二值化 图像二值化就是将图像上的像素点的灰度值设置为两个值,一般为0(表示黑色)和255(表示白色),可以将整个图像呈现出明显的黑白效果。 最常用的方法就是先将图像灰度处理,然后设定一个阈…

两种划分阈值的方法

风险等级划分的时候可以降低主观性的一些系统方法 方法一:分层聚类法 凝聚层次聚类/分裂层次聚类 重点:确定层次聚类的簇数,画出树状图,基本就能得到你的区间范围,但数据量大的时候还是得再用代码跑 方法二&#xf…

“阀值”与“阈值”的区别

真相请看下图红色框里内容(手动微笑) 啥??你跟我说没看懂,好吧,说的再明白点,“阀(f)值”是一个错误的用词,其正确用法是“阈(y)值”。…

【p116】

#查询score表中为196004,课程号为1201的学生成绩 #查询student表中姓周的学生情况 #查询数学成绩第2~5名的信息 #查询通信专业最高分的学生的情况 #查询1004课程的最高分,最低分,平均成绩 #查询至少有3名学生选修且以4开头的课程号和平均分数 #将计算机专…