object-assembler / code /cube3d /training /process_single_ldr.py
0xZohar's picture
Add diagnostic logging for label mapping file loading
9c92c05 verified
Raw
History Blame Contribute Delete
52.4 kB
import numpy as np
import os
import json
from scipy.spatial.transform import Rotation as R
import numpy as np
from scipy.spatial.transform import Rotation as R
# Import centralized configuration for path management
try:
from cube3d.config import get_mapping_paths
print("Successfully imported config from cube3d.config")
except ImportError as e:
print(f"Import from cube3d.config failed: {e}")
try:
from config import get_mapping_paths
print("Successfully imported config from config")
except ImportError as e:
print(f"Failed to import config: {e}")
raise ImportError("Failed to import get_mapping_paths from cube3d.config or config")
# from cube3d.training.check_rotation_onehot import rot_to_onehot24, onehot24_to_rot
# #from check_rotation_onehot import rot_to_onehot24, onehot24_to_rot
try:
from cube3d.training.check_rotation_onehot import (
rot_to_onehot24,
onehot24_to_rot,
signed_perm_mats_det_plus_1
)
print("Successfully imported from cube3d.training.check_rotation_onehot")
except ImportError as e:
print(f"Import from cube3d.training.check_rotation_onehot failed: {e}")
try:
from check_rotation_onehot import (
rot_to_onehot24,
onehot24_to_rot,
signed_perm_mats_det_plus_1
)
print("Successfully imported from check_rotation_onehot")
except ImportError as e:
print(f"Import from check_rotation_onehot failed: {e}")
raise ImportError(
"Failed to import rot_to_onehot24, onehot24_to_rot, "
"and signed_perm_mats_det_plus_1 from both "
"cube3d.training.check_rotation_onehot and check_rotation_onehot"
)
def rotation_to_onehot(rotation_matrix):
possible_angles = [0, 90, 180, 270]
# 初始化一个64维的one-hot编码
one_hot = np.zeros(64)
#import ipdb; ipdb.set_trace()
try:
#import ipdb; ipdb.set_trace()
x_angle = possible_angles.index(round(np.arctan2(np.round(rotation_matrix[2, 1], 1), np.round(rotation_matrix[2, 2],1)) * 180 / np.pi) % 360)
y_angle = possible_angles.index(round(np.arctan2(np.round(rotation_matrix[2, 0], 1), np.round(rotation_matrix[2, 2],1)) * 180 / np.pi) % 360)
z_angle = possible_angles.index(round(np.arctan2(np.round(rotation_matrix[1, 0], 1), np.round(rotation_matrix[0, 0],1)) * 180 / np.pi) % 360)
# 根据x, y, z的旋转角度组合确定one-hot的索引
index = x_angle * 16 + y_angle * 4 + z_angle
except Exception as e:
modified_matrix = rotation_matrix.copy()
max_vals = np.max(np.abs(modified_matrix), axis=1) # 每行最大绝对值
sign_matrix = np.sign(modified_matrix)
modified_matrix = sign_matrix * (np.abs(modified_matrix) == max_vals[:, None])
x_angle = possible_angles.index(round(np.arctan2(np.round(modified_matrix[2, 1], 1), np.round(modified_matrix[2, 2],1)) * 180 / np.pi) % 360)
y_angle = possible_angles.index(round(np.arctan2(np.round(modified_matrix[2, 0], 1), np.round(modified_matrix[2, 2],1)) * 180 / np.pi) % 360)
z_angle = possible_angles.index(round(np.arctan2(np.round(modified_matrix[1, 0], 1), np.round(modified_matrix[0, 0],1)) * 180 / np.pi) % 360)
index = x_angle * 16 + y_angle * 4 + z_angle
if index >= 64:
print(f"Error occurred: {e}")
with open("rotation_matrix_300_afterroundafter1_error_log.txt", "a") as file: # 使用 "a" 模式追加内容
file.write(f"Error with rotation matrix:\n{np.round(modified_matrix, 1)}\n")
file.write("-" * 50 + "\n") # 可选:添加分隔符,帮助区分不同错误
one_hot[index] = 1
return one_hot
import numpy as np
def onehot_to_rotation(one_hot):
# 定义可能的角度
possible_angles = [0, 90, 180, 270]
# 获取one-hot编码中的索引位置
index = one_hot.argmax() # 找到值为1的那个位置,即索引
# 根据索引推导出x、y、z的角度
x_angle = possible_angles[(index // 16) % 4] # x轴旋转角度
y_angle = possible_angles[(index // 4) % 4] # y轴旋转角度
z_angle = possible_angles[index % 4] # z轴旋转角度
# 根据这些角度构建旋转矩阵
# 构建绕X轴旋转矩阵
Rx = np.array([[1, 0, 0],
[0, np.cos(np.radians(x_angle)), -np.sin(np.radians(x_angle))],
[0, np.sin(np.radians(x_angle)), np.cos(np.radians(x_angle))]])
# 构建绕Y轴旋转矩阵
Ry = np.array([[np.cos(np.radians(y_angle)), 0, np.sin(np.radians(y_angle))],
[0, 1, 0],
[-np.sin(np.radians(y_angle)), 0, np.cos(np.radians(y_angle))]])
# 构建绕Z轴旋转矩阵
Rz = np.array([[np.cos(np.radians(z_angle)), -np.sin(np.radians(z_angle)), 0],
[np.sin(np.radians(z_angle)), np.cos(np.radians(z_angle)), 0],
[0, 0, 1]])
# 将这三个矩阵相乘得到总的旋转矩阵
rotation_matrix = np.dot(Rz, np.dot(Ry, Rx))
return rotation_matrix
def load_mappings(label_mapping_file, label_inverse_mapping_file):
print(f"🔍 [DEBUG] load_mappings() called")
print(f" Forward file: {label_mapping_file}")
print(f" Inverse file: {label_inverse_mapping_file}")
try:
with open(label_mapping_file, 'r') as f:
label_mapping = json.load(f)
print(f" ✅ Forward mapping loaded: {len(label_mapping)} entries")
except Exception as e:
print(f" ❌ Failed to load forward mapping: {e}")
raise
try:
with open(label_inverse_mapping_file, 'r') as f:
label_inverse_mapping = json.load(f)
print(f" ✅ Inverse mapping loaded: {len(label_inverse_mapping)} entries")
except Exception as e:
print(f" ❌ Failed to load inverse mapping: {e}")
raise
return label_mapping, label_inverse_mapping
# 读取LDR文件,逐行读取
def read_ldr_file(file_path):
with open(file_path, 'r') as f:
return f.readlines()
# 处理LDR文件并提取数据
def process_ldr_data(lines):
data = []
filenames = []
all_coords = []
all_colors = []
all_labels = []
label_mapping = {}
label_inverse_mapping = {}
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
label_counter = 0
max_x = 212
max_y = 216
max_z = 528
for line in lines:
if line.startswith('1'): # 只处理零件数据行
parts = line.split() # 按空格分割每一列数据
# if len(parts) != 15: # 检查是否每行都有15个部分 #这里也有问题
# print(f"Skipping line due to unexpected length: {line.strip()}")
# continue # 如果数据不完整,则跳过该行
color = int(parts[1]) # 颜色
x, y, z = round(float(parts[2])), round(float(parts[3])), round(float(parts[4]))
rx = list(map(float, parts[5:8])) # 旋转矩阵第一行
ry = list(map(float, parts[8:11])) # 旋转矩阵第二行
rz = list(map(float, parts[11:14])) # 旋转矩阵第三行
filename = parts[14] # 文件名
all_coords.append([x, y, z])
all_colors.append(color)
if ".DAT" in filename:
filename = filename.replace(".DAT", ".dat")
if filename not in label_mapping:
# import ipdb; ipdb.set_trace()
label_mapping[filename] = label_counter
label_inverse_mapping[label_counter] = filename
label_counter += 1
all_labels.append(label_mapping[filename])
rotation_matrix = np.array([rx + ry + rz]).reshape(3, 3)
# r = R.from_matrix(rotation_matrix)
# quaternion = r.as_quat()
rotation_onehot, _ = rot_to_onehot24(rotation_matrix)
#data.append([color, x, y, z] + rotation_onehot.tolist())
#data.append([x, y, z] + rotation_onehot.tolist())
data.append(rotation_onehot.tolist())
#data.append([x, y, z] + quaternion.tolist())
filenames.append(filename)
all_coords = np.array(all_coords)
# min_vals = np.min(all_coords, axis=0) # 每个坐标轴的最小值
# max_vals = np.max(all_coords, axis=0) # 每个坐标轴的最大值
# print(max_vals, min_vals)
# normalized_coords = (all_coords - min_vals) / (max_vals - min_vals)
# normalized_coords = 2 * normalized_coords - 1
# for i, entry in enumerate(data):
# entry[0:3] = normalized_coords[i] # 更新 x, y, z 坐标
one_hot_x = np.eye(max_x+1)[all_coords[:, 0].astype(int)]
one_hot_y = np.eye(max_y+1)[all_coords[:, 1].astype(int)]
one_hot_z = np.eye(max_z+1)[all_coords[:, 2].astype(int)]
for i, entry in enumerate(data):
#entry.append(normalized_labels[i]) # 添加标准化标签到数据中
entry.extend(np.concatenate([one_hot_x[i], one_hot_y[i], one_hot_z[i]])) # Using numpy to concatenate
# color_min = np.min(all_colors)
# color_max = np.max(all_colors)
# normalized_colors = (np.array(all_colors) - color_min) / (color_max - color_min)
# 更新数据:将每个零件的颜色替换为标准化后的颜色
# for i, entry in enumerate(data):
# entry[0] = normalized_colors[i] # 更新颜色
if label_mapping is None:
label_mapping = {filename: idx for idx, filename in enumerate(sorted(set(all_labels)))}
else:
label_mapping = label_mapping
#all_labels = [label_mapping[label] for label in all_labels]
#label_min = np.min(all_labels) # 获取标签的最小值
#label_max = np.max(all_labels) # 获取标签的最大值
label_max = len(label_mapping) # 获取标签的最大值
# 将标签标准化到 [0, 1] 范围
#normalized_labels = (all_labels - label_min) / (label_max - label_min)
one_hot_labels = np.eye(label_max)[all_labels]
# 更新数据:将每个零件的标签替换为标准化后的标签
for i, entry in enumerate(data):
#entry.append(normalized_labels[i]) # 添加标准化标签到数据中
entry.extend(one_hot_labels[i]) # 添加one-hot编码标签到数据中
for i, entry in enumerate(data):
#entry.append(normalized_labels[i]) # 添加标准化标签到数据中
entry.extend([1,0]) #
#import ipdb; ipdb.set_trace()
return np.array(data), label_inverse_mapping # 将数据转换为NumPy数组
def process_ldr_flatten(lines):
data = []
filenames = []
all_coords = []
all_colors = []
all_labels = []
label_mapping = {}
label_inverse_mapping = {}
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_1k")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
label_counter = 0
max_x = 250
max_y = 214
max_z = 524
#print(lines)
for line in lines:
if line.startswith('1'):
parts = line.split()
#if len(parts) != 15:
# if len(parts) < 15:
# print(f"Skipping line due to unexpected length: {line.strip()}")
# continue
#print(parts)
color = int(parts[1])
x, y, z = round(float(parts[2])), round(float(parts[3])), round(float(parts[4]))
rx = list(map(float, parts[5:8]))
ry = list(map(float, parts[8:11]))
rz = list(map(float, parts[11:14]))
filename = parts[14].lower()
all_coords.append([x, y, z])
all_colors.append(color)
if ".DAT" in filename:
filename = filename.replace(".DAT", ".dat")
if filename not in label_mapping:
# import ipdb; ipdb.set_trace()
label_mapping[filename] = label_counter
label_inverse_mapping[label_counter] = filename
label_counter += 1
all_labels.append(label_mapping[filename])
rotation_matrix = np.array([rx + ry + rz]).reshape(3, 3)
# r = R.from_matrix(rotation_matrix)
# quaternion = r.as_quat()
rotation_onehot, _ = rot_to_onehot24(rotation_matrix)
rotation_id = rotation_onehot.argmax()
#data.append([color, x, y, z] + rotation_onehot.tolist())
#data.append([x, y, z] + rotation_onehot.tolist())
#data.append(rotation_onehot.tolist())
data.append([rotation_id])
#data.append([x, y, z] + quaternion.tolist())
filenames.append(filename)
all_coords = np.array(all_coords)
# min_vals = np.min(all_coords, axis=0)
# max_vals = np.max(all_coords, axis=0)
# print(max_vals, min_vals)
# normalized_coords = (all_coords - min_vals) / (max_vals - min_vals)
# normalized_coords = 2 * normalized_coords - 1
# for i, entry in enumerate(data):
# entry[0:3] = normalized_coords[i]
#print(all_coords)
one_hot_x = np.eye(max_x+1)[all_coords[:, 0].astype(int)]
one_hot_y = np.eye(max_y+1)[all_coords[:, 1].astype(int)]
one_hot_z = np.eye(max_z+1)[all_coords[:, 2].astype(int)]
# for i, entry in enumerate(data):
# #entry.append(normalized_labels[i])
# entry.extend(np.concatenate([one_hot_x[i], one_hot_y[i], one_hot_z[i]])) # Using numpy to concatenate
# color_min = np.min(all_colors)
# color_max = np.max(all_colors)
# normalized_colors = (np.array(all_colors) - color_min) / (color_max - color_min)
# for i, entry in enumerate(data):
# entry[0] = normalized_colors[i]
if label_mapping is None:
label_mapping = {filename: idx for idx, filename in enumerate(sorted(set(all_labels)))}
else:
label_mapping = label_mapping
#all_labels = [label_mapping[label] for label in all_labels]
#label_min = np.min(all_labels)
#label_max = np.max(all_labels)
label_max = len(label_mapping)
# 将标签标准化到 [0, 1] 范围
#normalized_labels = (all_labels - label_min) / (label_max - label_min)
one_hot_labels = np.eye(label_max)[all_labels]
for i, entry in enumerate(data):
#entry.append(normalized_labels[i]) #
#entry.extend(one_hot_labels[i]) #
entry.extend([all_labels[i]]) #
entry.extend(np.concatenate([
np.array([all_coords[i, 0].astype(int)]),
np.array([all_coords[i, 1].astype(int)]),
np.array([all_coords[i, 2].astype(int)])
]))
for i, entry in enumerate(data):
#entry.append(normalized_labels[i])
entry.extend([1,0]) #
#import ipdb; ipdb.set_trace()
return np.array(data), label_inverse_mapping
def process_ldr_flatten_bottom(lines):
data = []
filenames = []
all_coords = []
all_colors = []
all_labels = []
label_mapping = {}
label_inverse_mapping = {}
label_mapping, label_inverse_mapping = load_mappings('/public/home/wangshuo/gap/assembly/data/car_1k/subset_bottom_300/label_mapping.json', '/public/home/wangshuo/gap/assembly/data/car_1k/subset_bottom_300/label_inverse_mapping.json')
label_counter = 0
max_x = 212
max_y = 72
max_z = 410
for line in lines:
if line.startswith('1'):
parts = line.split()
# if len(parts) != 15:
# print(f"Skipping line due to unexpected length: {line.strip()}")
# continue
color = int(parts[1])
x, y, z = round(float(parts[2])), round(float(parts[3])), round(float(parts[4]))
rx = list(map(float, parts[5:8]))
ry = list(map(float, parts[8:11]))
rz = list(map(float, parts[11:14]))
filename = parts[14].lower()
all_coords.append([x, y, z])
all_colors.append(color)
if ".DAT" in filename:
filename = filename.replace(".DAT", ".dat")
if filename not in label_mapping:
# import ipdb; ipdb.set_trace()
label_mapping[filename] = label_counter
label_inverse_mapping[label_counter] = filename
label_counter += 1
all_labels.append(label_mapping[filename])
rotation_matrix = np.array([rx + ry + rz]).reshape(3, 3)
# r = R.from_matrix(rotation_matrix)
# quaternion = r.as_quat()
rotation_onehot, _ = rot_to_onehot24(rotation_matrix)
rotation_id = rotation_onehot.argmax()
#data.append([color, x, y, z] + rotation_onehot.tolist())
#data.append([x, y, z] + rotation_onehot.tolist())
#data.append(rotation_onehot.tolist())
data.append([rotation_id])
#data.append([x, y, z] + quaternion.tolist())
filenames.append(filename)
all_coords = np.array(all_coords)
# min_vals = np.min(all_coords, axis=0)
# max_vals = np.max(all_coords, axis=0)
# print(max_vals, min_vals)
# normalized_coords = (all_coords - min_vals) / (max_vals - min_vals)
# normalized_coords = 2 * normalized_coords - 1
# for i, entry in enumerate(data):
# entry[0:3] = normalized_coords[i]
one_hot_x = np.eye(max_x+1)[all_coords[:, 0].astype(int)]
one_hot_y = np.eye(max_y+1)[all_coords[:, 1].astype(int)]
one_hot_z = np.eye(max_z+1)[all_coords[:, 2].astype(int)]
# for i, entry in enumerate(data):
# #entry.append(normalized_labels[i])
# entry.extend(np.concatenate([one_hot_x[i], one_hot_y[i], one_hot_z[i]])) # Using numpy to concatenate
# color_min = np.min(all_colors)
# color_max = np.max(all_colors)
# normalized_colors = (np.array(all_colors) - color_min) / (color_max - color_min)
# for i, entry in enumerate(data):
# entry[0] = normalized_colors[i]
if label_mapping is None:
label_mapping = {filename: idx for idx, filename in enumerate(sorted(set(all_labels)))}
else:
label_mapping = label_mapping
#all_labels = [label_mapping[label] for label in all_labels]
#label_min = np.min(all_labels)
#label_max = np.max(all_labels)
label_max = len(label_mapping)
# 将标签标准化到 [0, 1] 范围
#normalized_labels = (all_labels - label_min) / (label_max - label_min)
one_hot_labels = np.eye(label_max)[all_labels]
for i, entry in enumerate(data):
#entry.append(normalized_labels[i]) #
#entry.extend(one_hot_labels[i]) #
entry.extend([all_labels[i]]) #
entry.extend(np.concatenate([
np.array([all_coords[i, 0].astype(int)]),
np.array([all_coords[i, 1].astype(int)]),
np.array([all_coords[i, 2].astype(int)])
]))
for i, entry in enumerate(data):
#entry.append(normalized_labels[i])
entry.extend([1,0]) #
#import ipdb; ipdb.set_trace()
return np.array(data), label_inverse_mapping
def save_data_as_npy(data, output_file):
np.save(output_file, data)
def logits2ldr(normalized_data, label_inverse_mapping=None, max_vals=None, min_vals=None, label_max=None, label_min=None, max_color=None, min_color=None, output_file='restored_data.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
normalized_labels = normalized_data[:, xyz:xyz+dat_num].argmax(1)
#normalized_colors = normalized_data[:, 0] # 颜色列
normalized_coords_x = normalized_data[:, rot_num:rot_num+x].argmax(1)
normalized_coords_y = normalized_data[:, rot_num+x:xy].argmax(1)
normalized_coords_z = normalized_data[:, xy:xyz].argmax(1)
restored_coords = np.stack((normalized_coords_x, normalized_coords_y, normalized_coords_z), axis=-1)
#import ipdb; ipdb.set_trace()
#restored_coords = ((normalized_coords + 1) / 2) * (max_vals - min_vals) + min_vals
#restored_labels = (normalized_labels * (label_max - label_min)) + label_min
#restored_colors = normalized_colors * (max_color - min_color) + min_color
flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
ldr_lines = []
for i, entry in enumerate(normalized_data):
color = 0 #int(restored_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(normalized_labels[i]), 0, dat_num).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = onehot24_to_rot(entry[:rot_num])#r.as_matrix()
f = 1 - flag[i]
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def logits2ldrot(normalized_data, input_data, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
input_labels = input_data[:, xyz:xyz+dat_num].argmax(1)
input_coords_x = input_data[:, rot_num:rot_num+x].argmax(1)
input_coords_y = input_data[:, rot_num+x:xy].argmax(1)
input_coords_z = input_data[:, xy:xyz].argmax(1)
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
flag = normalized_data[:, -2:].argmax(1)
ldr_lines = []
for i, entry in enumerate(normalized_data[:-1]):
color = 0 #int(restored_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = onehot24_to_rot(entry[:rot_num])#r.as_matrix()
f = 1 - flag[i]
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def logits2ldrp(normalized_data, input_data, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
input_labels = input_data[:, xyz:xyz+dat_num].argmax(1)
# input_coords_x = input_data[:, rot_num:rot_num+x].argmax(1)
# input_coords_y = input_data[:, rot_num+x:xy].argmax(1)
# input_coords_z = input_data[:, xy:xyz].argmax(1)
input_coords_x = normalized_data[:, rot_num:rot_num+x].argmax(1)
input_coords_y = normalized_data[:, rot_num+x:xy].argmax(1)
input_coords_z = normalized_data[:, xy:xyz].argmax(1)
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
flag = normalized_data[:, -2:].argmax(1)
ldr_lines = []
#for i, entry in enumerate(normalized_data[:-1]):
for i, entry in enumerate(input_data[:-1]):
color = 0 #int(restored_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = onehot24_to_rot(entry[:rot_num])#r.as_matrix()
f = 1# - flag[i]
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def logits2flatldrp(normalized_data, input_data, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
R24 = signed_perm_mats_det_plus_1()
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
stride = 3
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
input_labels = input_data[:, -6]
input_coords_x = input_data[:, -5] #normalized_data[1:-2:stride, :x_num+1].argmax(1)
input_coords_y = input_data[:, -4] #normalized_data[0:-3:stride, :y_num+1].argmax(1)
input_coords_z = input_data[:, -3] #normalized_data[2:-1:stride, :z_num+1].argmax(1)
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
#flag = normalized_data[:, -2:].argmax(1)
ldr_lines = []
#for i, entry in enumerate(normalized_data[:-1]):
for i, entry in enumerate(input_data[:-1]):
color = 0 #int(restored_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
#import ipdb; ipdb.set_trace()
rotation_matrix = R24[entry[-7]]#r.as_matrix()
f = 1# - flag[i]
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def logits2flatldrpr(normalized_data, input_data, stride, given, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
R24 = signed_perm_mats_det_plus_1()
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
stride = stride
attr_shift = stride-3 #+1 for bert
bert_shift = 1
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
#input_labels = normalized_data[0:-4:stride, :dat_num+1].argmax(1) #
input_labels = input_data[:, -6]
#input_labels[:given] = input_data[:given, -6] #normalized_data[0:-4:stride, :dat_num+1].argmax(1)
input_rot = normalized_data[1+bert_shift:-3:stride, :rot_num+1].argmax(1) # #normalized_data[1:-3:stride, :rot_num+1].argmax(1)
#input_rot = input_data[:, 0]
input_coords_x = normalized_data[1+attr_shift+bert_shift:-1:stride, rot_num+1:x+rot_num+1+1].argmax(1)
input_coords_y = normalized_data[0+attr_shift+bert_shift:-2:stride, x+rot_num+2:xy+3].argmax(1)
input_coords_z = normalized_data[2+attr_shift+bert_shift::stride, xy+3:xyz+4].argmax(1)
# input_coords_x[:given] = input_data[:given, -5]
# input_coords_y[:given] = input_data[:given, -4]
# input_coords_z[:given] = input_data[:given, -3]
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
#flag = normalized_data[:, -2:].argmax(1)
input_colors = np.zeros_like(input_data[:, 0])
#input_colors[:given] = (input_colors[:given] + 4)
ldr_lines = []
#for i, entry in enumerate(normalized_data[:-1]):
for i, entry in enumerate(input_data[:-1]):
color = int(input_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num-1).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = R24[np.clip(input_rot[i], 0, rot_num-1)] #R24[entry[-7]]#r.as_matrix()
if x>212:
f = 0# - flag[i]
else:
f = 1
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
# def logits2botldrpr(normalized_data, input_data, stride, given, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
# dat_num = 286
# x_num = 213
# y_num = 73
# z_num = 411
# rot_num = 24
# R24 = signed_perm_mats_det_plus_1()
# x = x_num
# xy = x_num + y_num + rot_num
# xyz = x_num + y_num + z_num + rot_num
# stride = stride
# attr_shift = stride-3 #+1 for bert
# bert_shift = 1
# label_mapping, label_inverse_mapping = load_mappings('../data/car_1k/subset_bottom_300/label_mapping.json', '../data/car_1k/subset_bottom_300/label_inverse_mapping.json')
# if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# # #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
# label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
# #input_labels = normalized_data[0:-4:stride, :dat_num+1].argmax(1) #
# input_labels = input_data[:, -6]
# #input_labels[:given] = input_data[:given, -6] #normalized_data[0:-4:stride, :dat_num+1].argmax(1)
# input_rot = normalized_data[1+bert_shift:-3:stride, :rot_num+1].argmax(1) # #normalized_data[1:-3:stride, :rot_num+1].argmax(1)
# #input_rot = input_data[:, 0]
# input_coords_x = normalized_data[1+attr_shift+bert_shift:-1:stride, rot_num+1:x+rot_num+1+1].argmax(1)
# input_coords_y = normalized_data[0+attr_shift+bert_shift:-2:stride, x+rot_num+2:xy+3].argmax(1)
# input_coords_z = normalized_data[2+attr_shift+bert_shift::stride, xy+3:xyz+4].argmax(1)
# # input_coords_x[:given] = input_data[:given, -5]
# # input_coords_y[:given] = input_data[:given, -4]
# # input_coords_z[:given] = input_data[:given, -3]
# restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
# #flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
# #flag = normalized_data[:, -2:].argmax(1)
# input_colors = np.zeros_like(input_data[:, 0])
# #input_colors[:given] = (input_colors[:given] + 4)
# ldr_lines = []
# #for i, entry in enumerate(normalized_data[:-1]):
# for i, entry in enumerate(input_data[:-1]):
# color = int(input_colors[i])
# x, y, z = restored_coords[i]
# label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num-1).astype(int))]
# # quaternion = entry[4:8] #
# # quaternion = quaternion / np.linalg.norm(quaternion) #
# # r = R.from_quat(quaternion)
# rotation_matrix = R24[np.clip(input_rot[i], 0, rot_num-1)] #R24[entry[-7]]#r.as_matrix()
# if x>212:
# f = 0# - flag[i]
# else:
# f = 1
# ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
# f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
# f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
# f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
# f"{label}\n"
# ldr_lines.append(ldr_line)
# with open(output_file, 'w') as f:
# f.writelines(ldr_lines)
# print(f"Restored LDR data saved to {output_file}")
# return ldr_lines
def logits2botldrpr(normalized_data, input_data, stride, given, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 1217 #286
x_num = 251 #213
y_num = 215 #73
z_num = 525 #411
rot_num = 24
R24 = signed_perm_mats_det_plus_1()
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
stride = stride
attr_shift = stride-3 #+1 for bert
bert_shift = 1
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_1k")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
#input_labels = normalized_data[0:-4:stride, :dat_num+1].argmax(1) #
input_labels = input_data[:, -6]
#input_labels[:given] = input_data[:given, -6] #normalized_data[0:-4:stride, :dat_num+1].argmax(1)
input_rot = normalized_data[1+bert_shift:-3:stride, :rot_num+1].argmax(1) # #normalized_data[1:-3:stride, :rot_num+1].argmax(1)
#input_rot = input_data[:, 0]
input_coords_x = normalized_data[1+attr_shift+bert_shift:-1:stride, rot_num+1:x+rot_num+1+1].argmax(1)
input_coords_y = normalized_data[0+attr_shift+bert_shift:-2:stride, x+rot_num+2:xy+3].argmax(1)
input_coords_z = normalized_data[2+attr_shift+bert_shift::stride, xy+3:xyz+4].argmax(1)
# input_coords_x[:given] = input_data[:given, -5]
# input_coords_y[:given] = input_data[:given, -4]
# input_coords_z[:given] = input_data[:given, -3]
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
#flag = normalized_data[:, -2:].argmax(1)
input_colors = np.zeros_like(input_data[:, 0])
#input_colors[:given] = (input_colors[:given] + 4)
ldr_lines = []
#for i, entry in enumerate(normalized_data[:-1]):
for i, entry in enumerate(input_data[:-1]):
color = int(input_colors[i])
x, y, z = restored_coords[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i]), 0, dat_num-1).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = R24[np.clip(input_rot[i], 0, rot_num-1)] #R24[entry[-7]]#r.as_matrix()
if x>(x_num-1):
f = 0# - flag[i]
else:
f = 1
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def ids2flatldrpr(normalized_data, input_data, stride, given, label_inverse_mapping='', max_vals='', min_vals='', label_max='', label_min='', max_color='', min_color='', output_file='restored_data_rot_wop.ldr'):
dat_num = 604
x_num = 213
y_num = 217
z_num = 529
rot_num = 24
R24 = signed_perm_mats_det_plus_1()
x = x_num
xy = x_num + y_num + rot_num
xyz = x_num + y_num + z_num + rot_num
stride = stride
attr_shift = stride-3
# Use config-based paths (works in both local and HF Space environments)
forward_path, inverse_path = get_mapping_paths("subset_self")
label_mapping, label_inverse_mapping = load_mappings(forward_path, inverse_path)
if label_inverse_mapping is None:
# import ipdb; ipdb.set_trace()
# #label_inverse_mapping = {0: '98281.dat', 1: '3005.dat', 2: '3004.dat', 3: '3795.dat', 4: '3020.dat', 5: '3710.dat', 6: '3666.dat', 7: '3021.dat', 8: '2431.dat', 9: '4488.dat', 10: '3829a.dat', 11: '3829b.dat', 12: '43723.dat', 13: '3068b.dat', 14: '43722.dat', 15: '3832.dat', 16: '2432.dat', 17: '2437.dat', 18: '6231.dat', 19: '3040b.dat', 20: '3024.dat', 21: '11211.dat', 22: '2540.dat', 23: '61678.dat', 24: '3665.dat', 25: '11477.dat', 26: '93594.dat', 27: '50951.dat', 28: '4073.dat', 29: '6019.dat', 30: '6091.dat', 31: '3821.dat', 32: '3822.dat', 33: '98138.dat', 34: '3794a.dat', 35: '4081b.dat', 36: '3022.dat', 37: '30039.dat', 38: '50946.dat', 39: '4095.dat'} #blue_classic_car
label_inverse_mapping = {0: '24308b.dat', 1: '3031.dat', 2: '4079.dat', 3: '3021.dat', 4: '3024.dat', 5: '3020.dat', 6: '29120.dat', 7: '71076a.dat', 8: '3023.dat', 9: '29119.dat', 10: '2412b.dat', 11: '86876.dat', 12: '11211.dat', 13: '87087.dat', 14: '3004.dat', 15: '15068.dat', 16: '3829c01.dat', 17: '11477.dat', 18: '79393.dat', 19: '63864.dat', 20: '3710.dat', 21: 'm17f5892b_2023521_010804.dat', 22: '6141.dat', 23: '85984pc2.dat', 24: '3010.dat', 25: '30414.dat', 26: '2431pt0.dat'}
input_labels = normalized_data[0:-4:stride, :dat_num+1] #
#input_labels[:given] = input_data[:given, -6] #normalized_data[0:-4:stride, :dat_num+1].argmax(1)
input_rot = normalized_data[1:-3:stride, :rot_num+1] #input_data[:, 0] #normalized_data[1:-3:stride, :rot_num+1].argmax(1)
#input_rot[:given] = input_data[:given, 0]
input_coords_x = normalized_data[1+attr_shift:-1:stride, :x_num+1]
input_coords_y = normalized_data[0+attr_shift:-2:stride, :y_num+1]
input_coords_z = normalized_data[2+attr_shift::stride, :z_num+1]
# input_coords_x[:given] = input_data[:given, -5]
# input_coords_y[:given] = input_data[:given, -4]
# input_coords_z[:given] = input_data[:given, -3]
restored_coords = np.stack((input_coords_x, input_coords_y, input_coords_z), axis=-1)
#flag = normalized_data[:, xyz+dat_num:xyz+dat_num+2].argmax(1)
#flag = normalized_data[:, -2:].argmax(1)
input_colors = np.zeros_like(input_data[:, 0])
#input_colors[:given] = (input_colors[:given] + 4)
ldr_lines = []
#for i, entry in enumerate(normalized_data[:-1]):
for i, entry in enumerate(input_data[:-1]):
color = int(input_colors[i])
x, y, z = np.squeeze(restored_coords, axis=1)[i]
label = label_inverse_mapping[str(np.clip(np.round(input_labels[i].item()), 0, dat_num-1).astype(int))]
# quaternion = entry[4:8] #
# quaternion = quaternion / np.linalg.norm(quaternion) #
# r = R.from_quat(quaternion)
rotation_matrix = R24[int(np.clip(input_rot[i].item(), 0, rot_num-1))] #R24[entry[-7]]#r.as_matrix()
if x>212:
f = 0# - flag[i]
else:
f = 1
ldr_line = f"{f} {color} {x:.6f} {y:.6f} {z:.6f} " \
f"{rotation_matrix[0, 0]:.6f} {rotation_matrix[0, 1]:.6f} {rotation_matrix[0, 2]:.6f} " \
f"{rotation_matrix[1, 0]:.6f} {rotation_matrix[1, 1]:.6f} {rotation_matrix[1, 2]:.6f} " \
f"{rotation_matrix[2, 0]:.6f} {rotation_matrix[2, 1]:.6f} {rotation_matrix[2, 2]:.6f} " \
f"{label}\n"
ldr_lines.append(ldr_line)
with open(output_file, 'w') as f:
f.writelines(ldr_lines)
print(f"Restored LDR data saved to {output_file}")
return ldr_lines
def main(input_file):
lines = read_ldr_file(input_file)
processed_data, label_inverse_mapping = process_ldr_data(lines) # 处理LDR数据
inverted_data = logits2ldr(processed_data, label_inverse_mapping) # 将标准化数据转换回原始数据格式
# import ipdb; ipdb.set_trace()
# output_file = os.path.splitext(input_file)[0] + '_wrdhot' + '.npy'
# save_data_as_npy(processed_data, output_file) # 保存为.npy文件
# print(f"Processed data has been saved to {output_file}")
# 示例
input_file = '/public/home/wangshuo/gap/assembly/data/blue classic car/modified_blue classic car.ldr' # 输入LDR文件路径
#main(input_file)