light-mer / toolkit /utils /read_files.py
multimodalart's picture
multimodalart HF Staff
Upload folder using huggingface_hub
89d702d verified
Raw
History Blame Contribute Delete
9.06 kB
import os
import json
import math
import random
import numpy as np
import pandas as pd
import tqdm
## read pkl
# videoIDs, videoSpeakers, videoLabels, videoText, videoAudio, videoVisual1, videoSentence, trainVid, \
# testVid = pickle.load(open(pkl_path, "rb"), encoding='latin1')
## write pkl
# pickle.dump([videoIDs, videoSpeakers, videoLabelsNew, videoTextNew, videoAudioNew, videoVisualNew, videoSentence, trainVid, \
# testVid], open(save_path, 'wb'))
## read txt
# with open(output_path, encoding='utf8') as f: lines = [line.strip() for line in f]
# lines = [line for line in lines if len(line)!=0]
## write txt
# file_object = open('thefile.txt', 'w')
# file_object.write(all_the_text)
# file_object.close()
## read csv file
# df_label = pd.read_csv(label_file)
# meta_columns = ['timestamp', 'segment_id']
# metas = df_label[meta_columns].values # change to numpy
# label_timestamps = metas[:,0]
# df = pd.concat(segment_dfs) ## concat different csv files
# for _, row in df.iterrows(): ## read for each row
# word = row['word']
## write csv file
# meta_columns = ['timestamp', 'segment_id']
# columns = meta_columns + [str(i) for i in range(embedding_dim)] # x,x,0,1,2,3,4,5,...
# data = np.column_stack([metas, aligned_embeddings])
# df = pd.DataFrame(data=data, columns=columns)
# df[meta_columns] = df[meta_columns].astype(np.int64)
# df.to_csv(csv_file, index=False)
## read json
# with open("../config/record.json",'r') as load_f:
# load_dict = json.load(load_f)
## write json
# with open("../config/record.json","w") as f:
# json.dump(new_dict,f)
# 功能1:只支持一个keyname
def func_labelstudio_init_key(keyname, names, values, save_path=""):
whole_json = []
for ii, name in enumerate(names):
# s3_path = f's3://zeroqiaoba-first/video3/{name}.webm' # case1 [ok]
# s3_path = f's3://zeroqiaoba/video5/{name}.webm'
# s3_path = f's3://zeroqiaoba-first\\video3\\{name}.webm' # case2 [unwork]
s3_path = f'/data/local-files/?d=video_webm/{name}.webm' # local storage
onefile_json = {}
onefile_json['id'] = ii
onefile_json['data'] = {}
onefile_json['data']['video'] = s3_path
onefile_json['data'][keyname] = values[ii]
onefile_json['annotations'] = []
onefile_json['predictions'] = []
whole_json.append(onefile_json)
## save whole_json
with open(save_path, "w") as f:
json.dump(whole_json, f)
return whole_json
# 功能1:给一个json文件增加一个key
def func_labelstudio_update_key(json_path, val_name, name2val):
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
for item in data:
video = item['data']['video']
videoname = os.path.basename(video).rsplit('.', 1)[0] # 对于 case1 [ok]
# videoname = video.split('\\')[-1].rsplit('.', 1)[0] # case2 [unwork]
item['data'][val_name] = name2val[videoname]
with open(json_path, "w") as f:
json.dump(data, f)
# 功能:将一个json分割到多个json,并存储在store_root中
def func_labelstudio_split_json(json_path, store_root, split_num=8, shuffle=True):
if not os.path.exists(store_root):
os.makedirs(store_root)
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
if shuffle:
data = func_shuffle_list_data(data)
subset_number = math.ceil(len(data)/split_num)
for ii in range(split_num):
sub_data = data[ii*subset_number:(ii+1)*subset_number]
save_path = os.path.join(store_root, f'split-{ii}.json')
with open(save_path, "w") as f:
json.dump(sub_data, f)
# 功能:将一个list文件分成多份,存储在store_root中
def func_split_list_data(data, store_root, split_num=8, shuffle=True):
if not os.path.exists(store_root):
os.makedirs(store_root)
if shuffle:
data = func_shuffle_list_data(data)
subset_number = math.ceil(len(data)/split_num)
for ii in range(split_num):
sub_data = data[ii*subset_number:(ii+1)*subset_number]
save_path = os.path.join(store_root, f'split-{ii}.npy')
np.save(save_path, sub_data)
# 功能2:读取key值对应的 name2key [因为可能存在多个values,所以返回的values都变成list格式了]
def func_labelstudio_read_key(json_path):
with open(json_path,'r',encoding='utf-8') as f:
data = json.load(f)
name2val = {}
for item in data:
values = []
## analyze videoname
videopath = item['data']['video']
videoname = os.path.basename(videopath).rsplit('.', 1)[0]
# case1: sample_00001189.webm
# case2: def5d5b7-sample_00001189.webm
videoname_split = videoname.split('-', 1)
if len(videoname_split) == 2:
videoname = videoname_split[1]
elif len(videoname_split) == 1:
videoname = videoname_split[0]
else:
print (videoname)
raise ValueError('videoname has some errors!!')
## analyze annotations
keys, values = [], []
annotations = item['annotations']
assert len(annotations) == 1
result = annotations[0]['result']
for ii in range(len(result)): # result 可能有多个 value
# 分析 choices 内容
if 'choices' in result[ii]['value']:
item = result[ii]['value']['choices']
keyname = result[ii]['from_name']
values.append(item)
keys.append(keyname)
# 分析 text 内容
if 'text' in result[ii]['value']:
item = result[ii]['value']['text']
keyname = result[ii]['from_name']
values.append(item)
keys.append(keyname)
name2val[videoname] = (keys, values)
return name2val
def func_shuffle_list_data(whole_json):
indices = np.arange(len(whole_json))
random.shuffle(indices)
new_json = []
for index in indices:
new_json.append(whole_json[index])
return new_json
# 功能3:从csv中读取特定的key对应的值
def func_read_key_from_csv(csv_path, key):
values = []
df = pd.read_csv(csv_path)
# for _, row in df.iterrows():
for _, row in df.iterrows():
if key not in row:
values.append("")
else:
value = row[key]
if pd.isna(value): value=""
values.append(value)
return values
# names[ii] -> keys=name2key[names[ii]], containing keynames
def func_write_key_to_csv(csv_path, names, name2key, keynames):
## specific case: only save names
if len(name2key) == 0 or len(keynames) == 0:
df = pd.DataFrame(data=names, columns=['name'])
df.to_csv(csv_path, index=False)
return
## other cases:
if isinstance(keynames, str):
keynames = [keynames]
assert isinstance(keynames, list)
columns = ['name'] + keynames
values = []
for name in names:
value = name2key[name]
values.append(value)
values = np.array(values)
# ensure keynames is mapped
if len(values.shape) == 1:
assert len(keynames) == 1
else:
assert values.shape[-1] == len(keynames)
data = np.column_stack([names, values])
df = pd.DataFrame(data=data, columns=columns)
df.to_csv(csv_path, index=False)
# 仅限于utf-8
def func_read_text_file(file_path):
try:
with open(file_path, encoding='utf8') as f: lines = [line.strip() for line in f]
lines = [line for line in lines if len(line)!=0]
return lines
except:
with open(file_path, encoding='ansi') as f: lines = [line.strip() for line in f]
lines = [line for line in lines if len(line)!=0]
return lines
##############################################################################################
## names[ii] -> values[ii], 可能存在多个values,写到keyname+{jj} 中,返回json内容,存储是后面存储的
# whole_json = func_labelstudio_init_key(keyname, names, values)
## 给一个json_path增加一个key,并按照原始路径保存到json_path
# func_labelstudio_update_key(json_path, val_name, name2val)
## 功能:将一个json分割到多个json,并存储在store_root中
# func_labelstudio_split_json(json_path, store_root, split_num=8, shuffle=True)
## 功能:将一个list数据分割成split_num
# func_split_list_data(data, store_root, split_num=8, shuffle=True)
## 功能:读取key值对应的 name2key,可能有多个values值
# name2val = func_labelstudio_read_key(json_path)
## 将json信息打乱
## new_json = func_shuffle_list_data(whole_json)
## 功能:从csv中读取特定的key对应的值
# func_read_key_from_csv(csv_path, key)
## names[ii] -> keys=name2key[names[ii]], containing keynames -> csv_path
## func_write_key_to_csv(csv_path, names, name2key, keynames)
##############################################################################################