时空行为检测数据集 JHMDB UCF101_24 详解

article/2025/3/19 10:07:30

文章目录

    • 0. 前言
    • 1. JHMDB
      • 1.1. 基本情况
      • 1.2. 数据准备以及标签详解
    • 2. UDF101_24
      • 2.1. 基本情况
      • 2.2. 数据准备与标签详解
    • 3. 数据集可视化代码

0. 前言

  • 现在常用的时空行为检测数据集只有AVA/JHMDB/UCF101_24。
    • AVA数据集是每一秒标一帧,更多信息可以参考我的笔记。
    • JHMDB/UCF101_24 是逐帧标注的数据

1. JHMDB

  • 官网,HMDB官网

1.1. 基本情况

  • JHMDB是对HMDB数据集的二次标注,即 joint-annotated HMDB。

    • HMDB数据集有51类,5100多视频。
    • JHMDB只标注了HMDB的一部分,21类只包括一个人的行为,也删除了一些这21类行为中人不明显的样本。
    • 21类每一类有36-55个样本,每个样本包括了行为的起始与终止时间,每个样本包括14-40帧。
    • JHMDB一共标注了31838张图片。
  • 类别列表(21类)

    • sit
    • run
    • pullup
    • walk
    • shoot_gun
    • brush_hair
    • jump
    • pour
    • pick
    • kick_ball
    • golf
    • shoot_bow
    • catch
    • clap
    • swing_baseball
    • climb_stairs
    • throw
    • wave
    • shoot_ball
    • push
    • stand
  • 每个视频最多只有一类目标行为,bbox只标了做目标行为的那几个人

1.2. 数据准备以及标签详解

  • 下面内容参考了 mmaction2数据准备文档,数据下载在上面的文档中有介绍了,反正就是一个压缩包,没啥好说的。
  • 原始JHMDB数据集中好像有关键点、分割等的标签,但我们这个任务中不用。
  • 标签全部保存在JHMDB-GT.pkl 中,这个文件是一个字段,包括了6个key
    • labels (list): List of the 21 labels,21类行为标签,即上一小节中提到的。
    • gttubes (dict): Dictionary that contains the ground truth tubes for each video.
      • 每个视频、每帧对应的标签(bbox以及行为类别)
      • key为每个样本的相对路径,比如walk/Panic_in_the_Streets_walk_u_cm_np1_ba_med_5
      • value也是list,表示一系列tubes
      • 每个tube用字典表示,class_id/bboxes键值对
      • A gttube is dictionary that associates with each index of label and a list of tubes.
      • A tube is a numpy array with nframes rows and 5 columns, each col is in format like <frame index> <x1> <y1> <x2> <y2>.
    • nframes (dict): Dictionary that contains the number of frames for each video, like 'walk/Panic_in_the_Streets_walk_u_cm_np1_ba_med_5': 16.
      • 每个视频包含多少帧图片。
      • key为每个样本的相对路径,value为帧数量。
    • train_videos (list): A list with nsplits=1 elements, each one containing the list of training videos.
      • list对象,每个元素也是list(包含若干视频样本信息)
      • 训练集相关视频有哪些
      • 每个样本通过其相对路径表示
    • test_videos (list): A list with nsplits=1 elements, each one containing the list of testing videos.
      • list对象,每个元素也是list(包含若干视频样本信息)
      • 测试集相关视频有哪些
      • 每个样本通过其相对路径表示
    • resolution (dict): Dictionary that outputs a tuple (h,w) of the resolution for each video, like 'pour/Bartender_School_Students_Practice_pour_u_cm_np1_fr_med_1': (240, 320).
      • key为每个样本的相对路径,value为对应分辨率

2. UDF101_24

