Python——基于pytorch的3D视频动作识别

这篇具有很好参考价值的文章主要介绍了Python——基于pytorch的3D视频动作识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        pytorch初接触——唐宇迪教教程的3D卷积视频动作识别。接触之后,发现pytorch比tensorflow的用户体验要好一点点,TF由于兼容性问题,从其他地方拿到代码,第一感觉就是跑不起来,很多代码都是基于TF1.x写的,跟2.x一堆不兼容问题。由此开始研究pytorch,后面用的顺手可能直接转pytorch,目前这个架构开始追赶TF。

        一、pytorch基本步骤

        python每个架构都有大致的操作步骤,学习过程中,查找API资料以及通过代码摸索,我总结了pytorch的基本操作步骤,如下:

        ①.定义model
        model = Model
        ②.定义参数、优化器、loss
        train_params = [{'params': params(model), 'lr': lr}]
        criterion = nn.CrossEntropyLoss()#loss function
        optimizer = optim.SGD(train_params,lr=lr,momentum=0.9,weight_decay=5e-4)
        ③.to decive
        model.to(device)
        criterion.to(device)
        ④.开始epoch循环
        for input, target in dataset:
            model.trian()
            inputs = Variable()
            labels = Varibale()
            optimizer.zero_grad()
            output = model(input)
            pre = nn.activaiton()
            loss = loss_fn(output, target)
            loss.backward()
            optimizer.step()

二、网络基本架构

        开始前需要配置环境,我使用的是torch1.13 + cuda11.6,GPU版本,安装后如果要知道是否能使用GPU进行计算,就使用这句代码:torch.cuda.is_available() ,输出为True即表示GPU可以使用。

        整个代码由几个部分组成:①.dataloader进行视频数据的处理;②train进行epoch训练;③inference进行预测。这个代码说是由一篇论文复现的,但我没有去看论文,model部分的代码直接复制唐宇迪源码(如有倾权,一定删除)。      

        1.dataloader数据处理

        这部分我觉得是重点,理解整个代码,在这里花费了很长时间。这部分的思路是:定义基本参数,例如截取视频帧的数量等——判断输出路径文件夹是否建立、文件夹中的jpg是否符合情况——处理视频数据。preprocess(self)这个函数的作用是判断有没有建立train\val\test三个文件夹,如果有没有的话就使用os.mkdir函数建立这三个文件夹,用于存放处理后的jpg文件。process_video(self,video,action_name,save_dir)这个函数就是正式开始处理视频,EXTRACT_FREQUENCY这个参数的目的是为了每隔4个frame截取一张图片,如果整个视频截取小于16张frame,那EXTRACT_FREQUENCY-1,直到能够凑够16张frame以上为止。以下为这两个函数源码:

    def preprocess(self):
        if not os.path.exists(self.output_dir):
            os.mkdir(self.output_dir)
            os.mkdir(os.path.join(self.output_dir,'train'))
            os.mkdir(os.path.join(self.output_dir, 'val'))
            os.mkdir(os.path.join(self.output_dir, 'test'))

        for file in os.listdir(self.root_dir):
            file_path = os.path.join(self.root_dir,file)
            video_files = [name for name in os.listdir(file_path)]
            train_and_valid, test = train_test_split(video_files,test_size=0.2,random_state=42)
            train,val = train_test_split(train_and_valid,test_size=0.2,random_state=42)

            train_dir = os.path.join(self.output_dir,'train',file)
            # print("train_dir is ",train_dir)
            val_dir = os.path.join(self.output_dir,'val',file)
            test_dir = os.path.join(self.output_dir,'test',file)
            if not os.path.exists(train_dir):
                os.mkdir(train_dir)
            if not os.path.exists(val_dir):
                os.mkdir(val_dir)
            if not os.path.exists(test_dir):
                os.mkdir(test_dir)

            for video in train:
                self.process_video(video,file,train_dir)
            for video in val:
                self.process_video(video, file, val_dir)
            for video in test:
                self.process_video(video, file, test_dir)
        print('Preprocessing finished')

    def process_video(self,video,action_name,save_dir):
        # video name:v_ApplyEyeMakeup_g01_c01.avi
        video_filename = video.split('.')[0]

        if not os.path.exists(os.path.join(save_dir,video_filename)):
            os.mkdir(os.path.join(save_dir,video_filename))
        capture = cv2.VideoCapture(os.path.join(self.root_dir,action_name,video))
        frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
        frame_width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
        frame_height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
        # Make sure splited video has at least 16 frames
        EXTRACT_FREQUENCY = 4
        if frame_count // EXTRACT_FREQUENCY <= 16:
            EXTRACT_FREQUENCY -= 1
            if frame_count // EXTRACT_FREQUENCY <= 16:
                EXTRACT_FREQUENCY -= 1
                if frame_count // EXTRACT_FREQUENCY <= 16:
                    EXTRACT_FREQUENCY -= 1

        count = 0
        i = 0
        retaining = True

        while (count < frame_count and retaining):
            retaining, frame = capture.read()
            if frame is None:
                continue
            # resize the img and save to save_dir
            if count % EXTRACT_FREQUENCY == 0:
                if (frame_height != self.resize_height) or (frame_width != self.resize_width):
                    frame = cv2.resize(frame, (self.resize_width, self.resize_height))
                cv2.imwrite(filename=os.path.join(save_dir, video_filename, '0000{}.jpg'.format(str(i))), img=frame)
                i += 1
            count += 1

        # Release the VideoCapture once it is no longer needed
        capture.release()

        2.train进行训练

        这里的模型采用C3D_model,3D卷积与2D卷积的最大区别在于多了一个时间维度T,是将视频拆解为多个frame,然后同时输出model中,将每一帧溶入到一个维度中,也就是现在的卷积核变为mxnxT,T对应多个图像。这里整个模型的参数如下:

nEpochs = 30#这里我只采用30个,跑一个需要10min,跑完这30个我花了5.5h,精度才到0.58
model = C3D_model.C3D(num_classes=num_classes,pretrained=False)
criterion = nn.CrossEntropyLoss()#loss function
optimizer = optim.SGD(train_params,lr=lr,momentum=0.9,weight_decay=5e-4)
model.to(device)
criterion.to(device)

        3.inference进行预测

        在执行这个代码时,程序在下面这里报错,信息显示在forward(inputs)这里有问题。

with torch.no_grad():
    outputs = model.forward(inputs)

        具体是view这里报错,查了网上的解决方案,需要在view前面加上.contiguous().这一段,随后就可以正常运行了。

x = x.contiguous().view(-1, 8192)

        我这边使用的配置是3060+6g的笔记本跑这个程序,30个epoch也只有0.58的准确率,用test数据测试的结果确实不是100%准确,如下图,结果应该是ApplyEyeMakeup,但识别到的是ApplyLipstick。

Python——基于pytorch的3D视频动作识别

 

整个项目的代码和下载链接在:https://download.csdn.net/download/wenpeitao/87346700文章来源地址https://www.toymoban.com/news/detail-404443.html

到了这里,关于Python——基于pytorch的3D视频动作识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于opencv与mediapipe的民族舞舞蹈动作识别

    需要项目的请关注、私信 Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。在这里我们要区分两个概念:图像处理和计算机视觉的区别:图像处理

    2024年02月10日
    浏览(58)
  • 基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

    骨骼动作识别 是 视频理解 领域的一项任务 1.1 视频数据的多种模态 RGB:使用最广,包含信息最多,从RGB可以得到Flow、Skeleton。但是处理需要较大的计算量 Flow:光流,主要包含运动信息,处理方式与RGB相同,一般用3D卷积 Audio:使用不多 Skeleton :骨骼关键点序列数据,即人

    2024年02月03日
    浏览(41)
  • 一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

    如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记;比如,需要提取视频中文案使用;比如,需要给视频加个字幕;这时候,只要把视频转

    2024年02月08日
    浏览(45)
  • Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

    ​ 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理 :首先,对输入图像进行预处理,包括读取图片、将图片灰度转换、修改图片的尺寸、绘制矩形

    2024年04月13日
    浏览(70)
  • 基于卷积神经网络的水果成熟度识别(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

    功能演示: 基于vgg16,resnet50卷积神经网络的水果成熟度识别,可识别苹果,香蕉,草莓,荔枝和芒果的成熟度(pytorch框架)_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1ae411C7N5/?spm_id_from=333.999.0.0vd_source=95b9b70984596ccebdb2780f0601b78b  基于卷积神经网络的水果成熟度识别系统是在

    2024年01月23日
    浏览(61)
  • 论文复现--关于单视角动作捕捉工具箱--MMHuman3d的研究(基于Windows10和Linux18.04中配置)

    分类:动作捕捉 github地址:https://github.com/open-mmlab/mmhuman3d 所需环境: Windows10,CUDA11.6,conda 4.13.0,Visual Studio 2017; Ubuntu18.04,conda22.9.0,CUDA11.4 注意: “Linux中的OpenMMlab全家桶的安装”是可以运行的 全家桶版本可以参考这部分 不是版本越新越好 ; “Windows10配置”仅讲述配

    2024年02月03日
    浏览(40)
  • 液滴接触角边界曲线识别—巧用Ovito

    关注 M r . m a t e r i a l   , color{Violet} rm Mr.material , Mr.material   , 更 color{red}{更} 更 多 color{blue}{多} 多 精 color{orange}{精} 精 彩 color{green}{彩} 彩 ! 主要专栏内容包括:   †《LAMMPS小技巧》: ‾ textbf{ underline{dag《LAMMPS小技巧》:}}   † 《 LAMMPS 小技巧》: ​ 主要介绍采

    2024年02月13日
    浏览(36)
  • 手势识别(二) - 静态手势动作识别

    我公司的科室开始在公众号上规划一些对外的技术文章了,包括实战项目、模型优化、端侧部署和一些深度学习任务基础知识,而我负责人体图象相关技术这一系列文章,偶尔也会出一些应用/代码解读等相关的文章。 文章在同步发布至公众号和博客,顺带做一波宣传。有兴

    2024年02月04日
    浏览(59)
  • 基于pytorch的车牌识别(一)

    1,熟悉训练数据集; 2,加载本地车牌数据集; 3,定义网络模型; 4,输入数据集训练模型; 5,保存模型在线推理; 6,GUI可视化 ; 本项目所有的数据都是基于CCPD2019数据集,CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注,主要采集于合肥市,

    2024年02月01日
    浏览(34)
  • 【人脸识别】基于facenet_pytorch实现人脸识别

            该代码可以在Pycharm、Jupyter、Python等Python编译器中运行,本文我使用的是Pycharm。 (一)安装pytorch(cpu)         首先在Pycharm中新建一个名为facenet_test的项目,并创建一个名为fp.py的Python文件。         打开PyTorch官网Start Locally | PyTorch,在主页中根据自己的电

    2024年02月04日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包