近来做行为动作识别,根据近两年的CVPR、ICCV、ECCV论文实验了一序列的动作识别方面的模型,很多都用到了kinetics数据集或者something-something数据集,但是后者的官网目前已经关闭了(可能是因为上月bn20被高通收购了的原因),所以只好依赖于kinetics数据集了,但是网上没有看到有人把kinetics数据集如何使用说清楚了,只好自己花了点时间看这个数据集的内容以及翻看了多个相关动作识别模型加载kinetics数据集的代码,看是如何做data loading的,做下记录也供分享。
Kinetics序列数据集是行为动作识别的标杆数据集之一,所谓的benchmark嘛,视频的总量也十分庞大,仅kinetics400就有100多G的视频,官网https://deepmind.com/research/open-source/kinetics上只给出了csv和json格式的标注文件,例如,下载kinetics400.tar.gz解开看到的是这些文件:

打开train.csv看到的内容是这样的:

这里面label,youtube_id,time_start,time_end,split分别指类别、视频在油管上的唯一id,该类动作内容(每个动作内容时长10秒)在视频里的起始时间和终止时间,所属的数据集划分(train/val/test),按正常的流程,就是使用此数据集的模型训练代码要自行实现视频数据下载的脚本,在训练前解析train.csv后读取各个youtube_id然后从油管上下载视频,并将文件按以下形式命名:
$(youtube_id)_$(timestamp_start)_$(timestamp_end).mp4
并创建400个(对于kinetics600/700/以及kinetics-moments之类的数据集当然就是600/700/1039个了)目录,根据上面csv文件中视频文件所属的动作类别存放到对应的目录下,就是类似于UCF101那样的存放模式,有的模型的训练代码则做了比较简单的处理,像我试用了的https://github.com/open-mmlab/mmaction2中slowfast/slowonly/r2plus1d支持直接从视频中读取帧数据,为此,要生成train和val的视频清单文件kinetics400_train_list_videos.txt和kinetics400_val_list_videos.txt,文件的内容很简单就是类似如下形式:


也就是视频文件的路径和所属类别的索引值,模型在训练或者测试时按路径和文件名读取文件指定开始时间帧和结束时间帧之间的视频帧数据并记录所属类别值。
用python实现上面的功能是不难的,但是从国内下载油管上的视频就算你有办法下载也是非常慢那会让人抓狂,其实还有个网站可以直接使用迅雷下载压缩打包了的kinetics400/600/700的视频数据,也可以直接写它提供的shell脚本download.sh下载: https://github.com/cvdfoundation/kinetics-dataset,可以看到下面的视频清单文件和视频标注csv文件:
K400视频和标注文件:
https://s3.amazonaws.com/kinetics/400/train/k400_train_path.txt
https://s3.amazonaws.com/kinetics/400/val/k400_val_path.txt
https://s3.amazonaws.com/kinetics/400/test/k400_test_path.txt
https://s3.amazonaws.com/kinetics/400/annotations/train.csv
https://s3.amazonaws.com/kinetics/400/annotations/val.csv
https://s3.amazonaws.com/kinetics/400/annotations/test.csv
K600视频和标注文件:
https://s3.amazonaws.com/kinetics/600/train/k600_train_path.txt
https://s3.amazonaws.com/kinetics/600/val/k600_val_path.txt
https://s3.amazonaws.com/kinetics/600/test/k600_test_path.txt
https://s3.amazonaws.com/kinetics/600/annotations/train.txt
https://s3.amazonaws.com/kinetics/600/annotations/val.txt
https://s3.amazonaws.com/kinetics/600/annotations/test.csv
K700视频和标注文件:
https://s3.amazonaws.com/kinetics/700_2020/train/k700_2020_train_path.txt
https://s3.amazonaws.com/kinetics/700_2020/val/k700_2020_val_path.txt
https://s3.amazonaws.com/kinetics/700_2020/test/k700_2020_test_path.txt
https://s3.amazonaws.com/kinetics/700_2020/annotations/train.csv
https://s3.amazonaws.com/kinetics/700_2020/annotations/val.csv
https://s3.amazonaws.com/kinetics/700_2020/annotations/test.csv
这里的csv格式的标注文件比官网上的标注文件多了一列,在自己写脚本解析生成kinetics400_train_list_videos.txt和kinetics400_val_list_videos.txt清单文件时可以忽略掉,另外这些文件里面有些文件的youtube_id没有,可以根据视频文件来反查csv解析出来的字典数据,这样就可以忽略掉这些有问题的数据。
像https://github.com/open-mmlab/mmaction2里面有些模型既支持读取帧抽取出来的一张张图片(rawframes)数据,也支持自己按视频清单文件${DATASET}_train_list_videos.txt、${DATASET}_val_list_videos.txt从指定视频(位于videos_train和videos_val下,可以按类别存放,也可以不按类别全部存放在一起,关键是train_list和val_list清单文件中从csv标注文件中获取到的视频文件和对应的类别值要准确)里直接读取帧数据:
mmaction2
├── mmaction
├── tools
├── configs
├── data
│ ├── ${DATASET}
│ │ ├── ${DATASET}_train_list_videos.txt
│ │ ├── ${DATASET}_val_list_videos.txt
│ │ ├── annotations
│ │ ├── videos_train
│ │ ├── videos_val
│ │ │ ├── abseiling
│ │ │ │ ├── 0wR5jVB-WPk_000417_000427.mp4
│ │ │ │ ├── ...
│ │ │ ├── ...
│ │ │ ├── wrapping_present
│ │ │ ├── ...
│ │ │ ├── zumba
│ │ ├── rawframes_train #optional for image-based data
│ │ ├── rawframes_val #optional for image-based data
后者显然简单多了,不用像rawframes读取方式需要把视频事先抽取成帧,那样不仅麻烦,还需多占用大量空间,维护和检查十分费劲,所以支持从视频直接读取帧数据是最好的。
那么怎么用上面的kinetics视频文件和csv标注文件(需要对视频文件像上面的train.csv那样做出标注)以及kinetics类清单文件(就是把所有类别名保存到一个文件文件里,例如cls_k400.txt,kinetics类别参见附录)生成类似https://github.com/open-mmlab/mmaction2训练slowfast/slowonly/r2plus1d模型时所需的kinetics400_train_list_videos.txt和kinetics400_val_list_videos.txt呢?下面给出了我使用自己的视频文件生成这些清单文件以及csv标注文件(csv标注文件存放到上面的目录结构中的annotations下,实际上在加载数据时没啥用)的代码:
import os
from glob import glob
import shutil
def gen_file_lists(dir_ds,dir_ann,dir_train_v,

本文详细介绍了如何处理Kinetics序列数据集,包括csv标注文件的解析、视频文件下载与组织,以及如何生成用于模型训练的清单文件。重点讨论了从官方csv到视频数据的转换过程和使用shell脚本下载预处理好的数据的便捷方法。
最低0.47元/天 解锁文章
3298

被折叠的 条评论
为什么被折叠?



