使用UCF101完成的视频动作分类识别


前言

最近在研究使用UCF101数据集来训练出一个视频动作分类的神经网络。之前因为自己花了1.5w组了台台式就可以轻松跑深度学习,没想到果然是初生牛犊不怕虎,体验过才知道原来是这么吃GPU的…


提示:以下是本篇文章正文内容,下面我的案例可供参考

一、UCF101数据集简述及下载

    UCF101是一个常用的视频分类数据集,包含101个不同的动作类别。每个类别包含大约100到300段视频片段,总共约有13,000个视频片段。这些视频片段来自YouTube上的真实数据,每个视频片段的长度为大约10秒至30秒不等,分辨率为320x240或640x480。UCF101的目的是为了促进计算机视觉和机器学习领域中的行动识别研究。

    把UCF101里的视频全部切分成RGB图像就如下图所示了,本来我整理好放到阿里网盘的,但是发现阿里网盘目前不支持分享zip文件,那只好把切分好的全部RGB图像合包放到百度网盘了(无奈)。并且我进行了以3GB为大小的分包,但是用autoDL控制上传死活上传不到百度网盘,报错文件上传失败upload canceled,后面用自己电脑上传成功了。

链接: https://pan.baidu.com/s/1e13XBc5-sl4M4-s7ecYp-Q 提取码: ir6x

下载完后,windows就直接在同一个文件夹下解压即可,linux下先使用cat zip.* > jpegs_256.zip,接着解压就行。

二、使用Conv3D来处理

项目代码链接

0. 装好各种包

在终端下运行:

pip install numpy
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/cu111/torch_stable.html
pip install matplotlib==3.4.3
pip install scikit-learn==1.1.3

functions.py包含自定义的类库,各种工具函数。

1. 修改main.ipynb的path路径代码,然后运行main.ipynb的全部代码

# set path
# data_path为切割好的全部RGB图像目录路径
#data_path = "./jpegs_256/"    # define UCF-101 RGB data path
data_path = "../temp/jpegs_256/"
action_name_path = './UCF101actions.pkl' #全部动作的名字标签
save_model_path = "./CRNN_ckpt/" #模型参数存放路径
#fnames = os.listdir(data_path)
#fnames

    接着运行main.ipynb的全部代码即可,功能主要为完成epochs=15轮的迭代,保存每一轮的神经网络各层的参数pth,并且保存各轮的损失率loss和准确率score。最后绘制折线图,绘制以训练时期为横坐标、纵坐标分别为损失值和准确率为的两个折线图。
在这里插入图片描述

2. 修改prediction.ipynb的path路径代码,然后运行prediction.ipynb的全部代码

接下来使用UCF101的视频作为预测对象,扔进模型进行预测。

# set path
# data_path为预测的视频切割后的RGB图像目录路径
#data_path = "./jpegs_256/"    # define UCF-101 RGB data path
data_path = "../temp/jpegs_256/"
action_name_path = './UCF101actions.pkl' #全部动作的名字标签
save_model_path = "./CRNN_ckpt/" #将要使用的模型参数存放路径
#fnames = os.listdir(data_path)
#fnames

然后跑完prediction.ipynb的全部代码,会生成包含真实动作名称和预测动作名称文件UCF101_videos_prediction.pkl,用于接下来的结果可视化处理。

3. 运行check_video_predictions.ipynb代码

会提供所有真实标签和预测标签的结果表
在这里插入图片描述
并且会给出最后最后的预测准确率Accuracy
在这里插入图片描述

4. 模型训练好后,可以使用replot_score_loss.ipynb来进行绘图

    可以使用迭代中产生的trantest的损失率和准确率绘制折线图,效果同1的效果。
并且可以找出最准确的模型迭代编号,比如下图为编号14。也就准确率最高的迭代编号为14(3dcnn_epoch14、优化器参数3dcnn_optimizer_epoch14),那就可以使用第14号的pth文件来完成预测,效果我相信会不错,不过Conv3D还不是很给力,至少我训练的结果测试的结果才43%多而已,也可能是迭代次数只有15次的缘故()
在这里插入图片描述

5. 我跑此项目的情况

硬件配置如下,数据盘跑的时候给到的是100GB:
在这里插入图片描述
所花时间(从尾减去头的那段时间段)和GPU的占用率如下:
在这里插入图片描述

三、使用CRNN来处理

项目代码链接

0. 装好各种包

和上面的包情况一致。

1. 修改main.ipynb的path路径代码,然后运行main.ipynb的全部代码

# set path
# data_path为切割好的全部RGB图像目录路径
#data_path = "./jpegs_256/"    # define UCF-101 RGB data path
data_path = "../temp/jpegs_256/"
action_name_path = './UCF101actions.pkl' #全部动作的名字标签
save_model_path = "./CRNN_ckpt/" #模型参数存放路径
#fnames = os.listdir(data_path)
#fnames

    接着运行main.ipynb的全部代码即可,功能主要为完成epochs=15轮的迭代,保存每一轮的神经网络各层的参数pth,并且保存各轮的损失率loss和准确率score。最后绘制折线图,绘制以训练时期为横坐标、纵坐标分别为损失值和准确率为的两个折线图。
在这里插入图片描述

2. 修改prediction.ipynb的path路径代码,然后运行prediction.ipynb的全部代码

接下来使用UCF101的视频作为预测对象,扔进模型进行预测。

# set path
# data_path为预测的视频切割后的RGB图像目录路径
#data_path = "./jpegs_256/"    # define UCF-101 RGB data path
data_path = "../temp/jpegs_256/"
action_name_path = './UCF101actions.pkl' #全部动作的名字标签
save_model_path = "./CRNN_ckpt/" #将要使用的模型参数存放路径
#fnames = os.listdir(data_path)
#fnames

然后跑完prediction.ipynb的全部代码,会生成包含真实动作名称和预测动作名称文件UCF101_videos_prediction.pkl,用于接下来的结果可视化处理。
在这里插入图片描述

3. 运行check_video_predictions.ipynb代码

会提供所有真实标签和预测标签的结果表
在这里插入图片描述

并且会给出最后最后的预测准确率Accuracy
在这里插入图片描述

4. 模型训练好后,可以使用replot_score_loss.ipynb来进行绘图

    可以使用迭代中产生的trantest的损失率和准确率绘制折线图,效果同1的效果。
并且可以找出最准确的模型迭代编号,比如下图为编号93。也就准确率最高的迭代编号为93),那就可以使用第93号的pth文件来完成预测,效果我相信会不错,CRNN还是行的,我训练的结果测试的结果是66.34%,迭代次数为120。训练CRNN训练了好久,也花了不少钱。
在这里插入图片描述

5. 我训练此CRNN的情况

硬件配置如下,数据盘跑的时候给到的是100GB:
在这里插入图片描述

所花时间(从尾减去头的那段时间段)和GPU的占用率如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45732909/article/details/130509201