2.1. 基本情况

  • UCF101_24是UCF101数据集的子集,使用了一些不一样的标签。

    • 关于标签来源有点尴尬,UCF101中本来是有对应标签的,但现在已经不能下载了。image-20201117111626130
    • 现在的UCF101_24标签是从这个repo中,说是进行了一些微调。
    • 每个视频最多只有一类目标行为,bbox只标了做目标行为的那几个人。
      • 感觉也有例外,salsospin有样本都有多个人跳舞(大于等于6个),但只标了俩人。
  • 类别信息(共24类)

    • WalkingWithDog
    • Diving
    • PoleVault
    • SkateBoarding
    • CricketBowling
    • GolfSwing
    • Skijet
    • RopeClimbing
    • FloorGymnastics
    • Basketball
    • Biking
    • VolleyballSpiking
    • Fencing
    • CliffDiving
    • HorseRiding
    • SoccerJuggling
    • TennisSwing
    • LongJump
    • SalsaSpin
    • TrampolineJumping
    • IceDancing
    • Skiing
    • Surfing
    • BasketballDunk

2.2. 数据准备与标签详解

  • 数据下载以及其他相关可以参考 mmaction2数据准备文档,数据下载在上面的文档中有介绍了,反正就是一个压缩包,没啥好说的。

  • 标签与1.2.数据准备以及标签详解完全相同,这里就不多说了。

3. 数据集可视化代码

  • 需求分析:根据类别展示训练样本,在图片上画bbox。
import argparse
import os
import cv2
import pickle
from collections import defaultdictdef _parse_args():parser = argparse.ArgumentParser()parser.add_argument("--dataset", type=str, default="ucf101_24")parser.add_argument("--dataset_root_path", type=str,default="/ssd01/data/ucf101_24")parser.add_argument("--rgb-dir-name", type=str, default="rgb-images")# JHMDB & UCF101_24parser.add_argument("--pkl-filename", type=str, default="UCF101v2-GT.pkl")parser.add_argument("--img-impl", type=str, default="%05d.jpg")return parser.parse_args()def _darknet_draw_bbox(bboxes,labels,scores,img,bboxes_color=(0, 255, 0),bboxes_thickness=1,text_color=(0, 255, 0),text_thickness=2,text_front_scale=0.5):"""bbox的形式是 xyxy,取值范围是像素的值labels是标签名称scores是置信度,[0, 1]的浮点数"""for idx, (bbox, label) in enumerate(zip(bboxes, labels)):xmin, ymin, xmax, ymax = bboxpt1 = (int(xmin), int(ymin))  # 左下pt2 = (int(xmax), int(ymax))  # 右上# 画bboxcv2.rectangle(img, pt1, pt2, bboxes_color, bboxes_thickness)# 写上对应的文字cur_label = labelif scores is not None:cur_label += " [" + str(round(scores[idx] * 100, 2)) + "]"cv2.putText(img=img,text=cur_label,org=(pt1[0], pt1[1] - 5),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=.5,color=(0, 255, 0),thickness=2,)return imgdef _show_single_video(rgb_dir, tubes, nframes, label, img_impl):draw_imgs = []for i in range(nframes):img = cv2.imread(os.path.join(rgb_dir, img_impl % (i+1)))boxes = tubes[i+1]draw_img = _darknet_draw_bbox(boxes, [label]*len(boxes), None, img)draw_imgs.append(draw_img)cv2.imshow("demo", draw_img)cv2.waitKey(100)return draw_imgsdef _filter_samples(data_dict, args):# TODO: filter input data with categoriesreturn data_dictdef _show_spatiotemporal_datasets(args):pkl_path = os.path.join(args.dataset_root_path, args.pkl_filename)rgb_dir_path = os.path.join(args.dataset_root_path, args.rgb_dir_name)with open(pkl_path, "rb") as fid:cache = pickle.load(fid, encoding='bytes')labels = [c.decode() for c in cache[b'labels']]train_videos = [c.decode() for c in cache[b'train_videos'][0]]test_videos = [c.decode() for c in cache[b'test_videos'][0]]nframes = {k.decode(): v for k, v in cache[b'nframes'].items()}resolution = {k.decode(): v for k, v in cache[b'resolution'].items()}gttubes = {k.decode(): v for k, v in cache[b'gttubes'].items()}# key - sample relative dir# value - dict#   label - int#   nframes - int#   reoslution - tuple#   tubes - arraydata_dict = defaultdict(dict)for k in nframes:data_dict[k]['nframes'] = nframes[k]for k in resolution:assert data_dict[k]['nframes'] is not Nonedata_dict[k]['resolution'] = resolution[k]for k in gttubes:assert data_dict[k]['resolution'] is not Nonelabel = list(gttubes[k].keys())[0]data_dict[k]['label'] = labeldata_dict[k]['tubes'] = defaultdict(list)for boxes in gttubes[k][label]:for box in boxes:data_dict[k]['tubes'][int(box[0])].append(box[1:])for relative_path in data_dict.keys():sample = data_dict[relative_path]_show_single_video(os.path.join(rgb_dir_path, relative_path),sample['tubes'],sample['nframes'],labels[sample['label']],args.img_impl,)def main(args):if args.dataset in ["ucf101_24", "jhmdb"]:show_dataset_fn = _show_spatiotemporal_datasetselse:raise ValueError("Unknown dataset {}".format(args.dataset))show_dataset_fn(args)if __name__ == '__main__':main(_parse_args())

