PaddleVideo使用自己的数据集训练pp-tsm

  • 前言
  • 一:UCF101数据集
    • (1)UCF101视频数据
    • (2)UCF101标注文件
      • classInd.txt
      • testlist0x.txt
      • trainlist0x.txt
  • 二:Kinetics-400 数据
    • (1)视频部分
    • (2)标注文件
      • train.list
      • val.list
      • 标签列表
  • 三:制作自己的手势数据集
    • (1)视频录制
    • (2)生成标注文件
  • 四:使用paddlevideo训练pp-tsm模型
    • (1)环境配置
    • (2)上传数据集&配置文件到AIstudio项目
    • (3)配置pp-tsm训练配置文件
      • 1.git clone paddlevideo到videoPos项目
      • 2.下载backbone网络参数
      • 3.提取视频文件frame,加速训练
      • 4.生成视频文件的路径list
      • 5.生成frames文件和视频文件的路径list
      • 6.配置pp-tsm训练文件
    • (4)开始训练
  • 五:使用模型推理
    • (1)导出inference模型
    • (2)使用预测引擎推理
  • 六:结语

前言

计算机视觉发展到现在,视频理解任务已经得到了很大的重视,在处理时空图片数据时,TSM操作能够在相同二维网络算力的情况下进行时空建模,使用TSM构建的视频分类网络模型是一个非常经典的模型。但是本文的主要内容不是TSM的理解记录,而是通过百度开源的paddlevideo视频处理第三方库构建自己的视频分类数据集,并训练出自己的TSM网络模型。

一:UCF101数据集

如官网所说 UCF101 - Action Recognition Data Set,想要理解其更多信息可以到官网。这里主要是介绍它的文件布局以及标注文件内容格式。
UCF101数据集主要分为两部分,

(1)UCF101视频数据

一部分是视频数据,下载链接
文件布局格式是:

  • UCF101(主文件夹)

    • ApplyEyeMakeup(视频分类名称文件夹1)

      • v_ApplyEyeMakeup_g01_c01.avi(视频1)
      • v_ApplyEyeMakeup_g01_c02.avi(视频2)
    • ApplyLipstick(视频分类名称文件夹2)
      • v_ApplyLipstick_g01_c01.avi(视频1)
      • v_ApplyLipstick_g01_c02.avi(视频2)

(2)UCF101标注文件

另一部分是标注文件,下载地址
解压后文件布局格式为

  • ucfTrainTestlist

    • classInd.txt
    • testlist01.txt
    • testlist02.txt
    • testlist03.txt
    • trainlist01.txt
    • trainlist02.txt
    • trainlist03.txt

classInd.txt

第一列为标注编号,第二列为分类类名

1 ApplyEyeMakeup
2 ApplyLipstick
3 Archery
4 BabyCrawling
5 BalanceBeam
...

testlist0x.txt

测试标注文件,没有 标注信息,只有视频的路径

ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c02.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c03.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c04.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c05.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c06.avi
ApplyEyeMakeup/v_ApplyEyeMakeup_g02_c01.avi
...

trainlist0x.txt

第一列为视频路径,第二列为标注信息

ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c01.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c02.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c03.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c04.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c05.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g09_c01.avi 1
ApplyEyeMakeup/v_ApplyEyeMakeup_g09_c02.avi 1
...

二:Kinetics-400 数据

Kinetics-400是视频领域benchmark常用数据集,详细介绍可以参考其官方网站Kinetics。
K400数据集主要包含几部分,

(1)视频部分

视频被拆分成好几个rar压缩包,下载地址可以在官网上找到,或者直接重百度的paddlevideo团队分享的百度云盘链接获取。
网盘链接:https://pan.baidu.com/s/1S_CGBjWOUAuxL_cCX5kMPg
提取码:ppvi

使用是,把里面的压缩包逐个解压,再把解压后的文件夹里的各个类型的视频数据文件全都拷贝到一个文件夹里使用就行。

(2)标注文件

类别 数据条数 list文件
训练集 234619 train.list
验证集 19761 val.list

train.list

第一列为视频路径,第二类为标签

abseiling/0FsbjTIrBqw_000286_000296.mp4 0
abseiling/l8xsgLYzZVM_000011_000021.mp4 0
abseiling/pdW_enWrcgg_000061_000071.mp4 0
abseiling/j7lQcGkIIeM_000000_000010.mp4 0
abseiling/xYHDCgAK1qY_000008_000018.mp4 0
abseiling/M5Eurb5QPpA_000085_000095.mp4 0
abseiling/YJqm55DPThg_000533_000543.mp4 0

val.list

第一列为视频路径,第二列为标签

