object-assembler / code /cube3d /training /process_single_ldr.py
0xZohar's picture
Add diagnostic logging for label mapping file loading
9c92c05 verified
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)