【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

news2025/4/5 13:27:52

系列文章目录

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现
【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建
【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用

在一个人体姿态估计的任务中,需要用深度学习模型来进行序列分类。
时间花费最多的是在数据集的处理上。
这一节主要内容就是对数据集的处理。

文章目录

  • 系列文章目录
  • 前言
  • 一、任务问题和数据采集
    • 1 任务问题
    • 2 原始数据采集
  • 二、数据处理和生成样本
    • 1 data_merge2single.py
    • 2 data_plot.py
    • 3 data_split.py
  • 三、制作标签文件和数据集划分文件
    • 1 target 文件
    • 1 target 文件
  • 四、总结
    • 1 数据集示例
    • 2 数据集下载路径


前言

类似于part1的工作,这部分对数据集进行了分析处理


一、任务问题和数据采集

1 任务问题

人体姿态估计:
在人体左右腿放置加速度传感器,分别采集横滚角和俯仰角。传感器生成高频数据,对不同状态下采集的数据进行分类,可以识别人体姿态。

2 原始数据采集

采集6类动作姿态,每种动作记录10次过程量。
蹲姿到站立(右蹲) ------ 1
蹲姿到站立(左蹲)----- 2
行进 ----------------------- 3
原地踏步 ----------------- 4
站立到蹲姿(右蹲) ------ 5
站立到蹲姿(左蹲) ------ 6

data_merge 文件夹下存放采集到的原始数据。
data_merge_1.xlsx
data_merge_2.xlsx
data_merge_3.xlsx
data_merge_4.xlsx
data_merge_5.xlsx
data_merge_6.xlsx
每一个 xlsx 文件对应一类动作姿态,保存有10组实验数据。

以 data_merge_1.xlsx 文件内容为例:
在这里插入图片描述

二、数据处理和生成样本

1 data_merge2single.py

将每类动作姿态的data_merge_x.xlsx文件分解,每一组实验单独保存在一个文件中。

"""
@file name:data_merge2single.py
@desc: 得到每次实验的单独数据
"""
import os
import pandas as pd

'''
/****************************************************/
    路径指定
/****************************************************/
'''
# ----------------------------------------------------#
#           数据路径
# ----------------------------------------------------#
ROOT_path = "DATA/RT_Position_dataset"
merge_path = os.path.join(ROOT_path, "data_merge")
path_list = os.listdir(merge_path)
# print(path_list)
# ['data_merge_1.xlsx', 'data_merge_2.xlsx', 'data_merge_3.xlsx', 'data_merge_4.xlsx', 'data_merge_5.xlsx', 'data_merge_6.xlsx', '~$data_merge_1.xlsx']

single_path = os.path.join(ROOT_path, "data_single_test")
if not os.path.exists(single_path):
    os.mkdir(single_path)

# ----------------------------------------------------#
#           对每个文件进行读取
# ----------------------------------------------------#
for i in range(0, len(path_list)):  # 遍历 data_merge_x.xlsx 文件
    file_path = os.path.join(merge_path, path_list[i])
    save_path = os.path.join(single_path, str(i + 1))
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    print("----------------------------------------------------")
    print(file_path)
    # 使用pandas读取Excel文件
    df = pd.read_excel(file_path)
    # 计算总列数
    total_columns = df.shape[1]
    index = 0
    # 每四列分割并保存(在实验中,分别采集左右腿的俯仰角和横滚角,特征数目为4)
    for start_col in range(0, total_columns, 4):
        index += 1
        # 确定每个文件的列范围
        end_col = min(start_col + 4, total_columns)
        # 提取四列数据
        sub_df = df.iloc[:, start_col:end_col]
        # 保存到新的xlsx文件
        sub_df.to_csv(f'{save_path}/{str(i + 1)}_{index}.csv', index=False)

data_singe_test 文件夹下存放每组实验的单独数据。
在这里插入图片描述

2 data_plot.py

分析每个类别下的每一组实验,不是所有数据都有用,得到有效数据区间

"""
@file name:data_plot.py
@desc: 绘制每组实验的数据图,分析有效数据区间
"""
import pandas as pd
import matplotlib.pyplot as plt

# ----------------------------------------------------#
#           数据路径
# ----------------------------------------------------#
file_path = "DATA/RT_Position_dataset/data_single_test/2/2_5.csv"