abseiling/3caPS4FHFF8.mp4 0
abseiling/XaH22IFN81Y.mp4 0
abseiling/EDgbHrT9H0U.mp4 0
abseiling/Ww61iwaFGrM.mp4 0
abseiling/z9vSfUWX4pI.mp4 0
abseiling/G9zN5TTuGO4.mp4 0
abseiling/rseBvhN6dio.mp4 0

标签列表

标签对应的类别可以到k400数据集的论文上查询。

三:制作自己的手势数据集

(1)视频录制

制作自己的手势数据集,只要将视频分好类,按照上面叙述UCF101视频数据或K400数据集格式放置即可。下面的代码是我录制手势视频的代码。
使用时,需要注意以下几点
1.设置好根目录和label
2.每次运行只能录制一种标注label的视频.
3.按 A ,将写入视频到视频文件中
4.按 S,将保存当前视频,视频序号加一,新建另一个视频文件
5.按 D,在按下S之前,再按A也不会保存视频。
6.按 Q,退出当前录制

#labelVideo.py
import os
import cv2
cap = cv2.VideoCapture(0)#根目录
basedir = "d:/video"
#标签
label = "click"
#序号
index = 0
#size 图片大小
size = (224,224)
#开启
on = FalsenowPath = "{}/{}".format(basedir,label)
if not os.path.exists(nowPath):os.makedirs(nowPath+"/")
print(nowPath)fourcc = cv2.VideoWriter_fourcc(*'XVID')
videowrite = cv2.VideoWriter(os.path.join(nowPath,"{}.avi".format(index)),fourcc,10, size)
while True:cat,frame = cap.read()cv2.imshow("{}_{}".format(label,index),frame)key = cv2.waitKey(0)if key&0xFF == ord("q"):breakelif key&0xFF == ord("s"):index += 1videowrite.release()fourcc = cv2.VideoWriter_fourcc(*'XVID')videowrite = cv2.VideoWriter(os.path.join(nowPath,"{}.avi".format(index)),fourcc,10, size)print(os.path.join(nowPath,"{}.avi".format(index)))on = True  #表示可写入文件elif key&0xFF == ord("d"):on = Falseelif key&0xFF == ord("a"):if on:resize = cv2.resize(frame,size)videowrite.write(resize)else:print(key)
cap.release()
videowrite.release()
cv2.destroyAllWindows()

(2)生成标注文件

这里生成出来的标注文件对标的是UCF101标注文件,但观察上面Kinetics-400 数据的标注文件,完全可以使用下面的生成的trainlist.txt取代Kinetics-400 数据的train.list和val.list。需要注意一点,因为个人制作的数据集较小,testlist.txt直接使用了所有的视频数据作为测试集。
使用也格外简单,直接将labelVideo.py里的basedir输入下面代码,然后设置targetDir输出路径运行就行。

#makelabel.py
import os
#图片数据集路径
baseDir = "d:/video"
#标注文件输出文件夹
targetDir = "d:/posTrainTest"if not os.path.exists(targetDir):os.makedirs(targetDir)
#classind.txt
labels = os.listdir(baseDir)
with open(os.path.join(targetDir,"classInd.txt"),"w+") as f:for i in range(len(labels)):line = "{} {}\n".format(i+1,labels[i])f.write(line)
#label
labels = dict([(labels[i],i+1) for i in range(len(labels))])
print(labels)#trainlist.txt
with open(os.path.join(targetDir,"trainlist.txt"),"w+") as f:for label in labels:index = os.listdir(os.path.join(baseDir,label))for i in index:line = "{}/{} {}\n".format(label,i,labels[label])f.write(line)
#testlist.txt
with open(os.path.join(targetDir,"testlist.txt"),"w+") as f:for label in labels:index = os.listdir(os.path.join(baseDir,label))for i in index:line = "{}/{}\n".format(label,i)f.write(line)

四:使用paddlevideo训练pp-tsm模型

本部分,将介绍如何使用上述的制作出来的个人数据集通过paddlevideo训练出自己的pp-tsm模型。

(1)环境配置

环境上,我个人强烈建议使用百度飞浆开发平台的AIStudio,每天可以白嫖8h的GPU算力,不香吗。当然也可以使用自己本地配置好的paddle环境进行开发,不过CUDA的配置异常麻烦。
在开始使用paddlevideo训练pp-tsm时,需要自己安装下面的几个python库

#paddle&paddlevideo
python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
pip install paddlevideo
#训练时会缺少一个扩展,这里给安上
pip install av

然后,再把paddlevideo的源码,给git clone下载,后续的配置文件和启动代码都需要在里面找

git clone https://github.com/PaddlePaddle/PaddleVideo.git

(2)上传数据集&配置文件到AIstudio项目