http://chatgpt.dhexx.cn/article/HpJIeGbY.shtml

相关文章

行为识别TSM训练ucf101数据集

序言 最近有个行为检测的需求&#xff0c;打算用行为识别做&#xff0c;纯小白入这个方向&#xff0c;啃了两周的TSM原理和源码&#xff0c;训练好自己的数据集后&#xff0c;发现好像没法应用到自己的需求场景&#xff1f;&#xff1f;玛德&#xff01;算了&#xff0c;还是要…

UCF101数据集处理

UCF101数据集处理 在复现动作识别类的算法时&#xff0c;常需要用到数据集。ucf101就是其中一个。 之前复现代码时所用的ucf101数据集是直接将原数据集中的视频处理成图片。数据集目录如下&#xff1a; UCF101/ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01/img_00001.jpg (此时通过…

深度学习视频数据集(动作识别):UCF-101

UCF-101 官网&#xff1a;https://www.crcv.ucf.edu/research/data-sets/ucf101/ 网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1RsJuykWyUlQ4_c1TwqxR_Q 提取码&#xff1a;909g 官方解释 UCF101是一个现实动作视频的动作识别数据集&#xff0c;收集自YouTub…

UCF101数据集提取帧+TDN部署(Anaconda+Python3.7+Pytorch)

UCF101数据集提取帧TDN部署&#xff08;AnacondaPython3.7Pytorch&#xff09; 前言一、安装MMAction21.引入库2.环境搭建3.安装4.准备原始数据集5.制作视频提取帧数据集 二、部署TDN1.引入库2.读入数据3.训练模型4.查看结果 本人实测结果 前言 将TDN部署在个人电脑上&#xf…

UCF101动作识别数据集简介绍及数据预处理

文章目录 一、数据集简介&#xff1a;二、数据集获取及解压缩&#xff1a;1. 数据下载2. 数据集解压缩&#xff1a; 三、数据集划分四、数据集预处理1. 生成pkl文件2. 直接对视频文件处理 一、数据集简介&#xff1a; UCF101是一个现实动作视频的动作识别数据集&#xff0c;收…

【Java】内部类的定义

目录 一、前言 二、内部类 语法格式&#xff1a; static修饰内部类 内部类未被static修饰时&#xff1a; 内部类被static修饰后 演示操作&#xff1a; 一、前言 前面我们学习了一个小的项目&#xff0c;现在我们来学习新的知识点&#xff0c;关于内部类的描述&#xff0…

Java类的定义、声明及使用

1、 class 类名称{属性方法} 2、声明一个类需要通过一个关键字class 3、类与对象的关系 1&#xff09;类是对某一类事物的描述&#xff0c;是抽象的、概念上的意义&#xff0c;对象是实际存在的该类事物的每一个个体&#xff0c;也被称为实例。 package classdemo; class …

C#类的定义

在C#语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 类的访问修饰符&#xff1a;用于设定对类的访问限制&#xff0c;包括 public、internal 或者不写&#xff0c;用 internal 或者不写时代表只能在当前项目中访问类…

C#类的定义和声明及使用

