资讯详情

视频分类Video-Swin-Transformer

视频分类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用于视频识别,也采用过分解的方法,通过分解编码器或分解自注意力,可以大大降低模型的规模,不会大大降低模型的性能。

https://github.com/SwinTransformer/Video-Swin-Transformer

二、环境安装

根据需要阅读git里面的README训练和测试模型,在这里记录一些问题。 这里主要提到两个包,MMCV和MMAction2 官方安装方式: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 以下两种方法都可以 1、pip install -v -e . 2、python setup.py develop

三、数据预测

一个简单的demo

from mmaction.apis import init_recognizer, inference_recognizer  config_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实时预测,里面有太多冗余的东西

四、更改源码

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

data['imgs_mapping'] = video_mapping 

传入7张图像组成的frame_array

不再使用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个有差别,本身这两个颗粒就有争议的。

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%匹配。我已经添加了一张图像,突出了正在写入的视频中的第一帧和正在读取的视频之间的差异。任何帮助都是非常感谢的 在这里插入图片描述

标签: 102k400vac瓷片电容221k400vac陶瓷电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台