df = pd.read_csv(file_path, header=2)  # 使用pandas读取Excel文件
# 跳过前两行数据
# df = df.iloc[2:]

# 绘制波形图
plt.figure(figsize=(12, 8))

for i, column in enumerate(df.columns):
    plt.subplot(len(df.columns), 1, i+1)
    plt.plot(df[column])
    plt.title(f'Column: {column}')

plt.tight_layout()
plt.show()

在这里插入图片描述
后续的工作就是从每组实验的有效数据区间中生成样本。

log = {'1': [[130, 300], [100, 250], [160, 310], [130, 300], [120, 280],
             [200, 370], [120, 270], [100, 270], [100, 290], [160, 320]],
       '2': [[100, 250], [290, 400], [200, 360], [180, 320], [180, 310],
             [150, 290], [160, 300], [140, 270], [120, 270], [100, 260]],
       '3': [[100, 400], [100, 370], [100, 450], [100, 450], [100, 450],
             [150, 450], [130, 450], [100, 400], [150, 420], [150, 400]],
       '4': [[100, 420], [100, 420], [200, 420], [200, 420], [200, 420],
             [200, 420], [200, 420], [150, 400], [100, 400], [200, 400]],
       '5': [[100, 300], [170, 300], [100, 300], [100, 250], [250, 400],
             [100, 270], [150, 300], [100, 280], [120, 270], [130, 270]],
       '6': [[120, 300], [150, 250], [100, 300], [50, 300], [100, 240],
             [170, 310], [50, 250], [80, 280], [80, 280], [100, 300]],
       }  # 记录每组实验的有效数据区间

3 data_split.py

针对每一组实验的有效区间,提取并生成样本

"""
@file name:data_split.py
@desc: 分割并生成样本
"""
import os
import pandas as pd

log = {'1': [[130, 300], [100, 250], [160, 310], [130, 300], [120, 280],
             [200, 370], [120, 270], [100, 270], [100, 290], [160, 320]],
       '2': [[100, 250], [290, 400], [200, 360], [180, 320], [180, 310],
             [150, 290], [160, 300], [140, 270], [120, 270], [100, 260]],
       '3': [[100, 400], [100, 370], [100, 450], [100, 450], [100, 450],
             [150, 450], [130, 450], [100, 400], [150, 420], [150, 400]],
       '4': [[100, 420], [100, 420], [200, 420], [200, 420], [200, 420],
             [200, 420], [200, 420], [150, 400], [100, 400], [200, 400]],
       '5': [[100, 300], [170, 300], [100, 300], [100, 250], [250, 400],
             [100, 270], [150, 300], [100, 280], [120, 270], [130, 270]],
       '6': [[120, 300], [150, 250], [100, 300], [50, 300], [100, 240],
             [170, 310], [50, 250], [80, 280], [80, 280], [100, 300]],
       }
'''
/****************************************************/
    路径指定
/****************************************************/
'''
ROOT_path = "DATA/RT_Position_dataset"
# ----------------------------------------------------#
#    单次实验数据路径
# ----------------------------------------------------#
single_test_path = os.path.join(ROOT_path, "data_single_test")
# 样本保存路径
save_path = os.path.join(ROOT_path, "dataset")
if not os.path.exists(save_path):
    os.mkdir(save_path)
# ----------------------------------------------------#
#    设置数据样本长度len_seq(设置每个文件的行数)
# ----------------------------------------------------#
rows_per_file = 16