类的定义 类的成员 } 例如&#xff0c;以水果为例来声明一个类&#xff0c;代码如下&#xff1a;在 C# 语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 简单的来说&#xff0c;在C#编程里&#xff0c;类是一种数据结…

(27)python类的定义和使用

面向对象初步 面向对象&#xff08;Object oriented Programming&#xff0c;OOP&#xff09;编程的思想主要是针对大型软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好&#xff0c;使的编程可以像搭积木一样简单。 面向对象编程将数据和操作数据相关的方法封装…

类的认识和定义

前言 C为啥要引入类这个概念呢&#xff0c;以C实现栈为例说明。 typedef int STDataType; typedef struct Stack { . . . .int top; . . . .STDataType* data; . . . .int capacity; }Stack; void StackInit(Stack* ps); //栈的初始化 void StackDestory(Stack* ps); //栈的销…

Python类的定义

类的定义&#xff1a;我们把对象比作一个“饼干”&#xff0c;类就是制造这个饼干的模具。通过类定义数据类型的属性和方法&#xff0c;也就是说&#xff0c;“类将行为和状态打包在一起”。 类的结构 方法&#xff08;函数&#xff09;..............行为 属性&#xff08;…

java类的定义

目录 一、概念二、使用1.成员变量2.成员方法3.权限修饰符4.静态方法 三、重写toString方法 一、概念 我们不能将一个事物称之为一类事物&#xff0c;例如一只鸟我们不能称为鸟类&#xff0c;但是我们需要给一类事物统称&#xff0c;例如大雁&#xff0c;麻雀&#xff0c;燕子&…

C++ 类的定义与使用

十二、类与对象 对象&#xff1a;就是我们生活中的具体事物&#xff0c;看得见摸得到&#xff0c;有一定的属性和行为或操作方式 面向对象&#xff1a;是一种软件的开发方法&#xff0c;对象所指的是计算机系统中的某一个成分。在面向对象程序设计中&#xff0c;对象包含两个…

4.类的定义,变量类型,方法类型

文章目录 1.类的概念1.1 如何创建一个类1.2 如何定义一个类1.2.1变量1.2.2 方法 2.对象3.类定义使用实例4.理解类和对象的关系4.1.一个java程序和类之间的关系 5.细节知识分析5.1.类与类的关系5.2.变量和变量区别5.3.方法的区别5.4.类方法和类变量的特点 1.类的概念 类java是基…

关于类的定义

类的定义 类的概念如何定义类修饰符 类的概念 1、类是把事物的数据与相关功能封装到一起&#xff0c;形成一种特殊的数据结构&#xff0c;用以表达真是事物的一种抽象&#xff1b;而对象则是实际存在的属该类事物的具体个体&#xff0c;因而也称为实例&#xff08;instance&am…

python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一)

python 爬虫爬取疫情数据&#xff0c;爬虫思路和技术你全都有哈&#xff08;二、数据清洗及存储&#xff09; 爬起疫情数据&#xff0c;有两个网址&#xff1a; 1、百度&#xff1a;链接 2、丁香园疫情&#xff1a;链接 在这两个中&#xff0c;丁香园的爬虫相对简单一点&#…

采用python爬虫爬取数据然后采用echarts数据可视化分析

前言&#xff1a;采用python爬虫爬取天气数据然后采用echarts数据可视化画图分析未来天气变化趋势 从获取数据到可视化的流程 &#xff08;熟悉爬虫爬取数据然后数据可视化这个过程&#xff09; 一、python爬取未来8-15天的天气数据 1、导入用到的一些python第三方库 imp…

python网络爬虫爬取数据,python全网爬取内容

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python网络爬虫爬取数据&#xff0c;利用python爬取数据&#xff0c;现在让我们一起来看看吧&#xff01; 网络爬虫&#xff0c;就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。 在整个的Python…

Python爬虫爬取网页数据并存储(一)

Python爬虫爬取网页数据并存储&#xff08;一&#xff09; 环境搭建爬虫基本原理urllib库使用requests库使用正则表达式一个示例 环境搭建 1.需要事先安装anaconda&#xff08;或Python3.7&#xff09;和pycharm *anaconda可在中科大镜像下下载较快 2.安装中遇到的问题&#x…