PaddleVideo使用自己的数据集训练pp-tsm
前言
计算机视觉发展到现在,视频理解任务已经得到了很大的重视,在处理时空图片数据时,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)
- …
- …
- ApplyEyeMakeup(视频分类名称文件夹1)
(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 = False
nowPath = "{}/{}".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"):
break
elif key&0xFF == ord("s"):
index += 1
videowrite.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 = False
elif 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, label
splits = []
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模型部署的文章。
最后,若觉得文章有用,狠狠的给我点赞吧!