用自己的数据集训练TimeSformer并转ONNX用c++推理

news2024/12/30 2:28:53

用自己的数据集训练TimeSformer并转ONNX用c++推理

文章目录

  • 用自己的数据集训练TimeSformer并转ONNX用c++推理
    • 下载安装TimeSformer
    • 创建分类文件夹
    • 创建数据集
    • 修改训练配置
    • 运行脚本开始训练
    • 测试模型
    • 模型转为onnx
    • 测试一下生成的onnx模型
    • 转为用c++推理

下载安装TimeSformer

TimeSformer开源地址

按照官方教程安装好环境。
如果报下面这个错误,是因为新版的pytorch已经不支持那种写法了,需要修改一下。

ImportError: cannot import name '_LinearWithBias' from 'torch.nn.modules.linear'

可以参考这个人的fork修改

创建分类文件夹

我这里有61个动作分类,每个分类创建一个文件夹
在这里插入图片描述
将视频文件分割成 每个视频大概10s左右;
然后将视频文件按照分类放到每个文件夹里。

创建数据集

写一个脚本分割数据集,并生成标签文件

import os
import csv
import shutil
from tqdm import tqdm
from sklearn.model_selection import train_test_split

out_dir = "/home/disk/liangbaikai/TimeSformer/mydata/mydatasets"  # 输出路径
video_path = "/home/disk/liangbaikai/TimeSformer/mydata/myvideos" # 数据集路径
file_name = ".csv"
name_list = ["train","test","val"]

if not os.path.exists(out_dir):
    os.mkdir(out_dir)
if not os.path.exists(os.path.join(out_dir, 'train')):
    os.mkdir(os.path.join(out_dir, 'train'))
if not os.path.exists(os.path.join(out_dir, 'val')):
    os.mkdir(os.path.join(out_dir, 'val'))
if not os.path.exists(os.path.join(out_dir, 'test')):
    os.mkdir(os.path.join(out_dir, 'test'))

for file in os.listdir(video_path):
        file_path = os.path.join(video_path, file)
        video_files = [name for name in os.listdir(file_path)]
        #将20%的数据分配给test
        train_and_valid, test = train_test_split(video_files, test_size=0.2, random_state=42)
        #将80%的数据再分配20%出来给val,剩下的给train
        train, val = train_test_split(train_and_valid, test_size=0.2, random_state=42)
        train_dir = os.path.join(out_dir, 'train', file)
        val_dir = os.path.join(out_dir, 'val', file)
        test_dir = os.path.join(out_dir, 'test', file)
        if not os.path.exists(train_dir):
            os.mkdir(train_dir)
        if not os.path.exists(val_dir):
            os.mkdir(val_dir)
        if not os.path.exists(test_dir):
            os.mkdir(test_dir)
        for video in tqdm(train):
           shutil.copy(os.path.join(video_path,file,video),os.path.join(train_dir,video))
        for video in tqdm(test):
            shutil.copy(os.path.join(video_path,file,video),os.path.join(test_dir,video))
        for video in tqdm(val):
            shutil.copy(os.path.join(video_path,file,video),os.path.join(val_dir,video))

#输出路径下创建csv文件夹,并在文件夹下创建train.csv val.csv test.csv
csv_path = os.path.join(out_dir,"csv")
if not os.path.exists(csv_path):
    os.mkdir(csv_path)
    for name in name_list:
        with open(os.path.join(csv_path,name+file_name),'wb') as f:
            print("创建"+os.path.join(csv_path,name+file_name))



for ii in os.listdir(csv_path):
    if ii.split(".")[0] in name_list:
        path1 = os.path.join(csv_path,ii)
        with open(path1, 'w', newline='') as f:
            for dd in os.listdir(out_dir):
                if dd==ii.split(".")[0]:
                    for zz in os.listdir(os.path.join(out_dir,dd)):
                        for mm in os.listdir(os.path.join(out_dir,dd,zz)):
                            writer = csv.writer(f)
                            writer.writerow([os.path.join(out_dir,dd,zz,mm),zz])