1.自行新建一个AIStudio的NoteBook项目,我这里命名为videoPos

2.将本地自己通过上面程序准备好的视频数据集上传到videoPos项目中
本地的文件夹如下,压缩为zip,上传并解压,需要注意的一点是,压缩后的文件大小需要限制在150M
视频数据集文件夹如图所示(这个需要你自行制作,我的数据,因本人靓照太靓仔,把闪瞎人眼,故不分享。)

AIstudio上传按钮如下图

3.使用上面的makelabel.py代码生成对应的标注文件,将三个标注文件classInd.txt,testlist.txt,trainlist.txt放入annotations文件夹,压缩上传到videoPos项目中并解压。

4.在videoPos项目的data文件夹里创建posvideo文件夹,将解压后的annotations文件夹与videos文件夹放到posvideo文件夹。如下图

(3)配置pp-tsm训练配置文件

1.git clone paddlevideo到videoPos项目

git clone https://github.com/PaddlePaddle/PaddleVideo.git

2.下载backbone网络参数

wget https://videotag.bj.bcebos.com/PaddleVideo/PretrainModel/ResNet50_vd_ssld_v2_pretrained.pdparams -P /home/aistudio/data

3.提取视频文件frame,加速训练

cd /home/aistudio/PaddleVideo/data/ucf101
python extract_rawframes.py /home/aistudio/data/posvideo/videos/ /home/aistudio/data/posvideo/rawframes/ --level 2 --ext avi

4.生成视频文件的路径list

进行这个操作的**/home/aistudio/PaddleVideo/data/ucf101/build_ucf101_file_list.py**代码文件需要做一些修改来适应我们制作的数据集下面画红线及红圈是需要修改的部分

#build_ucf101_file_list.py

修改后的代码

def parse_ucf101_splits(level):class_ind = [x.strip().split() for x in open('/home/aistudio/data/posvideo/annotations/classInd.txt')]class_mapping = {x[1]: int(x[0]) - 1 for x in class_ind}def line2rec(line):items = line.strip().split(' ')vid = items[0].split('.')[0]vid = '/'.join(vid.split('/')[-level:])label = class_mapping[items[0].split('/')[0]]return vid, labelsplits = []for i in range(1, 2):train_list = [line2rec(x)for x in open('/home/aistudio/data/posvideo/annotations/trainlist.txt')]test_list = [line2rec(x)for x in open('/home/aistudio/data/posvideo/annotations/testlist.txt')]splits.append((train_list, test_list))return splits

还有一点需要注释

上述修改完成后,可以直接使用下面命令进行生成视频文件的路径list

cd /home/aistudio/PaddleVideo/data/ucf101
python build_ucf101_file_list.py /home/aistudio/data/posvideo/videos/ --level 2 --format videos --out_list_path /home/aistudio/data/posvideo/

5.生成frames文件和视频文件的路径list

python build_ucf101_file_list.py /home/aistudio/data/posvideo/rawframes/ --level 2 --format rawframes --out_list_path /home/aistudio/data/posvideo/

6.配置pp-tsm训练文件

打开
/home/aistudio/PaddleVideo/configs/recognition/pptsm/pptsm_k400_frames_uniform.yaml
修改pretrained文件路径以及数据集的类别数num_classes

修改数据集的list文件路径

(4)开始训练

终于到了最激动的时刻,训练。

cd /home/aistudio/PaddleVideo
python -B -m paddle.distributed.launch --gpus="0"  --log_dir=/home/aistudio/log_pptsm  main.py  --validate -c /home/aistudio/PaddleVideo/configs/recognition/pptsm/pptsm_k400_frames_uniform.yaml

下图是成功启动训练的截图:

五:使用模型推理

(1)导出inference模型

cd /home/aistudio/PaddleVideo/
python tools/export_model.py -c /home/aistudio/PaddleVideo/configs/recognition/pptsm/pptsm_k400_frames_uniform.yaml \-p /home/aistudio/PaddleVideo/output/ppTSM/ppTSM_best.pdparams \-o /home/aistudio/inference/ppTSM

(2)使用预测引擎推理

cd /home/aistudio/PaddleVideo/
python tools/predict.py --input_file /home/aistudio/data/posvideo/videos/left/2.avi \--config /home/aistudio/PaddleVideo/configs/recognition/pptsm/pptsm_k400_frames_uniform.yaml\--model_file /home/aistudio/inference/ppTSM/ppTSM.pdmodel \--params_file /home/aistudio/inference/ppTSM/ppTSM.pdiparams \--use_gpu=True \--use_tensorrt=False

结果如下

六:结语

终于完整的把整个pp-tsm训练过程给描述下来了,本文仅使用了paddlevideo提供的测试代码对模型进行了使用测试,后续会继续写一篇关于paddle inference模型部署的文章。
最后,若觉得文章有用,狠狠的给我点赞吧!

