genie_envisioner / scripts /get_statistics.py
yqi19's picture
add: full source code (py, yaml, json, sh, md, txt)
18e5c91 verified
Raw
History Blame Contribute Delete
4.35 kB
import os
import numpy as np
import pandas as pd
import tqdm
import json
import argparse
def load_data(data_path, key="action"):
data = pd.read_parquet(data_path)
data = np.stack([data[key][i] for i in range(data[key].shape[0])])
# data = np.stack([data[key][i][0] for i in range(data[key].shape[0])])
return data
def cal_statistic(data, _filter=True):
q99 = np.percentile(data, 99, axis=0)
q01 = np.percentile(data, 1, axis=0)
if _filter:
data_mask = (data>=q01) & (data <= q99)
data_mask = data_mask.min(axis=1)
data = data[data_mask, :]
means = np.mean(data, axis=0)
stds = np.std(data, axis=0)
return means, stds, q99, q01
def get_statistics(data_root, data_name, data_type, save_path, action_key="action", state_key="observation.state", nrnd=50000, _filter=True,):
assert(data_type in ["joint", "eef"])
data_path_list = os.listdir(data_root)
data_path_list.sort()
if nrnd <= len(data_path_list):
data_path_list = np.random.choice(data_path_list, nrnd)
data_list = []
state_list = []
delta_data_list = []
for data_path in tqdm.tqdm(data_path_list):
data = load_data(os.path.join(data_root, data_path), action_key)
data_list.append(data)
delta_data = data[1:] - data[:-1]
delta_data_list.append(delta_data)
state = load_data(os.path.join(data_root, data_path), state_key)
state_list.append(state)
data_list = np.concatenate(data_list, axis=0)
assert(len(data_list.shape)==2)
means, stds, q99, q01 = cal_statistic(data_list, _filter=_filter)
delta_data_list = np.concatenate(delta_data_list, axis=0)
assert(len(delta_data_list.shape)==2)
delta_means, delta_stds, delta_q99, delta_q01 = cal_statistic(delta_data_list, _filter=_filter)
state_list = np.concatenate(state_list, axis=0)
assert(len(state_list.shape)==2)
state_means, state_stds, state_q99, state_q01 = cal_statistic(state_list, _filter=_filter)
### example:
### data_name=agibotworld, data_type="joint"/"eef"
###
### StatisticInfo = {
### "agibotworld_joint": {
### "mean": [
### ...
### ]
### "std": [
### ...
### ]
### "agibotworld_delta_joint": {
### "mean": [
### ...
### ]
### "std": [
### ...
### ]
### }
### "agibotworld_state_joint": {
### "mean": [
### ...
### ]
### "std": [
### ...
### ]
### }
statistics_info = dict({
data_name+"_"+data_type:dict({
"mean": means.tolist(),
"std": stds.tolist(),
"q99": q99.tolist(),
"q01": q01.tolist(),
}),
data_name+"_delta_"+data_type:dict({
"mean": delta_means.tolist(),
"std": delta_stds.tolist(),
"q99": delta_q99.tolist(),
"q01": delta_q01.tolist(),
}),
data_name+"_state_"+data_type:dict({
"mean": state_means.tolist(),
"std": state_stds.tolist(),
"q99": state_q99.tolist(),
"q01": state_q01.tolist(),
}),
})
# if os.path.exists(save_path):
# with open(save_path, "r") as f:
# exist_info = json.load(f)
# else:
# exist_info = dict()
# for k in statistics_info.keys():
# assert k not in exist_info
exist_info = dict()
exist_info.update(statistics_info)
with open(save_path, "w") as f:
json.dump(exist_info, f, indent=4)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--data_root', default="PATH/TO/YOUR/DATASET")
parser.add_argument('--data_name', default="YOUR_CUSTOM_DATASET")
parser.add_argument('--data_type', default="joints")
parser.add_argument('--action_key', default="action")
parser.add_argument('--state_key', default="observation.state")
parser.add_argument('--save_path', default="PATH/OF/JSON/FILE")
args = parser.parse_args()
get_statistics(
args.data_root, args.data_name, args.data_type, args.save_path, action_key=args.action_key, state_key=args.state_key
)