'''
/****************************************************/
    导出数据样本
/****************************************************/
'''
index = 0
# 使用os.listdir()列出文件夹中的所有内容(包括子文件夹和文件)
contents = os.listdir(single_test_path)  # ['1', '2', '3', '4', '5', '6']
# 使用列表推导式过滤出所有子文件夹
folders = [content for content in contents if os.path.isdir(os.path.join(single_test_path, content))]
# 遍历文件夹中的所有子文件夹
for folder in folders:  # ['1', '2', '3', '4', '5', '6']
    folder_path = os.path.join(single_test_path, folder)
    # print(folder_path)
    # 遍历子文件夹中的所有文件
    for csv_file in os.listdir(folder_path):
        part = csv_file.split('_')[1].split('.')[0]  # part = 1,2,3,4,5,6,7,8,9,10
        file_path = os.path.join(folder_path, csv_file)
        # ----------------------------------------------------------------
        # 使用pandas读取Excel文件
        df = pd.read_csv(file_path, header=2)
        # 读取每次实验有效数据序列索引
        [start, end] = log[folder][int(part) - 1]
        # 选择每次实验中的有效数据
        df_selected = df.iloc[start:end]
        # 有效数据的总行数
        total_rows = len(df_selected)

        # ----------------------------------------------------#
        #    核心的参数调整
        # ----------------------------------------------------#
        number_of_files = 200  # 每次实验的有效数据中,可以生成样本数的上限
        window_size = rows_per_file  # 滑动窗口的大小
        step_size = 3  # 滑动窗口的步长

        for file_number in range(number_of_files):
            # 计算滑动窗口的起始和结束索引
            start_index = file_number * step_size
            end_index = start_index + window_size
            # 防止结束索引超出数据范围
            if end_index > total_rows:
                break
            # 提取数据
            df_subset = df_selected.iloc[start_index:end_index]

            index += 1
            # 保存到新的csv文件
            df_subset.to_csv(f'{save_path}/Movement4_{index}.csv', index=False)
    print(f"{folder}输出的文件索引截止到{index}")

从所有实验数据中,生成样本并保存到 dataset 文件夹下。
这里的超参数设置:

  • rows_per_file = 16 样本数据的长度是16,size是[16,4]
  • number_of_files = 200 每次实验的有效数据中,可以生成样本数的上限
  • step_size = 3 滑动窗口的步长,步长过长数据无法充分利用,过小容易过拟合

    1~500索引文件对应类别1,以此类推。共生成3730个样本。在这里插入图片描述

三、制作标签文件和数据集划分文件

上述步骤已生成样本,仿照 part1 文章中提及的数据集,制作 target 文件和 DatasetGroup 文件
本节手动制作两个csv文件。

1 target 文件

新建一个Movement4_target.csv文件,两列分别记录索引和对应类别。索引为1 ~ 3730,类别为1 ~ 6。

1 target 文件

新建一个Movement4_DatasetGroup.csv文件,两列分别记录索引和对应数据集。索引为1 ~ 3730,数据集组别为1 ~ 3。

在这里插入图片描述

将制作的 target 文件和 DatasetGroup 文件 保存到 groups 文件夹下。

四、总结

1 数据集示例

最终得到的数据集文件如下所示。
核心是 dataset 和 groups 文件夹。
在这里插入图片描述

2 数据集下载路径

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

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

相关文章

上门服务小程序|预约上门服务系统开发有哪些功能?

在现代快节奏的生活中,压力和疲劳常常困扰着我们。为了缓解这种状况,越来越多的人选择去按摩店进行放松。然而,繁忙的工作和家庭责任往往让我们无法抽出时间去按摩店。在这种情况下,上门按摩服务应运而生。而随着科技的发展&#…

VI / VIM的使用

vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且 还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x win…

SpringMVC第二天

今日内容 能够掌握SSM整合的流程 能够编写SSM整合功能模块类 能够使用Result统一表现层响应结果 能够编写异常处理器进行项目异常 能够完成SSM整合前端页面发送请求实现增删改查操作 能够编写拦截器并配置拦截器 一、SSM整合【重点】 1 SSM整合配置 问题导入 请描述“SSM整…

IntelliJ IDE 插件开发 | (五)VFS 与编辑器

系列文章 IntelliJ IDE 插件开发 |(一)快速入门IntelliJ IDE 插件开发 |(二)UI 界面与数据持久化IntelliJ IDE 插件开发 |(三)消息通知与事件监听IntelliJ IDE 插件开发 |(四)来查收…

Windows AD 组策略 通过脚本修改管理员密码:以安全方式

因为本文主要讲的是通过脚本如何以安全方式设置密码,所以关于组策略如何设置请参考这里: WinServer 2019 AD 组策略 启用本地管理员账号,重置密码_ad域命令启用administrator账户-CSDN博客 我们首先要讲一下,以一般方法创建的脚…

力扣1027. 最长等差数列