## 创建类别label标号文件
labels= []
for label in sorted(os.listdir(video_path)):
    labels.append(label)
label2index = {
   label: index for index, label in enumerate(sorted(set(labels)))}
label_file = os.path.join(out_dir, str(len(os.listdir(video_path))) + 'class_labels.txt')
with open(label_file, 'w') as f:
    for id, label in enumerate(sorted(label2index)):
        f.writelines(str(id) + ' ' + label +'\n')

#替换csv文件中类别名为数字
csv_file = os.path.join(out_dir,"csv")
def txt_read(files):
    txt_dict = {
   }
    fopen = open(files)
    for line in fopen.readlines():
        line = str(line).replace('\n','')
        txt_dict[line.split(' ',1)[1]] = line.split(' ',1)[0]      
    fopen.close()
    return txt_dict
txt_dict = txt_read(label_file)
print(txt_dict)

for ii in os.listdir(csv_file):
    path1 = os.path.join(csv_file,ii)
    r = csv.reader(open(path1))
    lines = [l for l in r]
    for i in range(

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

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

相关文章

IDEA中Maven--下载安装自己适配的版本---理解

Maven解释: Maven是一个强大的项目管理工具和构建工具,主要用于Java项目。它能够帮助开发团队管理项目的依赖、构建项目、发布文档和报告,并能够自动化许多重复的任务。 Maven的主要作用包括: 依赖管理:Maven能够管理…

Google Earth Engine(GEE)——checkbox的使用

结果 函数: ui.Checkbox(label, value, onChange, disabled, style) A checkbox with a label. Arguments: label (String, optional): The checkboxs label. Defaults to an empty string. value (Boolean, optional): Whether the checkbox is checked. A nu

SpringBoot 实现RequestBodyAdvice封装统一接受类功能

一、相关往期文章 SpringBootVue实现AOP系统日志功能_aop的vue完整项目 Spring AOP (面向切面编程)原理与代理模式—实例演示_面向切面aop原理详解 二、需求分析 按照一般情况,统一接受类可以像以下的方式进行处理: 如果不想使用 Request…

8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 YL69-485/232

特点: ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持8个编码器同时计数,可识别正反转 ● 也可以设置作为16路独立DI高速计数器 ● 编码器计数值支持断电自动保存 ● DI输入和电源之间3000V隔离 ● 通过RS-4…

在线二维码解码器:将二维码转换成网址链接

在当今数字化时代,二维码(QR码)已成为一种便捷的信息传递工具。它不仅可以存储大量数据,还能快速分享信息。然而,有时我们需要将二维码中的内容转换为网址链接,以便在浏览器中直接访问。小编将详细介绍如何…

【Java】已解决java.nio.channels.ClosedChannelException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.ClosedChannelException异常 在Java的NIO(New I/O)编程中,java.nio.channels.ClosedChannelException是一个常见的异常…

内容安全复习 5 - 深在线社交网络分析与舆情监测

文章目录 在线社交网络分析什么是在线社交网络什么是在线社交网络分析社交网络信息传播基本模型影响力模型传染模型影响力计算公式 网络舆情监测网络舆情概述网络舆情监测系统 在线社交网络分析 什么是在线社交网络 在线社交网络是一种在信息网络上由社会个体集合及个体之间的…

分布式锁(Redission)

分布式锁: 使用场景: 通常对于一些使用率高的服务,我们会进行多次部署,可能会部署在不同的服务器上,但是他们获取和操作的数据仍然是同一份。为了保证服务的强一致性,我们需要对线程进行加锁,…

This content is blocked. Contact the site owner to fix the issue.

chrome浏览器在网页邮箱预览PDF附件,报如下错误: This content is blocked. Contact the site owner to fix the issue. 无法预览。 原因: chrome设置了PDF默认下载。更改为在chrome中打开PDF即可。 chrome://settings/content/pdfDocuments…

iOS 18 为 iPhone 15 机型引入了更多充电限制选项

iOS 18 为 iPhone 15 机型引入了更多充电限制选项 所有四款iPhone 15型号都具备一项设置,可以限制设备充电至80%以内,这样能够缩短电池完全充电所需的时间,并有可能延长iPhone电池的使用寿命。随着iOS 18的推出,Apple进一步加入了…

Blazor的SSR服务端渲染是不是交互式的

从.NET8开始,Blazor引入了SSR服务端渲染,归功于MVC和RazePage的沉淀,虽然来得晚,但一经发布,就将Blazor推向了新的高度。从今年开始,Youtube上关于Blazor的优质教学视频,以肉眼可见的速度在增加…

xocde编辑器支持修改为中文吗?不支持

xocde编辑器支持修改为中文吗? 不支持

故障诊断 | SABO-VMD-SVM轴承故障诊断(Matlab)

效果一览 文章概述 故障诊断 | SABO-VMD-SVM轴承故障诊断(Matlab) 模型描述 减法平均的优化算法(Subtraction-Average-Based Optimizer (SABO)),是于2023年提出的一种基于数学行为的智能优化算法,该算法具有寻优能力强,收敛速度快等特点。以最小包络熵、最小样本熵、最…

Spring Boot 3 搭建

1、jdk 17 2、spring boot 3.1.7 3、pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xs…

Ubuntu24使用kubeadm部署高可用K8S集群

Ubuntu24使用kubeadm部署高可用K8S集群 使用kubeadm部署一个k8s集群&#xff0c;3个master1个worker节点。 1. 环境信息 操作系统&#xff1a;ubuntu24.04内存: 2GBCPU: 2网络: 能够互访&#xff0c;能够访问互联网 hostnameip备注k8s-master1192.168.0.51master1k8s-maste…

Vue 3 中处理文件上传和响应式更新

Vue 3 中处理文件上传和响应式更新 一、前言1.创建文件上传组件2.解释代码3.在主应用中使用文件上传组件4.总结 一、前言 在现代 web 开发中&#xff0c;文件上传是一个常见需求。本文将详细介绍如何在 Vue 3 中处理文件上传&#xff0c;并确保上传后的文件列表能够响应式更新…

分享:Javascript开源桌面环境-Puter

Puter这是一个运行在浏览器里的桌面操作系统&#xff0c;提供了笔记本、代码编辑器、终端、画图、相机、录音等应用和一些小游戏。该项目作者出于性能方面的考虑没有选择 Vue 和 React 技术栈&#xff0c;而是采用的 JavaScript 和 jQuery 构建&#xff0c;支持 Docker 一键部署…

[C++ STL] list 详解

标题&#xff1a;[C STL] vector 详解 水墨不写bug 正文开始&#xff1a; 一、背景 C语言阶段&#xff0c;我们如果想要使用链表&#xff0c;需要自己手动实现一个链表。这是非常低效的做法&#xff0c;C中的STL中提供了链表“ list ”&#xff0c;我们在包含头文件 <list…

k8s离线部署nginx

1. 拉取nginx离线包到本地 sudo docker save nginx:latest -o nginx.tar 2. 导入nginx image到k8s命名空间中 sudo ctr -n k8s.io images import nginx.tar 3. 编辑nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:match…

鱼缸补水器工作原理是什么

鱼缸补水器是一种应用广泛的智能设备&#xff0c;主要用于自动监测和补充鱼缸内的水位&#xff0c;以确保鱼类生存环境的稳定。其工作原理简单而高效&#xff0c;为饲主提供了方便和安全的使用体验。 该补水器通常由两部分组成&#xff1a;控制器和吸盘。首先&#xff0c;用户…