SlowFast使用指南(三)——自建数据集

写在前面

在前两个章节初步使用了SlowFast,使用的都是官方给出的数据集。

附上链接:

SlowFast使用指南(一)——demo运行-CSDN博客

SlowFast使用指南(二)——训练ava数据集-CSDN博客

本文尝试了使用自己的数据集进行训练,整个训练过程十分不易,整个过程最难的便在数据集的准备,下面附上整个过程。

数据集准备

视频准备

首先需要准备了训练使用到的两个视频,和 SlowFast使用指南(二)一样一个视频用于训练,一个视频用于验证。

视频裁剪

准备完成后,如果视频过长,需要对视频进行裁剪。本文使用到的两个视频均只有10秒左右,故没有进行裁剪。

视频抽帧

裁剪完成后,需要再对视频进行抽帧处理,抽帧分为两种方式

  • 1秒1帧:用来标注

#切割图片,每秒1帧
IN_DATA_DIR="./videos"
OUT_DATA_DIR="./labels"if [[ ! -d "${OUT_DATA_DIR}" ]]; thenecho "${OUT_DATA_DIR} doesn't exist. Creating it.";mkdir -p ${OUT_DATA_DIR}
fifor video in $(ls -A1 -U ${IN_DATA_DIR}/*)
dovideo_name=${video##*/}if [[ $video_name = *".webm" ]]; thenvideo_name=${video_name::-5}elsevideo_name=${video_name::-4}fiout_video_dir=${OUT_DATA_DIR}/${video_name}/mkdir -p "${out_video_dir}"out_name="${out_video_dir}/${video_name}_%06d.jpg"ffmpeg -i "${video}" -r 1 -q:v 1 "${out_name}"
done