PaddleVideo使用自己的数据集训练pp-tsm相关推荐

  1. Win10下手把手教你Mask R-CNN用自己的数据集训练(从labelme标记开始)

    对于Mask R-CNN的环境配置不了解的同学可以看我之前的博客,详细的讲了如何复现跑通demo https://blog.csdn.net/hesongzefairy/article/details ...

  2. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选

    作者 | pan_jinquan 来源 | CSDN博文精选 之前写了一篇博客<使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)&g ...

  3. 作者解读ICML接收论文:如何使用不止一个数据集训练神经网络模型?

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:欧明锋,浙江大学 导读:在实际的深度学习项目中,难免遇到多个相似数 ...

  4. 基于Keras搭建cifar10数据集训练预测Pipeline

    基于Keras搭建cifar10数据集训练预测Pipeline 钢笔先生关注 0.5412019.01.17 22:52:05字数 227阅读 500 Pipeline 本次训练模型的数据直接使用Ke ...

  5. caffe学习(五):cifar-10数据集训练及测试(Ubuntu)

    简介 网站链接:CIFAR-10 CIFAR-10数据集包括由10个类别的事物,每个事物各有6000张彩色图像,每张图片的大小是32*32. 整个数据集被分成了5个训练集和1个测试集,各有10000张 ...

  6. ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练、保存为pmml模型并重新载入pmml模型进而实现推理

    ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练.保存为pmml模型并重新载入pmml模型进而实现推理 目录 基于nyoka库利用LGBMClassifi ...

  7. DL之LSTM:基于tensorflow框架利用LSTM算法对气温数据集训练并回归预测

    DL之LSTM:基于tensorflow框架利用LSTM算法对气温数据集训练并回归预测 目录 输出结果 核心代码 输出结果 数据集 tensorboard可视化 iter: 0 loss: 0.010 ...

  8. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别、模型评估(99.4%)

    DL之CNN:利用自定义DeepConvNet[7+1]算法对mnist数据集训练实现手写数字识别.模型评估(99.4%) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 netwo ...

  9. DL之CNN:利用自定义DeepConvNet【7+1】算法对mnist数据集训练实现手写数字识别并预测(超过99%)

    DL之CNN:利用自定义DeepConvNet[7+1]算法对mnist数据集训练实现手写数字识别并预测(超过99%) 目录 输出结果 设计思路 核心代码 输出结果 准确度都在99%以上 1.出错记录 ...

最新文章

  1. “蚁人”不再是科幻!MIT最新研究,能把任何材料物体缩小1000倍 | Science
  2. csu 1554: SG Value 思维题
  3. c# GDI+画折线图(初级版本)
  4. 文件上传下载流程设计
  5. webpack最新版本_webpack小结-开发环境构建优化
  6. C++学习 ---- 系列文章
  7. Java架构师面试题系列之Dubbo面试专题(29题,含详细答案解析)
  8. iPhone 13需求强劲推动 分析师预计iPhone四季度将销售超过8000万部
  9. 分页查询超时问题(1)
  10. 数字城市杭州执法管理平台测试计划【软件测试与工程】
  11. Linux的netstat命令使用
  12. WPF获取窗口句柄的方法
  13. DragSortListView可拖拽ListView的注意事项
  14. 机械工程人工智能_机械工程中的人工智能
  15. Ubuntu安装显卡驱动教程
  16. vivado 下载程序出错:ERROR: [Labtools 27-3165] End of startup status: LOW
  17. java 输出图片流_java IO流读取图片供前台显示代码分享
  18. n维球体,n维椭球体体积公式证明
  19. 玩游戏计算机丢失msvcp,计算机丢失msvcp,因计算机丢失msvcp140
  20. 腾讯加盟:Kafka-on-Pulsar 项目迎来 2 位腾讯 Maintainer!

热门文章

  1. oracle1422,Oracle错误:数据泵导出时报错ORA-1422
  2. 【资料汇总】实用软件合集
  3. (附源码)计算机毕业设计SSM金融投资管理系统
  4. 一些微信的使用技巧,你知道多少呢?
  5. latex插图编号_Latex插图的几种方法
  6. Neuroimage | LMDA-Net第一作者亲自讲述其设计思想
  7. K9s 使用教程:如何高效管理 Kubernetes 集群
  8. 关于厦门宽带用户升级了FTTH光纤入户,从别的地方拿来的ITV机顶盒没有办法使用的解决办法...
  9. 高性能音频放大器OPA134PA的分析及应用
  10. 自然语言处理中的语言模型预训练方法(ELMo、GPT和BERT)