qiuzitao深度学习之PyTorch实战(十六)

史上最简单、实际、通俗易懂的PyTorch实战系列教程!(新手友好、小白请进、建议收藏)

基于3D卷积的视频分析与动作识别

一、3D卷积原理解读

视频就是一帧一帧的图像按照时间拼接组成的,3D卷积就是比2D的卷积多了个时间维度。

在这里插入图片描述
在这里插入图片描述

二、UCF 101动作识别数据集简介

UCF 101动作识别数据集官网地址下载:https://www.crcv.ucf.edu/data/UCF101.php

在这里插入图片描述

101类视频,每一类里面是一个人在做一类的动作,比如射击、画口红、画眼线等等,数据集有6.5G,我也上传了网盘供大家下载或者大家自己去数据集的官网下载。

UCF101数据集的操作类别为:涂抹眼妆,涂抹口红,射箭,婴儿爬行,平衡木,乐队游行,棒球场,篮球投篮,篮球扣篮,卧推,骑自行车,台球射击,吹干头发,吹蜡烛,体重蹲,保龄球,拳击沙袋,拳击速度袋,蛙泳,刷牙,清洁和挺举,悬崖跳水,板球保龄球,板球射击,在厨房切割,潜水,打鼓,击剑,曲棍球罚款,地板体操,飞盘接球,前爬网,高尔夫挥杆,理发,链球掷,锤击,倒立俯卧撑,倒立行走,头部按摩,跳高,跑马,骑马,呼啦圈,冰舞,标枪掷,杂耍球,跳绳,跳跃杰克,皮划艇,针织,跳远,刺,阅兵,混合击球手,拖地板,修女夹头,双杠,披萨折腾,弹吉他,弹钢琴,弹塔布拉琴,弹小提琴,弹大提琴,弹Daf,弹Dhol,弹长笛,弹奏Sitar,撑竿跳高,鞍马,引体向上,拳打,俯卧撑,漂流,室内攀岩,爬绳,划船,莎莎旋转,剃胡子,铅球,滑冰登机,滑雪,Skijet,跳伞,足球杂耍,足球罚球,静环,相扑,冲浪,秋千,乒乓球拍,太极拳,网球秋千,投掷铁饼,蹦床跳跃,打字,高低杠,排球突刺,与狗同行,墙上俯卧撑,在船上写字,溜溜球。剃胡须,铅球,滑冰登机,滑雪,Skijet,跳伞,足球杂耍,足球罚款,静物环,相扑,冲浪,秋千,乒乓球射击,太极拳,网球秋千,掷铁饼,蹦床跳跃,打字,不均匀酒吧,排球突刺,与狗同行,壁式俯卧撑,在船上写字,溜溜球。剃胡须,铅球,滑冰登机,滑雪,Skijet,跳伞,足球杂耍,足球罚款,静物环,相扑,冲浪,秋千,乒乓球射击,太极拳,网球秋千,掷铁饼,蹦床跳跃,打字,不均匀酒吧,排球突刺,与狗同行,壁式俯卧撑,在船上写字,溜溜球。

在这里插入图片描述

三、《基于3D卷积的视频分析与动作识别》项目实战

代码链接:https://pan.baidu.com/s/1rEVP8jJB2HGKukfFK2nIGQ
提取码:agpd

3.1、测试效果与项目配置

记得把上面下载好的数据在工程文件夹同目录下创建一个data文件夹放解压的数据,然后才能运行测试,已经训练了100代的模型给大家测试了。运行 inference.py 就可以进行测试了。

在这里插入图片描述
训练的话,在 mypath 这个地方得设置一下路径,新建一个 data_process 文件夹。然后先运行 dataset.py 对数据进行一个处理,然后在用 train.py 训练,不过因为数据集的原因,可能会跑个几天吧,训练很久的。

在这里插入图片描述
这些就是数据预处理的结果,把视频预处理成一张张图片,也把数据集分成了训练集测试集验证集。

在这里插入图片描述
在这里插入图片描述

3.2、视频数据预处理方法

dataset 这里我们得到两个路径,第一个就是我们从哪去读这个数据(self.root_dir),第二个就是保存预处理数据的路径(self.output_dir)。

然后要进行一个resize操作,操作后每一帧的规格才会相同。

在这里插入图片描述
接下来要创建三个文件夹,然后遍历101类的类别文件夹当中的类别名字,也就是数据标签,把数据集按比例拆分:train、val、test

在这里插入图片描述
然后取数据,我们不一帧一帧取,这样子太相似了,我们每 4 帧取一帧。判断如果一共取出来的特征少于 16 了,我们就-1,隔3帧取一帧,再少于16再 -1,再少于16再-1。

在这里插入图片描述

然后再将取出来的那些图片做一个处理,resize操作呀等等,然后再写进去存储的文件夹。

在这里插入图片描述

3.3、数据Batch制作方法

先把数据读进来
然后再去截取16张图片,self.crop(),就是我们一帧一帧的视频可能不止16张,但我们一次要16张,取哪16张呢,这就是我们从哪开始截取了,而不是随机取16张的。然后重新去截取区域的 h 和 w ,这里是112*112。

在这里插入图片描述
在这里插入图片描述
这里的16就是一次(一个样本)读取16帧(16张)的图片。batch_size = 6 ,就是一次拿6个样本去训练。

在这里插入图片描述

3.4、3D卷积网络所涉及模块

初始化网络参数,卷积-池化-卷积-池化,现在是3d就改为 nn.Conv3d,然后kernel_size = (3,3,3),比之前多了一个维度,多了一个3,每3帧提取一个特征。然后MaxPool3d比之前多了个3d,kernel_size = (1,2,2)这里的1就是在时间维度上不去压缩,其他都变成原来的二分之一。往下的卷积池化就正常了,时间维度也会去压缩了。最后的全连接层的8192就是卷积池化后得到的特征图的大小,然后再转化成4096维,然后再转化成几类,最后再加 dropout 和 relu 激活函数,完事。

在这里插入图片描述

3.5、训练网络模型

前向传播一开始的网络结构变化和输出

在这里插入图片描述
模型保存操作

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qiuzitao/article/details/109449586
今日推荐