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

2023-05-16

文章目录

    • 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 defaultdict


def _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_24
    parser.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 = bbox
        pt1 = (int(xmin), int(ymin))  # 左下
        pt2 = (int(xmax), int(ymax))  # 右上

        # 画bbox
        cv2.rectangle(img, pt1, pt2, bboxes_color, bboxes_thickness)

        # 写上对应的文字
        cur_label = label
        if 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 img


def _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_imgs


def _filter_samples(data_dict, args):
    # TODO: filter input data with categories
    return data_dict


def _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 - array
    data_dict = defaultdict(dict)
    for k in nframes:
        data_dict[k]['nframes'] = nframes[k]
    for k in resolution:
        assert data_dict[k]['nframes'] is not None
        data_dict[k]['resolution'] = resolution[k]
    for k in gttubes:
        assert data_dict[k]['resolution'] is not None
        label = list(gttubes[k].keys())[0]
        data_dict[k]['label'] = label
        data_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_datasets
    else:
        raise ValueError("Unknown dataset {}".format(args.dataset))
    show_dataset_fn(args)


if __name__ == '__main__':
    main(_parse_args())

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时空行为检测数据集 JHMDB & UCF101_24 详解 的相关文章

  • Maven Helper插件下载&Maven导入jar包(依赖管理)

    1 maven Helper插件 1 1搜索 File gt Settings gt Plugins gt 搜索Maven Helper 发现没有 1 2 安装 点击Browse reositories gt 选择maven Helper
  • ESP实验02-读取DS1307&eerom34c32

    1 模块介绍 本实验主要用到两个模块 esp32 tinyRTC 模块的图片如下所示 xff1a esp32模块型号为ESP32Devkitc v4 xff0c 是启明云端官方的开发板 与乐鑫官方的完全一致 xff0c 引脚顺序 xff0c
  • 飞控学习常见典型问题集Q&A——无名创新(2022年4月15日)

    飞控学习常见典型问题集Q amp A 无名创新 xff08 2022年4月15日 xff09 1 第一次启动FS I6遥控器 xff0c 进入不了界面一直嘟嘟 xff0c 请问这是什么情况呢 xff1f 先把上面的英文翻译一下 xff0c
  • LLVM/clang & lib路径 & 测试代码

    部分转载自 xff1a Ubuntu编译安装llvm clangUbuntu14 04 Linux安装LLVM clang 3 7 xff08 带有标准库 libc 43 43 xff0c libc 43 43 abi xff09 所需即所
  • AUTOSAR_DCM&DEM(UDS&OBD)

    1 术语与缩写 术语 DCM Diagnostic Communication Manager DEM Diagnostic Event Manager UDS Unified diagnostic services OBD On Boar
  • [转&精]IO_STACK_LOCATION与IRP的一点笔记

    IO STACK LOCATION和IRP算是驱动中两个很基础的东西 xff0c 为了理解这两个东西 xff0c 找了一点资料 1 IRP可以看成是Win32窗口程序中的消息 xff08 Message xff09 xff0c DEVICE
  • Docker 删除&清理镜像

    文章首发自个人网站 xff1a https www exception site docker docker delete image 本文中 xff0c 您将学习 Docker 如何删除及清理镜像 xff1f 一 通过标签删除镜像 通过如
  • [Machine Learning & Algorithm] 随机森林(Random Forest)

    1 什么是随机森林 xff1f 作为新兴起的 高度灵活的一种机器学习算法 xff0c 随机森林 xff08 Random Forest xff0c 简称RF xff09 拥有广泛的应用前景 xff0c 从市场营销到医疗保健保险 xff0c
  • 指针p,*p,&p之间的区别

    假设我们定义一个指针p 那么会经常使用到三个符号 xff1a 1 xff0c p xff1b p是一个指针变量的名字 xff0c 表示此指针变量指向的内存地址 xff0c 如果使用 p来输出的话 xff0c 它将是一个16进制数 2 xff
  • (5)py接口自动化之配置文件&数据库连接详解

    目录 一 配置文件 ini amp yaml 1 作用 2 ini A 语法 B 特点 C 操作方法 3 yaml A 安装第三方库 B 支持的数据类型 C 特性 D 语法 E 数据读取 二 数据库连接与pytho配置文件 1 安装数据库
  • 【RoboMaster】舵机驱动&蓝牙模块教程

    本文是为参加2021赛季北京理工大学机器人队校内赛所写的简单教程 xff0c 意在帮助参赛选手快速了解校内赛所需模块的使用方法 xff0c 以及其与薪火培训知识的联系 舵机驱动 硬件接线 舵机是由直流电机 减速齿轮组 传感器和控制电路组成的
  • weak & asign

    Why does Apple use assign rather than weak to store a delegate http stackoverflow com questions 20419317 why does apple
  • Chrome安装Proxy SwitchyOmega插件&Ubuntu20.04安装Proxychains

    目录 1 Chrome浏览器1 1 安装Proxy SwitchyOmega插件1 2 安装Proxy SwitchyOmega插件 2 Ubuntu服务器2 1 安装2 2 配置2 3 测试2 4 异常处理 1 Chrome浏览器 1 1
  • 【STM32学习】——串口通信协议&STM32-USART外设&数据帧/输入数据策略/波特率发生器&串口发送/接受实操

    文章目录 前言一 串口通信1 通信接口2 串口通信 xff08 1 xff09 串口简介 xff08 2 xff09 串口硬件电路 xff08 3 xff09 串口软件部分 二 STM32的USART外设1 USART简介2 图示详解 三
  • A1&AlienGo--通过realsense-viewer调用相机

    使用机器狗时 xff0c 有时需要通过NX 树莓派上的系统来查看调用相机 xff0c 可以通过realsense提供的realsense viewer来查看 但是机器狗自带的视觉程序会开机自启占用相机 xff0c 所以首先需要杀掉这个进程
  • c语言中&与&&区别

    c语言中 amp 与 amp amp 的区别 amp xff1a 按照位与操作 xff0c 例如 xff1a 0010 amp 1101 xff0c 结果为0000 amp 是java中的位逻辑运算 xff1a eg xff1a 2 amp
  • STM32&nbsp;HAL库&nbsp;STM3…

    原文地址 xff1a STM32 HAL库 STM32CUBEMX KEIL TIM1 PWM 四路输出可调 一 作者 xff1a 用户2797410335 硬件 xff1a TM32F407VET6 8M晶振 xff0c JLINK JT
  • ROS速成之发送&接收消息

    人真的老了 xff0c 扔了个周末 xff0c 完全不记得干了什么 论纪录的重要性啊 xff0c 当时觉得明白的很 xff0c 你扔两天试试 xff1f 扔一年试试 xff1f 扔几年试试 xff1f 最近参加的各种项目脑疼眼乏 xff0c
  • BMP085气压传感器驱动 &MS5611经验

    BMP085是新一代的小封装气压传感器 主要用于气压温度检测 在四轴飞行器上可以用作定高检测 该传感器属于IIC总线接口 依然沿用标准IIC驱动程序 使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据 必须先读出一整
  • ubuntu(15):对‘casadi::MX::MX(casadi::MX const&)’未定义的引用

    catkin build 编译报错 xff0c 找不到CASADI的头文件目录CASADI INCLUDE DIRS或者库文件也达不到CASADI LIBRARIES xff1b 对 casadi MX horzsplit casadi M

随机推荐