165 lines
6.3 KiB
Python
165 lines
6.3 KiB
Python
# Lint as: python3
|
|
# coding=utf-8
|
|
# Copyright 2019 The TensorFlow Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ==============================================================================
|
|
|
|
"""Prepare data for further process.
|
|
|
|
Read data from "/slope", "/ring", "/wing", "/negative" and save them
|
|
in "/data/complete_data" in python dict format.
|
|
|
|
It will generate a new file with the following structure:
|
|
├── data
|
|
│ └── complete_data
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
import csv
|
|
import json
|
|
import os
|
|
import random
|
|
|
|
LABEL_NAME = "gesture"
|
|
DATA_NAME = "accel_ms2_xyz"
|
|
folders = ["wing", "ring", "slope"]
|
|
names = [
|
|
"hyw", "shiyun", "tangsy", "dengyl", "zhangxy", "pengxl", "liucx",
|
|
"jiangyh", "xunkai"
|
|
]
|
|
|
|
|
|
def prepare_original_data(folder, name, data, file_to_read):
|
|
"""Read collected data from files."""
|
|
if folder != "negative":
|
|
with open(file_to_read, "r") as f:
|
|
lines = csv.reader(f)
|
|
data_new = {}
|
|
data_new[LABEL_NAME] = folder
|
|
data_new[DATA_NAME] = []
|
|
data_new["name"] = name
|
|
for idx, line in enumerate(lines): # pylint: disable=unused-variable
|
|
if len(line) == 3:
|
|
if line[2] == "-" and data_new[DATA_NAME]:
|
|
data.append(data_new)
|
|
data_new = {}
|
|
data_new[LABEL_NAME] = folder
|
|
data_new[DATA_NAME] = []
|
|
data_new["name"] = name
|
|
elif line[2] != "-":
|
|
data_new[DATA_NAME].append([float(i) for i in line[0:3]])
|
|
data.append(data_new)
|
|
else:
|
|
with open(file_to_read, "r") as f:
|
|
lines = csv.reader(f)
|
|
data_new = {}
|
|
data_new[LABEL_NAME] = folder
|
|
data_new[DATA_NAME] = []
|
|
data_new["name"] = name
|
|
for idx, line in enumerate(lines):
|
|
if len(line) == 3 and line[2] != "-":
|
|
if len(data_new[DATA_NAME]) == 120:
|
|
data.append(data_new)
|
|
data_new = {}
|
|
data_new[LABEL_NAME] = folder
|
|
data_new[DATA_NAME] = []
|
|
data_new["name"] = name
|
|
else:
|
|
data_new[DATA_NAME].append([float(i) for i in line[0:3]])
|
|
data.append(data_new)
|
|
|
|
|
|
def generate_negative_data(data):
|
|
"""Generate negative data labeled as 'negative6~8'."""
|
|
# Big movement -> around straight line
|
|
for i in range(100):
|
|
if i > 80:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"}
|
|
elif i > 60:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"}
|
|
else:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"}
|
|
start_x = (random.random() - 0.5) * 2000
|
|
start_y = (random.random() - 0.5) * 2000
|
|
start_z = (random.random() - 0.5) * 2000
|
|
x_increase = (random.random() - 0.5) * 10
|
|
y_increase = (random.random() - 0.5) * 10
|
|
z_increase = (random.random() - 0.5) * 10
|
|
for j in range(128):
|
|
dic[DATA_NAME].append([
|
|
start_x + j * x_increase + (random.random() - 0.5) * 6,
|
|
start_y + j * y_increase + (random.random() - 0.5) * 6,
|
|
start_z + j * z_increase + (random.random() - 0.5) * 6
|
|
])
|
|
data.append(dic)
|
|
# Random
|
|
for i in range(100):
|
|
if i > 80:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"}
|
|
elif i > 60:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"}
|
|
else:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"}
|
|
for j in range(128):
|
|
dic[DATA_NAME].append([(random.random() - 0.5) * 1000,
|
|
(random.random() - 0.5) * 1000,
|
|
(random.random() - 0.5) * 1000])
|
|
data.append(dic)
|
|
# Stay still
|
|
for i in range(100):
|
|
if i > 80:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"}
|
|
elif i > 60:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"}
|
|
else:
|
|
dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"}
|
|
start_x = (random.random() - 0.5) * 2000
|
|
start_y = (random.random() - 0.5) * 2000
|
|
start_z = (random.random() - 0.5) * 2000
|
|
for j in range(128):
|
|
dic[DATA_NAME].append([
|
|
start_x + (random.random() - 0.5) * 40,
|
|
start_y + (random.random() - 0.5) * 40,
|
|
start_z + (random.random() - 0.5) * 40
|
|
])
|
|
data.append(dic)
|
|
|
|
|
|
# Write data to file
|
|
def write_data(data_to_write, path):
|
|
with open(path, "w") as f:
|
|
for idx, item in enumerate(data_to_write): # pylint: disable=unused-variable
|
|
dic = json.dumps(item, ensure_ascii=False)
|
|
f.write(dic)
|
|
f.write("\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
data = []
|
|
for idx1, folder in enumerate(folders):
|
|
for idx2, name in enumerate(names):
|
|
prepare_original_data(folder, name, data,
|
|
"./%s/output_%s_%s.txt" % (folder, folder, name))
|
|
for idx in range(5):
|
|
prepare_original_data("negative", "negative%d" % (idx + 1), data,
|
|
"./negative/output_negative_%d.txt" % (idx + 1))
|
|
generate_negative_data(data)
|
|
print("data_length: " + str(len(data)))
|
|
if not os.path.exists("./data"):
|
|
os.makedirs("./data")
|
|
write_data(data, "./data/complete_data")
|