视频异常检测数据集 (ShanghaiTech) 及其I3D特征转换

这篇具有很好参考价值的文章主要介绍了视频异常检测数据集 (ShanghaiTech) 及其I3D特征转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

ShanghaiTech是一个中型数据集,基本信息如下:

  1. 训练集:330个正常视频;
  2. 测试集:107个异常视频,已被划分为多个帧,包含13个异常事件,且带有。
    该数据集的一个示意如下图:
    视频异常检测数据集 (ShanghaiTech) 及其I3D特征转换

为了使得数据集适应MIL的场景,Zhong等人依据类别平衡的准则将整个数据集重新划分。划分的索引如下:
https://github.com/jx-zhong-for-academic-purpose/GCN-Anomaly-Detection

2 视频数据转换为I3D包

这里使用的预训练模型作为特征提取器,其中Mixed_5c层作为返回特征。

2.1 下载Torch-I3D模型:

地址如下:
https://github.com/piergiaj/pytorch-i3d
下载之后打开models:
视频异常检测数据集 (ShanghaiTech) 及其I3D特征转换
这里注意flow和rgb的区别:

  1. rgb:原始视频作为输入,通道为3;
  2. flow:视频的光流作为输入,通道为2;

关于光流的使用,可以参照我的博客:
https://inkiyinji.blog.csdn.net/article/details/127622063
这里使用的flownet而非flownet2,因为我的电脑没有GPU。。。

2.2 将视频转换为包

这里以单个视频为示意。设置划分后的最大视频片段数为32,每个片段的帧数固定为16:

  • 对于视频总帧数低于或者等于512帧的视频,从第1帧开始以每16帧为单位划分,最后一帧如果不足16帧,则替换为视频的后16帧;
  • 对于其它情况,将视频平分为32份,其中每一个片段在帧数维resize为16。

具体代码如下:

import decord
import os
import numpy as np
import torch
from imageio.v2 import imread
from gluoncv.torch.data.transforms.videotransforms import video_transforms, volume_transforms
from pytorch_i3d import InceptionI3d


class Video2I3D:

    def __init__(self, path, num_snippet=32, snippet_size=16, input_type="video", transformer=None):
        """
        Args:
            path: 视频存储路径
            num_snippet: 视频划分后的最大片段数
            snippet_size: 每个片段的数量,不得超过16,否则无法得到单向量;不得小于9,否则无法完成卷积
            input_type: 输入的数据类型:原始视频 (video) 或者视频帧 (frame)
            transformer: 视频转换器
        """
        self.path = path
        self.num_snippet = num_snippet
        self.snippet_size = snippet_size
        assert 9 <= self.snippet_size <= 16

        if input_type == "video":
            self.video = self.__load_video__()
        else:
            self.video = self.__load__frame()
        # self.video = np.transpose(self.video, [0, 3, 1, 2])

        self.transformer = self.__get_transformer__() if transformer is None else transformer
        self.i3d_net = self.__get_i3d_extractor()

    def fit(self):
        self.video = self.transformer(self.video)

        """Split each video"""
        # The frame number less than the split requirement
        if self.num_frame <= self.num_snippet * self.snippet_size:
            start_idx = np.arange(0, self.num_frame, self.snippet_size).tolist()
            end_idx = start_idx[1:] + [self.num_frame]
            if end_idx[-1] - start_idx[-1] < self.snippet_size:
                start_idx[-1] = end_idx[-1] - self.snippet_size
        else:
            start_idx = np.arange(0, self.num_frame, int(np.ceil(self.num_frame / self.num_snippet))).tolist()
            end_idx = start_idx[1:] + [self.num_frame]
            new_video = []
            for i, j in zip(start_idx, end_idx):
                video = self.video[:, i: j]
                video = video.resize_([3, self.snippet_size, video.shape[2], video.shape[3]])
                new_video.append(video)
            self.video = torch.hstack(new_video)
            start_idx = np.arange(0, self.num_snippet * self.snippet_size, self.snippet_size).tolist()
            end_idx = start_idx[1:] + [self.num_snippet * self.snippet_size]

        self.video = self.video.unsqueeze(0)
        bag = []
        for i, j in zip(start_idx, end_idx):
            video = self.video[:, :, i: j]
            if video.shape[2] == self.snippet_size:
                ins = self.i3d_net.extract_features(video).reshape(1, 1024)
                bag.append(ins)

        return torch.vstack(bag)

    def __load_video__(self):
        vr = decord.VideoReader(self.path)
        self.num_frame = vr.num_frame
        frame_id_list = np.arange(0, vr.num_frame).tolist()
        video = vr.get_batch(frame_id_list).asnumpy()
        # video_data = np.transpose(video_data, [0, 3, 1, 2])
        return video

    def __load__frame(self):
        frame_list = os.listdir(self.path)
        self.num_frame = len(frame_list)
        video = []
        for frame_name in frame_list:
            frame_path = os.path.join(self.path, frame_name)
            frame = imread(frame_path)
            frame = frame.reshape([1, frame.shape[0], frame.shape[1], frame.shape[2]])
            video.append(frame)

        video = np.vstack(video)

        return video

    @staticmethod
    def __get_transformer__():
        transform_fn = video_transforms.Compose([video_transforms.Resize(256, interpolation='bilinear'),
                                                 video_transforms.CenterCrop(size=(224, 224)),
                                                 volume_transforms.ClipToTensor(),
                                                 video_transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                                                            std=[0.229, 0.224, 0.225])])
        return transform_fn

    @staticmethod
    def __get_i3d_extractor():
        net = InceptionI3d(name="Mixed_5c")
        net.load_state_dict(torch.load("models/rgb_imagenet.pt"))
        return net

