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

用自己的数据集训练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(

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EasyRecovery数据恢复软件2024免费版下载

EasyRecovery数据恢复软件,是我在电脑使用过程中遇到的神器!它不仅功能强大,操作简便,还帮我找回了丢失的重要文件。今天,我就来给大家分享一下我的使用体验和心得。 让我来介绍一下EasyRecovery的功能。这款软件可以恢…

qt开发-09_分裂器

QSplitter 是 Qt 框架中的一个非常实用的控件,用于创建可调整大小的窗格。它允许用户通过拖动子窗口间的边界(也称为分割条)来动态调整子窗口的尺寸。这在开发需要多个视图同时显示,且用户需要根据需要调整每个视图大小的应用程序…

内容安全复习 6 - 白帽子安全漏洞挖掘披露的法律风险

文章目录 安全漏洞的法律概念界定安全漏洞特征白帽子安全漏洞挖掘面临的法律风险“白帽子”安全漏洞挖掘的风险根源“白帽子”的主体边界授权行为边界关键结论 安全漏洞的法律概念界定 可以被利用来破坏所在系统的网络或信息安全的缺陷或错误;被利用的网络缺陷、错…

推荐4款实用工具,非常好用,建议收藏

PDFREAL PDFReal 是一个功能强大的在线PDF编辑工具,提供多种实用的PDF处理功能。用户可以在一个网站上完成包括PDF合并、PDF拆分、PDF压缩、PDF保护、PDF解锁等多种操作。此外,PDFReal 还支持将文本转换为PDF、将图片转换为PDF、添加水印、提取页面内容等…

【Springcloud微服务】Docker上篇

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Springcloud微服务 🌠 首发时间:2024年6月22日 🦋 欢迎关注🖱点赞👍收藏🌟留言&#x1f4…

Vue73-命名路由

一、路由的name属性 二、小结

Pyqt5 + Qt Creator实现QML开发环境配置

先安装Qt Creator, 该软件主要是为了编辑QML文件 在pycharm中配置外部插件,实现Qt Creator的调用 配置完成后,右击qml文件选择Qt Creator就可以直接进行编辑了

Nominatim免费的地址解析,逆地址解析,OpenStreetMap开源地图数据【全网最全】

视频学习地址 国内的一些地址解析供应商的API都开始付费了,就想找个免费的地址解析和逆地址解析的应用,最终选择了Nominatim OpenStreetMap 文章目录 一、选型1-1、数据源1-2、地理编码引擎2-1、初尝Nominatim2-1-1、地址解析2-1-2、逆地址解析 2-2、OS…

HarmonyOS角落里的知识—Stage模型应用程序

开发态包结构 在DevEco Studio上创建一个项目工程,并尝试创建多个不同类型的Module。根据实际工程中的目录对照本章节进行学习,可以有助于理解开发态的应用程序结构。 图1 项目工程结构示意图(以实际为准) 工程结构主要包含的文…

RabbitMQ —— 理解及应用场景

一、MQ相关的概念 RabbitMQ 是一种分布式消息中间件,消息中间件也称消息队列MQ,那么什么是MQ呢?请继续阅读下文。 1.1、MQ的基本概念 什么是MQ MQ(message queue),从字面意思上看就个 FIFO 先入先出的队列,只不过队列…

工业互联网的独特UI风格

工业互联网的独特UI风格

纯血鸿蒙 璀璨星河

点击上方蓝字关注我,知识会给你力量 华为最近可谓是加班加点,前段时间华为给出了鸿蒙系统的计划表,让大家都摩拳擦掌,想看看华为到底有几把刷子,这次的621HDC大会,就是华为给全世界的第一个交待。 最近在网…

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫(LPS),为非晶态材料,是硫化物固态电解质代表性产品之一,具有热稳定性好、成本较低等优点,在固态电解质中离子电导率较…

外卖APP开发详解:从同城O2O系统源码开始

近期,从事软件开发的小伙伴们都在讨论外卖APP,热度非常之高,所以小编今天将与大家一同探讨同城O2O系统源码、外卖APP开发。 一、外卖APP开发的前期准备 了解目标用户的需求,分析竞争对手的优劣势,明确自身的市场定位。…

Excel 导入实例

在上一节的基础上&#xff0c;本文演示下如何导入excel数据。 Excel导入操作指导 继承ocean-easyexcel SDK&#xff0c;上一节打包生成 <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version…

VB验证密码

在文本框中输入密码&#xff0c;“验证密码”按钮检验输入的是否为“123456”。“清空”按钮清空文本框。“结束”按钮关闭窗体。 Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim P$P Trim(TextBox1.Text)If P &…

第13章.创建MDK工程-基于标准库版

目录 0. 《STM32单片机自学教程》专栏 13.1 新建本地工程文件夹 13.2 新建工程 13.2.1 新建工程 13.2.2 新建组 13.2-3 添加文件 13.3 配置魔术棒选项卡 13.3.1 Output 选项卡 13.3.2 C/C选项配置 13.3.3 Dubug选项配置 13.4 使用标准库点亮LED 参考资料&#xff1…

分布式锁(Redission)

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

Appium Android 自动化测试 -- 元素定位

自动化测试元素定位是难点之一&#xff0c;编写脚本时会经常卡在元素定位这里&#xff0c;有时一个元素能捣鼓一天&#xff0c;到最后还是定位不到。 Appium 定位方式和 selenium 一脉相承&#xff0c;selenium 中的定位方式Appium 中都支持&#xff0c;而 Appium 还增加了自己…

2021数学建模C题目– 生产企业原材料的订购与运输

C 题——生产企业原材料的订购与运输 思路&#xff1a;该题主要是通过对供应商的供货能力和运送商的运货能力进行估计&#xff0c;给出合适的材料订购方案 程序获取 第一题问题思路与结果&#xff1a; 对 402 家供应商的供货特征进行量化分析&#xff0c;建立反映保障企业生…