什么是手势识别?
手势是人类表达信息的重要途径之一,通过手势识别,我们可以获得表达者所要表达信息(例如对方竖起大拇指,表达了对方的表扬之意)。本项目将基于PaddleVideo来训练一个手势识别模型,利用模型对七种手势进行识别,分别是点击、放大、向下滑动、向上滑动、缩小、旋转以及抓取。
还可以将手势识别模型的能力植入到电脑控制系统中,具体演示详见b站视频:
https://www.bilibili.com/video/BV1dh411U7SC
什么是PaddleVideo?
PaddleVideo是飞桨官方出品的视频模型开发套件,旨在帮助开发者更好的进行视频领域的学术研究和产业实践。可以简单的将其理解成一套帮助开发者快速完成开发的工具,避免重复造轮子,也会获得更好的精度。
同时PaddleVideo已包含多种模型,包括不限于PP-TSM、PP-TSN、AGCN、ST-GCN、Slowfast等等,本文采用PP-TSN模型对数据进行训练,感兴趣的同学可以自己更换模型进行尝试。
TSN
TSN全称Temporal Segment Network ,是视频分类领域非常经典的模型。其主要思想是将一整段长视频分解为K个片段,每个片段随机抽取一帧,同时将RGB图像与光流分别放入两个神经网络中提取特征。通过片段共识函数,分别融合两个不同分支的结果,最后再将两类共识融合。
同时该网络主要采取稀疏采样的方式,只在K个片段中随机抽取,因此既能捕获视频全局信息,也能去除冗余,降低计算量。
图引用于论文[1]
图引用于论文[1]
同时TSN还采取了多模态数据增强的方式,解决样本数据偏少的情况。上图中的RGB image和RGB difference分别代表了视频中某一帧以及某一帧相邻帧的差。Optical flow 和warped optical flow fields 为视频中的光流信息。
基于以上两种数据则正好对应了网络图中的两种输入,一种RGB image,一种光流。
如何准备训练数据?
PaddleVideo PP-TSN的训练数据集使用的是由DeepMind 公布的Kinetics-400动作识别数据集。我们可以以其数据集格式作为规范进行数据准备,下面以手势识别训练数据集为例子:
数据集总共有七种动作,我们训练的模型也是用于识别这七种动作之一,其中开头的四个文件分别存放了对应的准备测试的视频或准备训练的视频名字以及分类。例如:
再更换自己的数据集训练时也要以这个作为参考,准备完成后即可开始训练。
基于PaddleVideo
开始训练模型
大道至简,基于PaddleVideo训练的动作分类任务时基本可以做到0代码完成训练,
在训练开始前需要先下载Backbone,具体代码为:
代码语言:javascript复制!wget https://videotag.bj.bcebos.com/PaddleVideo/PretrainModel/ResNet50_vd_ssld_v2_pretrained.pdparams
完成后仅需找到对应的网络训练配置文件进行修改即可,这里以PP-TSN为例:进入:PaddleVideo-develop/configs/recognition/pptsn/pptsn_k400_videos.yaml文件
根据项目情况对num_classes(预测类别数),pretrained(backbone模型位置),num_workers(多卡训练),以及train,vaild,test的file_path(数据集文件位置)进行修改,即可开始训练。
开始训练命令:
代码语言:javascript复制!python main.py --validate -c configs/recognition/pptsn/pptsn_k400_videos.yaml
本项目经过100个epoch的训练已经达到了极好的效果:
代码语言:javascript复制[11/22 17:00:15] epoch:[100/100] val step:0 loss: 0.09835 top1: 1.00000 top5: 1.00000 batch_cost: 0.40634 sec, reader_cost: 0.00000 sec, ips: 39.37611 instance/sec.
[11/22 17:00:16] END epoch:100 val loss_avg: 0.09812 top1_avg: 1.00000 top5_avg: 1.00000 avg_batch_cost: 0.08464 sec, avg_reader_cost: 0.00000 sec, batch_cost_sum: 1.50070 sec, avg_ips: 53.30851 instance/sec.
[11/22 17:00:16] training ppTSN finished
预测及模型导出
训练完成后,即可对模型进行测试,可直接执行下列命令:
代码语言:javascript复制!python main.py --test -c configs/recognition/pptsn/pptsn_k400_videos.yaml -w "output/ppTSN/ppTSN_best.pdparams"
最后也是收获了百分百的精度(因为数据集较少原因 可能存在过拟合情况):
测试完成后,我们利用下列命令对导出预测模型:
代码语言:javascript复制!python tools/export_model.py -c configs/recognition/pptsn/pptsn_k400_videos.yaml -p output/ppTSN/ppTSN_best.pdparams -o inference/ppTSN
利用预测模型再次对动作进行分类(这里使用的是放大的手势视频):
代码语言:javascript复制!python tools/predict.py --input_file ../mydata/val/fangda40.avi
--config configs/recognition/pptsn/pptsn_k400_videos.yaml
--model_file inference/ppTSN/ppTSN.pdmodel
--params_file inference/ppTSN/ppTSN.pdiparams
--use_gpu=True
--use_tensorrt=False
预测结果:
预测的结果为标号1的类别。
正好对应为我们数据集标注中的放大动作,模型训练成功