HoRain云--PyTorchVideo实战:从零开始构建高效视频分类模型

  

🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

PyTorchVideo与PyTorch Lightning的技术优势

第一步:数据集配置与加载

第二步:视频变换与数据增强

第三步:构建视频分类模型

第四步:使用PyTorch Lightning实现训练流程

第五步:执行训练过程

总结


img

视频理解作为机器学习的核心领域,为动作识别、视频摘要和监控等应用提供了技术基础。本教程将详细介绍如何利用PyTorchVideoPyTorch Lightning两个强大框架,构建基于Kinetics数据集训练的3D ResNet模型,实现高效的视频分类流程。

PyTorchVideo与PyTorch Lightning的技术优势

PyTorchVideo提供了视频处理专用的预构建模型、数据集和增强功能,极大简化了视频分析任务的实现复杂度。而PyTorch Lightning则通过抽象训练过程中的样板代码,使开发者能够专注于模型结构设计和核心业务逻辑,提升开发效率。这两个框架的结合为视频分类模型的开发提供了理想的技术栈。

下面将逐步讲解完整的实现过程。

第一步:数据集配置与加载

Kinetics数据集包含了大量带标签的人类行为识别视频。在使用该数据集前,需要通过官方脚本下载并组织数据,确保每个类别都有独立的文件夹存储相应视频。

我们使用LightningDataModule对数据集进行封装,这种方式可以有效组织训练、验证和测试数据集的加载流程:

 importos  
importpytorch_lightningaspl  
importpytorchvideo.data  
importtorch.utils.data  

classKineticsDataModule(pl.LightningDataModule):  
    _DATA_PATH="<path_to_kinetics_data_dir>"  
    _CLIP_DURATION=2  # 片段持续时间(秒)  
    _BATCH_SIZE=8  
    _NUM_WORKERS=8  
    deftrain_dataloader(self):  
        train_dataset=pytorchvideo.data.Kinetics(  
            data_path=os.path.join(self._DATA_PATH, "train"),  
            clip_sampler=pytorchvideo.data.make_clip_sampler("random", self._CLIP_DURATION),  
            decode_audio=False,  
        )  
        returntorch.utils.data.DataLoader(  
            train_dataset,  
            batch_size=self._BATCH_SIZE,  
            num_workers=self._NUM_WORKERS,  
        )  
    defval_dataloader(self):  
        val_dataset=pytorchvideo.data.Kinetics(  
            data_path=os.path.join(self._DATA_PATH, "val"),  
            clip_sampler=pytorchvideo.data.make_clip_sampler("uniform", self._CLIP_DURATION),  
            decode_audio=False,  
        )  
        returntorch.utils.data.DataLoader(  
            val_dataset,  
            batch_size=self._BATCH_SIZE,  
            num_workers=self._NUM_WORKERS,  
         )

第二步:视频变换与数据增强

视频数据的增强和预处理对模型性能具有关键影响。PyTorchVideo采用基于字典的变换方式,使得集成过程更加流畅高效。

在数据处理流程中,我们应用了多种关键变换技术:归一化操作调整视频像素值;时间子采样降低帧数以提高计算效率;空间增强通过裁剪、缩放和翻转增加数据多样性,从而提升模型的泛化能力。具体实现如下:

 frompytorchvideo.transformsimport (  
    ApplyTransformToKey, Normalize, RandomShortSideScale, UniformTemporalSubsample  
)  
fromtorchvision.transformsimportCompose, Lambda, RandomCrop, RandomHorizontalFlip  

classKineticsDataModule(pl.LightningDataModule):  
    # ... 前面的代码部分 ...  
    deftrain_dataloader(self):  
        train_transform=Compose([  
            ApplyTransformToKey(  
                key="video",  
                transform=Compose([  
                    UniformTemporalSubsample(8),  
                    Lambda(lambdax: x/255.0),  
                    Normalize((0.45, 0.45, 0.45), (0.225, 0.225, 0.225)),  
                    RandomShortSideScale(min_size=256, max_size=320),  
                    RandomCrop(244),  
                    RandomHorizontalFlip(p=0.5),  
                ]),  
            ),  
        ])  
        train_dataset=pytorchvideo.data.Kinetics(  
            data_path=os.path.join(self._DATA_PATH, "train"),  
            clip_sampler=pytorchvideo.data.make_clip_sampler("random", self._CLIP_DURATION),  
            transform=train_transform,  
        )  
        returntorch.utils.data.DataLoader(  
            train_dataset,  
            batch_size=self._BATCH_SIZE,  
            num_workers=self._NUM_WORKERS,  
         )

    第三步:构建视频分类模型

    本文中我们选择3D ResNet-50作为特征提取网络。PyTorchVideo提供了简洁的接口用于配置此类模型,使得模型构建过程变得直观且高效:

     importpytorchvideo.models.resnet  
    importtorch.nnasnn  
    
    defmake_kinetics_resnet():  
        returnpytorchvideo.models.resnet.create_resnet(  
            input_channel=3,  # RGB输入  
            model_depth=50,  # 50层ResNet  
            model_num_class=400,  # Kinetics数据集包含400个动作类别  
            norm=nn.BatchNorm3d,  
            activation=nn.ReLU,  
         )
    

      第四步:使用PyTorch Lightning实现训练流程

      接下来,我们将数据集和模型组合到LightningModule中。该类定义了训练和验证的核心逻辑,包括前向传播、损失计算以及优化器配置:

       importtorch  
      importtorch.nn.functionalasF  
      
      classVideoClassificationLightningModule(pl.LightningModule):  
          def__init__(self):  
              super().__init__()  
              self.model=make_kinetics_resnet()  
          defforward(self, x):  
              returnself.model(x)  
          deftraining_step(self, batch, batch_idx):  
              y_hat=self.model(batch["video"])  
              loss=F.cross_entropy(y_hat, batch["label"])  
              self.log("train_loss", loss.item())  
              returnloss  
          defvalidation_step(self, batch, batch_idx):  
              y_hat=self.model(batch["video"])  
              loss=F.cross_entropy(y_hat, batch["label"])  
              self.log("val_loss", loss)  
              returnloss  
          defconfigure_optimizers(self):  
               returntorch.optim.Adam(self.parameters(), lr=1e-3)
      

        第五步:执行训练过程

        最后,我们整合所有组件,使用PyTorch Lightning的Trainer启动训练流程:

         deftrain():  
             classification_module=VideoClassificationLightningModule()  
             data_module=KineticsDataModule()  
             trainer=pl.Trainer(max_epochs=10, gpus=1)  
             trainer.fit(classification_module, data_module)
        

          通过以上五个关键步骤,我们完成了一个完整的视频分类模型的构建与训练流程,充分利用了PyTorchVideo和PyTorch Lightning两个框架的优势,实现了高效且可扩展的视频分类系统。

          总结

          本文展示了如何使用PyTorchVideo和PyTorch Lightning构建视频分类模型的完整流程。通过合理的数据处理、模型设计和训练策略,我们能够高效地实现视频理解任务。希望本文能为您的视频分析项目提供有价值的参考和指导。

          ❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

          💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

          🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

          评论
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值