入门神经网络-搭建自己的网络结构之样本采集(一)
入门神经网络一
样本采集
在本科的时候对神经网络颇有兴趣,感觉很神秘,特别是当时的yolov5目标检测算法,让我感觉特别震撼,计算机在图像识别上已经超过了人眼。但是这么长时间以来一直停留在跑demo的阶段,没有静下心来学习,为此我计划搭建一个属于自己的神经网络作为入门标志,这是第一章,主要讲了说明采集样本的过程。
建立一个怎样的网络
我计划建立的网络结构,输入参数为陀螺仪三轴传感器的数据,输出内容为可能进行的姿态:休息、走路、跑步。虽然直接判断陀螺仪的传感器数据就能得到结果,但是我还是希望建立这样一个网络结构,因为在时间成本与经济成本上花费较小。
输入数据的结构
输入数据是一段时间内的传感器数据,我的计划是间隔一段时间采集三轴加速度传感器数据,每个样本包括50个三轴数据,因此,输入数据为3X50的矩形。
怎样采集样本
我手头有esp32开发板,板载一颗mpu6050陀螺仪,并且可以连接电池,我计划用它来采集样本,单个样本数据包括x、y、z轴的加速度传感器数据,我想将数据保存在内部flash中,这样不用携带额外的存储设备。假设一帧样本为3X50的数据,我计划每种姿态采集300帧,一个姿态就是300X3X50的数据,因为加速度计的原始数据太低,我在采集时将其扩大1000倍运算。编程使用板载的两个按键分别作为采集信息和打印信息按钮。esp32正常复位后,按键一表示采集按钮,按下后系统开始采集,将数据保存在内部flash中,一个姿态的数据采集完成后,再次按下按键可以采集下一个姿态,如此循环采集三种姿态的数据,将其保存在内部flash中,分别命名为running.txt,walking.txt,resting.txt,再按下按键二,分别将样本数据打印到串口助手,使用“e”作为间隔符号.代码位于tools/arduino_getSample/GetAllData
整理样本
将串口助手打印出来的样本复制粘贴到txt中,分别重新命名放在sample文件夹下,这样的数据用程序读取起来太费劲,因此我专门写了一个脚本将txt中的样本数据储存为np文件,示例如下,当然我也会全部开源在github,这个工具位于tools文件夹下。分别转换三个txt文件,生成三个npy文件,这样我们在往后训练时读取数据会很方便。
import numpy as np number_of_sample = 50 data_array = [] # 创建一个全为零的三维数组,其中二维部分大小为(3,number_of_sample) data_array_out = np.empty(shape=[0, 3, number_of_sample]) data_array_out = data_array_out.astype(int) # 强制转换为int file = open('../sample/run.txt') # 打开样本文件,其中e为分隔符 val_list = file.readlines() # 读取所有行 for line in val_list: # 遍历所有行 line = line.strip('\n') # 清除所有的\n if line == 'e': # 发现分隔符时append数组 print("分隔符") data_array_np = np.array(data_array).T # 转置 data_array_out = np.append( data_array_out, [data_array_np], axis=0) # 将二维数组append到三位数组中 data_array = [] # 数组清空 else: num_int = list(map(int, line.split(' '))) # 使用空格切片 data_array.append(num_int) # append到数组中 print(data_array_out) print(data_array_out.shape) np.save("../sample/run.npy", data_array_out) # 保存数组
已知存在缺陷
- 样本均由我一人采集,不具有普遍性,可能其他人直接使用我的网络数据效果很差
- 样本太少数量太少,可能会导致训练结果较差
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。