抽1帧完成的效果如下

  • 1秒30帧:用于训练(因为slowfast在slow流里1秒会采集到15帧,在fast流里1秒会采集到2帧
#切割图片,每秒30帧
IN_DATA_DIR="./videos"
OUT_DATA_DIR="./frames"if [[ ! -d "${OUT_DATA_DIR}" ]]; thenecho "${OUT_DATA_DIR} doesn't exist. Creating it.";mkdir -p ${OUT_DATA_DIR}
fifor video in $(ls -A1 -U ${IN_DATA_DIR}/*)
dovideo_name=${video##*/}if [[ $video_name = *".webm" ]]; thenvideo_name=${video_name::-5}elsevideo_name=${video_name::-4}fiout_video_dir=${OUT_DATA_DIR}/${video_name}/mkdir -p "${out_video_dir}"out_name="${out_video_dir}/${video_name}_%06d.jpg"ffmpeg -i "${video}" -r 30 -q:v 1 "${out_name}"
done

抽30帧完成的效果如下

图片标注

本文采用的是 VGG Image Annotator 进行图片标注的,点击链接进入后。

  1. 导入图片

  2. 创建Attributes
  3. 画框标注(这里行为的编号,建议从1开始
  4. 导出标注csv文件

本文由于图片数量较少,采用的是手动标注。如果图片数量较多,建议自动标注。最终得到如下结果。

via转ava

导出的csv格式明显与slowfast所需要的csv格式不相匹配,需要对其进行转换。

import csv# 输入输出文件
via_csv = "via_project_27Aug2025_14h55m_csv.csv"
ava_csv = "ava_val_v2.2.csv"# 图像宽高(根据你的实际视频分辨率填写)
IMG_WIDTH = 1080
IMG_HEIGHT = 1920def via_to_ava(via_csv, ava_csv, img_w=IMG_WIDTH, img_h=IMG_HEIGHT):with open(via_csv, newline='') as fin, open(ava_csv, 'w', newline='') as fout:reader = csv.DictReader(fin)writer = csv.writer(fout)for row in reader:filename = row['filename']video_id = filename.split('_')[0]frame_str = filename.split('_')[1].split('.')[0]frame_sec = int(frame_str.lstrip('0'))# 每30帧为1秒# 解析 region_shape_attributesshape = eval(row['region_shape_attributes'])x, y, w, h = shape['x'], shape['y'], shape['width'], shape['height']# 归一化坐标x1 = x / img_wy1 = y / img_hx2 = (x + w) / img_wy2 = (y + h) / img_h# 解析 actionaction = eval(row['region_attributes'])['action']action_id = int(action)person_id = eval(row['region_attributes'])['id']person_id = int(person_id)# AVA 格式:video_id, frame_sec, x1, y1, x2, y2, action_id, person_idwriter.writerow([video_id, frame_sec, f"{x1:.3f}", f"{y1:.3f}",f"{x2:.3f}", f"{y2:.3f}", action_id, person_id])via_to_ava(via_csv, ava_csv)

其中via_csv、ava_csv表示输入路径和输出路径,需要根据实际位置进行修改。IMG_WIDTH 和IMG_HEIGHT 表示图片分辨率,也需要根据实际情况修改。最后得到如下结果。

生成其他配置文件

ava_action_list_v2.2_for_activitynet_2019.pbtxt

item {name: "normal"id: 1
}
item {name: "abnormal"id: 2
}

此为你要识别的行为类别,本文识别了两种类别正常和不正常

frame_lists

frame_lists下的文件使用1秒抽30帧的图片。

import os
from typing import List, Dictdef build_vid_map(frames_root: str) -> Dict[str, int]:"""返回 目录名 → video_id 的字典序映射"""dirs = sorted([d for d in os.listdir(frames_root)if os.path.isdir(os.path.join(frames_root, d))])return {d: idx for idx, d in enumerate(dirs)}def generate_val_csv(dirs: List[str],frames_root: str = '../frames',out_csv: str = 'frame_lists/val.csv') -> None:"""仅针对给定目录列表生成 val.csv:param dirs:        目录名列表,顺序即 video_id:param frames_root: 帧根目录:param out_csv:     输出文件"""vid_map = build_vid_map(frames_root)os.makedirs(os.path.dirname(out_csv), exist_ok=True)with open(out_csv, 'w') as f:f.write('original_vido_id video_id frame_id path labels\n')for orig_vid in dirs:vid_id = vid_map[orig_vid]vid_dir = os.path.join(frames_root, orig_vid)if not os.path.isdir(vid_dir):continuefor fname in sorted(os.listdir(vid_dir)):if fname.endswith('.jpg'):frame_id = int(fname.split('_')[-1].split('.')[0])f.write(f'{orig_vid} {vid_id} {frame_id} {orig_vid}/{fname} ""\n')print(f'✅ 已生成 {out_csv},目录 {dirs} 已处理')# ===== 用法 =====
if __name__ == '__main__':generate_val_csv(['e68a9872cfd45cc79867fc6a22117eda'])

由于本文是直接指定哪个视频为训练集哪个训练为验证集,故上方代码传递相对应的目录名,即可生成train.csv和val.csv。

最终生成的结果如下

ava_detection_train_boxes_and_labels_include_negative_v2.2.csv

此文件直接对ava_train_v2.2.csv的前七列进行复制,最后一列使用置信度进行填充,置信度设置为0.996382.

ava_detection_val_boxes_and_labels.csv

此文件对ava_val_v2.2.csv的前六列进行复制,第七列是空值,第八列用置信度填充,然后同样设置置信度。

运行

python tools/run_net.py --cfg configs/AVA/SLOWFAST_32x2_R50_SHORT5.yaml

问题解决

问题一

原csv文件是从902秒开始的,但是自己的视频是从第一秒开始的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94515.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day26 树的层序遍历 哈希表 排序算法 内核链表

day26 树的层序遍历 哈希表 排序算法 内核链表 实现树的层序遍历(广度遍历) 使用队列辅助实现二叉树的层序遍历。算法核心思想是:从根节点开始,依次将每一层的节点入队,出队时访问该节点,并将其左右子节点&…

【系统分析师】高分论文:论快速应用开发方法及应用

【摘要】 我在某县卫生健康委员会公共卫生信息中心工作,是信息中心的负责人。2021年5月,我中心受县痪病预防控制中心委托,为某种痪病疫苗3期临床项日开发受试对象拦截系统。我负责系统架构设计、需求分析以及后期的部分编码工作。通过与庆病预…

4056:【GESP2403八级】接竹竿

/*4056:【GESP2403八级】接竹竿flag 数组 存储每个元素出现的位置,nxt[i]j;存储每个位置 后面第一次出现 与a【i】相等的位置//其中 a【i]a[j] :记录i的下一个位置 ,flag 存储每个值的位置下一次 具有下一次,相当于的链表了&…

企业落地版 AutoGen 多智能体工程(完整示例)

企业生产级参考实现,目标是一套可直接部署的模板工程,包含: FastAPI HTTP API(任务提交、状态查询) Celery 异步任务队列(Redis Broker) PostgreSQL + pgvector(向量存储,RAG) SQLAlchemy + Alembic(ORM 与迁移) AutoGen 多智能体编排(Planner / Coder / Executor…

前端的请求协议对应java的接收

application/json前端发送 JSON 数据,后端用 RequestBody 接收并自动映射为 Java 对象。前端示例(Axios):axios.post("/api/user", { name: "张三", age: 20 }, {headers: { "Content-Type": "…

esp32_hid_device 调试遇到的一些问题

nimble to windows10 22h2esp_hid_device 的keyboardReportMap在win10 22h2 csr4.0 下好像识别不了, Windows(和大多数 BIOS/UEFI)只认 6-byte key array 的 HID Keyboard 描述符。如果不是 6 个字节,Windows HID 驱动就会认为这不…

观察者模式 (Observer Pattern)与几个C++应用例子

1. 模式定义与核心思想 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,它会自动通知所有观察者对象,使它们能够自动更新自己。核心思想: 解耦主题和观察者。主题…

[系统架构设计师]论文(二十三)

[系统架构设计师]论文(二十三) 一.论软件系统架构评估 1.架构所关注的质量属性主要有:性能,可用性,安全性,可修改性 1)性能。性能是指系统的响应能力,即要经过多长时间才能对某个事件…

攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南

攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南 开场:从“摇摇欲坠”到“稳如磐石”,你的分布式系统进阶之路 你是否曾经遇到过这样的场景?精心打造的电商应用,在大促开启的瞬间,页面响应变得…

如何在Ubuntu中删除或修改已有的IP地址设置?

在 Ubuntu 中为新增加的网卡设置网络时,需要区分原有网卡和新网卡的配置,确保它们可以独立工作(可在同一网段或不同网段)。以下是具体步骤,假设你需要为新网卡配置静态 IP(以 192.168.1.190/24 为例&#x…

Ansible Playbook 概述与实践案例(下)

#作者:张桐瑞 文章目录四、条件判断的实现五、循环的实现六、Jinja模板应用1、Jinja模板2、handlers组件七、角色 role1、角色介绍2、案例: 部署zabbix-agent四、条件判断的实现 when: 条件 - hosts: appserveruser: roottasks:- name: create userAuser: nameuser…

LeetCode 100 -- Day6

1. 哈希:49、128(1)49 字母异位词分组 -- 字典from collections import defaultdict class Solution(object):def groupAnagrams(self, strs):"""创建字典{sorted_string:原str}"""resultsdefaultd…

多因素认证(MFA/2FA)实战指南:如何保护你的账号

一、MFA/2FA 基础认知 1. 概念辨析与演进 单因素认证(1FA)的局限性:仅依赖 “知识因素”(如密码),据 2024 年 Verizon 数据泄露报告,81% 的账户入侵源于密码泄露 —— 要么是用户使用弱密码&a…

vue3 字符 居中显示

在Vue 3中&#xff0c;要实现字符的居中显示&#xff0c;你可以使用多种方法&#xff0c;具体取决于你是想在HTML元素内居中文本&#xff0c;还是在CSS样式中实现。下面是一些常见的方法&#xff1a;1. 使用内联样式你可以直接在元素上使用style属性来实现文本的居中。<temp…

《Spring Boot 进阶:从零到一打造自定义 @Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略

《Spring Boot 进阶&#xff1a;从零到一打造自定义 Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略版本&#xff1a;Spring Boot 3.2.x JDK 17一、背景与痛点痛点默认 Transactional 限制多数据源只能绑定一个 DataSourceTransactionManager多租户无法在运…

open3D学习笔记

这里写自定义目录标题 核心3D数据结构 1.1 PointCloud(点云) 最近邻搜索 (KNN/Radius) 与空间索引(KDTree/Octree) 法线估计 (Normal Estimation) 聚类分割 (基于欧氏距离的聚类) 1.2 TriangleMesh (三角形网格) 泊松表面重建 (Poisson Surface Reconstruction) 滚球法 (Ba…

gt_k_char设计模块

是不是再fiber或者gt设计中经常遇到接收数据没有对齐&#xff1f;是的。很多协议需要手动对齐设计。这不&#xff0c;它来了。下面是手动对齐代码设计&#xff0c;本人在很多工程和项目中应用过&#xff0c;现在共享出来&#xff0c;给大家使用。module gt_k_char (input …

网页版云手机怎么样

随着科技的不断发展&#xff0c;云手机这一新兴概念逐渐走入大众视野&#xff0c;而网页版云手机作为云手机的一种便捷使用方式&#xff0c;备受关注&#xff0c;下面从多个方面来探讨网页版云手机究竟怎么样。与传统的需要在本地设备安装专门APP的云手机使用方式不同&#xff…

XFile v2 系统架构文档

XFile v2 系统架构文档 1. 概述 XFile 是一个基于 Go 语言开发的分布式文件管理系统&#xff0c;提供本地文件存储、网络文件共享、安全认证和多种文件操作功能。该系统采用模块化设计&#xff0c;支持大文件分片存储、用户权限管理、双因素认证等高级功能。 XFile系统的核心特…

写一个天气查询Mcp Server

上篇文章&#xff0c;我们聊到了 MCP 的基本概念&#xff0c;带大家快速入门了 MCP。 说入门应该毫不夸张&#xff0c;对于科普性质的文章&#xff0c;只需要知道这件事情的诞生背景以及有什么作用就可以了。 但是&#xff0c;如果要开发给大模型调用的 Mcp Server&#xff0…