动态规划 思路: 可以参考力扣1218. 最长定差子序列目前不清楚公差,可以将序列最大最小值找到,公差的范围是 [-(max - min), (max - min)],按公差递增迭代遍历求出最长等差数列; class Solution { public:int longest…

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈,拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解,还能够树立品牌形象,提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…

浅析混沌工程的主要概念和作用

混沌工程是一种系统设计和测试方法,旨在通过有目的地在生产环境中引入故障来发现和解决系统中的潜在问题。通过模拟故障和持续测试,有助于发现和解决系统中的潜在问题,提高系统的可靠性、弹性和安全性。 故障引入: 混沌工程通过故…

for循环延时时间计算

​ 文章目录 前言一、计算方式二、for循环 2.1 for循环里定义变量2.2 codeblock设置C99标准 三、四、总结 前言 之前做led点亮的实验,好像是被delay函数影响了,因为delay参数设置的不对,led没有正常闪烁。现在就想搞明白一些。 一、计算…

Windows11 Copilot助手开启教程(免费GPT-4)

Windows11上开启Copilot助手教程踩坑指南 Copilot介绍Copilot开启步骤1、更新系统2、更改语言和区域3、下载 ViVeTool 工具4、开启Copilot 使用 Copilot介绍 Windows Copilot 是 Windows 11 中的一个新功能,它可以让你与一个智能助理进行对话,获取信息&…

Win11在某些时候想要关闭windows安全中心应该怎么做,安装navicat事例

比如在安装navicat时,需要注册,注册机被删,就是windows安全中心干的,所以要想办法,不让他把注册机删掉,那么这里有一个比较巧妙的办法,就使用排除项,关闭 实时保护, 添…

app逆向-frida安装调试

文章目录 一、前言二、安装三、hook调试,hook java类 一、前言 frida是一款基于python javascript 的hook框架,可运行在android ios linux winosx等各平台,主要使用动态二进制插桩技术 官方网站:https://frida.re/docs/home/ a…

【深度学习】初识深度学习

初识深度学习 什么是深度学习 关系: #mermaid-svg-7QyNQ1BBaD6vmMVi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QyNQ1BBaD6vmMVi .error-icon{fill:#552222;}#mermaid-svg-7QyNQ1BBaD6vmMVi .err…

探索Gin框架:快速构建高性能的Golang Web应用

前言 Gin框架是一个轻量级的Web框架,基于Go语言开发,旨在提供高性能和简洁的API。它具有快速的路由和中间件支持,使得构建Web应用变得更加简单和高效。无论是构建小型的API服务还是大型的Web应用,Gin框架都能够满足你的需求。 无论…

开源免费无广告Gopeed,现代化的高速下载器,支持(HTTP、BitTorrent、Magnet)等多种协议下载,开源免费、无广告、高度可定制、不限速。

目录 特点 支持的平台 一键部署 体验 特点 全平台支持、开源免费,不限速、无广告 遵循 GPL-3.0 开源协议 支持(HTTP、BitTorrent、Magnet)协议下载 高速下载,底层使用golang协程并发下载 每日自动更新 tracker 列表 去中心…

element-ui 树形控件 通过点击某个节点,遍历获取上级的所有父节点和本身节点

1、需求&#xff1a;点击树形控件的某个节点&#xff0c;需要拿到它上级的所有父节点进行操作 2、代码&#xff1a; 树形控件代码 <el-tree:data"deptOptions"node-click"getVisitCheckedNodes"ref"target_tree_Speech"node-key"id&qu…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

IDEA自带数据库导入SQL文件

右键数据库 - > 点击SQL Scripts -> run SQL Scripts 就可以选择对应的文件了

Zookeeper架构系列——集群模式

背景 架构图 集群模式详解 客户端连接到单个ZooKeeper服务器。客户端维护一个TCP连接&#xff0c;通过该连接发送请求、获取响应、获取监视事件和发送检测信号。如果与服务器的TCP连接中断&#xff0c;客户端将连接到其他服务器。 订购了ZooKeeper。ZooKeeper在每次更新时都…

Kotlin for loop: in、 until、 step、 downTo

Kotlin for loop: in、 until、 step、 downTo fun loop1() {for (i in 0..5) {print("$i ")}println("\n1-end\n") }fun loop2() {for (i in 0 until 5) {print("$i ")}println("\n2-end\n") }fun loop3() {for (i in 0 until (5)) {…