2.3 代码测试

以视频作为输入的代码:

if __name__ == '__main__':
    vi = Video2I3D(path="D:/Data/VAD/ShanghaiTech/training/videos/01_001.avi")
    print(vi.fit().shape)

以视频帧作为输入的代码:

if __name__ == '__main__':
    vi = Video2I3D(path="D:/Data/VAD/ShanghaiTech/testing/frames/01_0014/", input_type="frame")
    print(vi.fit().shape)

输出如下:文章来源地址https://www.toymoban.com/news/detail-417370.html

torch.Size([17, 1024])

到了这里,关于视频异常检测数据集 (ShanghaiTech) 及其I3D特征转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 视频异常检测 综述(二)

    大体上,视频异常检测方法使用两类表示:手工制作的特征和来自CNN的深度特征。 手工制作的特征 包括时空梯度、动态纹理、梯度直方图、流直方图、流场、密集轨迹和前景掩码。 深度特征 可以直接从预训练网络中提取,或者在优化与异常检测相关的特定任务时学习,例如

    2023年04月10日
    浏览(40)
  • OOD 使用基于提示的特征映射生成用于视频异常检测

    paper link 本文提出了使用 提示引导特征映射 的生成式视频异常检测框架,作者来自中山大学,文章发表在cvpr2023 作者首先分析了现有方法并指出当前面临的两个问题 大多数视频异常检测方法通过在训练阶段学习正常事件的分布,并在测试阶段检测分布外样本来决问题。显著的

    2024年02月09日
    浏览(56)
  • 3D异常检测论文笔记 | Shape-Guided Dual-Memory Learning for 3D Anomaly Detection

    参考:https://paperswithcode.com/sota/3d-anomaly-detection-and-segmentation-on 论文:https://openreview.net/pdf?id=IkSGn9fcPz code:https://github.com/jayliu0313/Shape-Guided 我们提出了一个形状引导的专家学习框架来解决无监督的三维异常检测问题。我们的方法是建立在两个专门的专家模型的有效性和他们的

    2024年02月09日
    浏览(72)
  • CVPR2023新作:3D视频物体检测

    Title: 3D Video Object Detection With Learnable Object-Centric Global Optimization Affiliation: 中国科学院自动化研究所 (Institute of Automation, Chinese Academy of Sciences),中国科学院大学人工智能学院 (School of Artificial Intelligence, University of Chinese Academy of Sciences),香港中文大学人工智能与机器人中心 (Ce

    2024年02月15日
    浏览(39)
  • 【论文阅读 09】融合门控自注意力机制的生成对抗网络视频异常检测

            2021年 中国图象图形学报 背景: 视频异常行为检测是智能监控技术的研究重点,广泛应用于社会安防领域。当前的挑战之一是如何提高异常检测的准确性,这需要有效地建模视频数据的空间维度和时间维度信息。生成对抗网络(GANs)因其结构优势而被广泛应用于视

    2024年02月03日
    浏览(46)
  • 用于无监督视频异常检测的合成伪异常:一种简单有效的基于掩码自动编码器的框架 论文阅读

    论文标题:SYNTHETIC PSEUDO ANOMALIES FOR UNSUPERVISED VIDEO ANOMALY DETECTION: A SIMPLE YET EFFICIENT FRAMEWORK BASED ON MASKED AUTOENCODER 文章信息: 发表于:ICASSP 2023(CCF B) 原文链接:https://arxiv.org/abs/2303.05112 源码:无 由于用于训练的异常样本的可用性有限,视频异常检测通常被视为一类分类问题

    2024年02月04日
    浏览(52)
  • 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测

    文章概述 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测 模型描述 IsolationFores算法它是一种集成算法(类似于随机森林)主要用于挖掘异常(Anomaly)数据,或者说离群点挖掘,总之是在一大堆数据中,找出与其它数据的规律不太符合的数据。该算法不采样任何基于聚

    2024年02月08日
    浏览(39)
  • ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测

    论文链接: https://arxiv.org/abs/2307.07205 视频异常检测(Video Anomaly Detection,VAD)扩展自经典的异常检测任务, 由于异常情况样本非常少见,因此经典的异常检测通常被定义为一类分类问题(One-Class Classification,OCC) 。而对于VAD而言,属于异常情况的样本更是非常罕见,因此常

    2024年02月09日
    浏览(56)
  • 【视频异常检测综述-论文阅读】Deep Video Anomaly Detection: Opportunities and Challenges

    来源:  Ren, Jing, et al. “Deep Video Anomaly Detection: Opportunities and Challenges.” 2021 International Conference on Data Mining Workshops (ICDMW), Dec. 2021. Crossref, https://doi.org/10.1109/icdmw53433.2021.00125. 文章连接:https://arxiv.org/abs/2110.05086 异常检测在各种研究环境中是一项热门而重要的任务,已经研究了

    2023年04月16日
    浏览(46)
  • 异常数据检测 | Python实现支持向量机(SVM)的异常数据检测

    文章概述 SVM通常应用于监督式学习,但OneClassSVM算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 模型描述 OneClassSVM的思想来源于这篇论文,SVM使用大边距的方法,它用于异

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包