From c93c9b630e70b28460fb6614363c86596bfac1c3 Mon Sep 17 00:00:00 2001 From: hesuicong Date: Fri, 12 Dec 2025 14:36:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compute_print_net.py | 22 + download_print.py | 940 ++---------------------------------------- download_print_out.py | 23 +- general.py | 1 + 4 files changed, 52 insertions(+), 934 deletions(-) diff --git a/compute_print_net.py b/compute_print_net.py index 9f746cc..a52607c 100644 --- a/compute_print_net.py +++ b/compute_print_net.py @@ -347,3 +347,25 @@ class Platform: return self.placed_models, self.unplaced_models # -------------------------- 结束:bbox -------------------------- + + +# -------------------------- 开始:oss -------------------------- + +import yaml +import oss2 +def get_oss_client(cfg_path): + with open(os.path.expanduser(cfg_path), "r") as config: + cfg = yaml.safe_load(config) + + AccessKeyId_down = cfg["run"]["down"]["AccessKeyId"] + AccessKeySecret_down = cfg["run"]["down"]["AccessKeySecret"] + Endpoint_down = cfg["run"]["down"]["Endpoint"] + Bucket_down = cfg["run"]["down"]["Bucket"] + + oss_client = oss2.Bucket( + oss2.Auth(AccessKeyId_down, AccessKeySecret_down), Endpoint_down, Bucket_down + ) + + return oss_client + +# -------------------------- 结束:oss -------------------------- diff --git a/download_print.py b/download_print.py index aa28b94..7812383 100644 --- a/download_print.py +++ b/download_print.py @@ -8,858 +8,17 @@ from pathlib import Path import numpy as np import collections -import struct -import math import os import argparse -from config import print_factory_type_dir from config import oss_config from config import print_data_dir from config import url_get_oss_suffix_by_orderId from general import is_use_debug_oss -from general import transform_save_o3d - -CameraModel = collections.namedtuple( - "CameraModel", ["model_id", "model_name", "num_params"] -) -Camera = collections.namedtuple("Camera", ["id", "model", "width", "height", "params"]) -BaseImage = collections.namedtuple( - "Image", ["id", "qvec", "tvec", "camera_id", "name", "xys", "point3D_ids"] -) -Point3D = collections.namedtuple( - "Point3D", ["id", "xyz", "rgb", "error", "image_ids", "point2D_idxs"] -) -CAMERA_MODELS = { - CameraModel(model_id=0, model_name="SIMPLE_PINHOLE", num_params=3), - CameraModel(model_id=1, model_name="PINHOLE", num_params=4), - CameraModel(model_id=2, model_name="SIMPLE_RADIAL", num_params=4), - CameraModel(model_id=3, model_name="RADIAL", num_params=5), - CameraModel(model_id=4, model_name="OPENCV", num_params=8), - CameraModel(model_id=5, model_name="OPENCV_FISHEYE", num_params=8), - CameraModel(model_id=6, model_name="FULL_OPENCV", num_params=12), - CameraModel(model_id=7, model_name="FOV", num_params=5), - CameraModel(model_id=8, model_name="SIMPLE_RADIAL_FISHEYE", num_params=4), - CameraModel(model_id=9, model_name="RADIAL_FISHEYE", num_params=5), - CameraModel(model_id=10, model_name="THIN_PRISM_FISHEYE", num_params=12), -} -CAMERA_MODEL_IDS = dict( - [(camera_model.model_id, camera_model) for camera_model in CAMERA_MODELS] -) -CAMERA_MODEL_NAMES = dict( - [(camera_model.model_name, camera_model) for camera_model in CAMERA_MODELS] -) - - -def qvec2rotmat(qvec): - return np.array( - [ - [ - 1 - 2 * qvec[2] ** 2 - 2 * qvec[3] ** 2, - 2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3], - 2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2], - ], - [ - 2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3], - 1 - 2 * qvec[1] ** 2 - 2 * qvec[3] ** 2, - 2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1], - ], - [ - 2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2], - 2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1], - 1 - 2 * qvec[1] ** 2 - 2 * qvec[2] ** 2, - ], - ] - ) - - -def rotmat2qvec(R): - Rxx, Ryx, Rzx, Rxy, Ryy, Rzy, Rxz, Ryz, Rzz = R.flat - K = ( - np.array( - [ - [Rxx - Ryy - Rzz, 0, 0, 0], - [Ryx + Rxy, Ryy - Rxx - Rzz, 0, 0], - [Rzx + Rxz, Rzy + Ryz, Rzz - Rxx - Ryy, 0], - [Ryz - Rzy, Rzx - Rxz, Rxy - Ryx, Rxx + Ryy + Rzz], - ] - ) - / 3.0 - ) - eigvals, eigvecs = np.linalg.eigh(K) - qvec = eigvecs[[3, 0, 1, 2], np.argmax(eigvals)] - if qvec[0] < 0: - qvec *= -1 - return qvec - - -class Image(BaseImage): - def qvec2rotmat(self): - return qvec2rotmat(self.qvec) - - -def read_next_bytes(fid, num_bytes, format_char_sequence, endian_character="<"): - """Read and unpack the next bytes from a binary file. - :param fid: - :param num_bytes: Sum of combination of {2, 4, 8}, e.g. 2, 6, 16, 30, etc. - :param format_char_sequence: List of {c, e, f, d, h, H, i, I, l, L, q, Q}. - :param endian_character: Any of {@, =, <, >, !} - :return: Tuple of read and unpacked values. - """ - data = fid.read(num_bytes) - return struct.unpack(endian_character + format_char_sequence, data) - - -def read_points3D_text(path): - """ - see: src/base/reconstruction.cc - void Reconstruction::ReadPoints3DText(const std::string& path) - void Reconstruction::WritePoints3DText(const std::string& path) - """ - xyzs = None - rgbs = None - errors = None - num_points = 0 - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - num_points += 1 - - xyzs = np.empty((num_points, 3)) - rgbs = np.empty((num_points, 3)) - errors = np.empty((num_points, 1)) - count = 0 - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - xyz = np.array(tuple(map(float, elems[1:4]))) - rgb = np.array(tuple(map(int, elems[4:7]))) - error = np.array(float(elems[7])) - xyzs[count] = xyz - rgbs[count] = rgb - errors[count] = error - count += 1 - - return xyzs, rgbs, errors - - -def read_points3D_binary(path_to_model_file): - """ - see: src/base/reconstruction.cc - void Reconstruction::ReadPoints3DBinary(const std::string& path) - void Reconstruction::WritePoints3DBinary(const std::string& path) - """ - - with open(path_to_model_file, "rb") as fid: - num_points = read_next_bytes(fid, 8, "Q")[0] - - xyzs = np.empty((num_points, 3)) - rgbs = np.empty((num_points, 3)) - errors = np.empty((num_points, 1)) - - for p_id in range(num_points): - binary_point_line_properties = read_next_bytes( - fid, num_bytes=43, format_char_sequence="QdddBBBd" - ) - xyz = np.array(binary_point_line_properties[1:4]) - rgb = np.array(binary_point_line_properties[4:7]) - error = np.array(binary_point_line_properties[7]) - track_length = read_next_bytes(fid, num_bytes=8, format_char_sequence="Q")[ - 0 - ] - track_elems = read_next_bytes( - fid, - num_bytes=8 * track_length, - format_char_sequence="ii" * track_length, - ) - xyzs[p_id] = xyz - rgbs[p_id] = rgb - errors[p_id] = error - return xyzs, rgbs, errors - - -def read_intrinsics_text(path): - """ - Taken from https://github.com/colmap/colmap/blob/dev/scripts/python/read_write_model.py - """ - cameras = {} - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - camera_id = int(elems[0]) - model = elems[1] - assert ( - model == "PINHOLE" - ), "While the loader support other types, the rest of the code assumes PINHOLE" - width = int(elems[2]) - height = int(elems[3]) - params = np.array(tuple(map(float, elems[4:]))) - cameras[camera_id] = Camera( - id=camera_id, model=model, width=width, height=height, params=params - ) - return cameras - - -def read_extrinsics_binary(path_to_model_file): - """ - see: src/base/reconstruction.cc - void Reconstruction::ReadImagesBinary(const std::string& path) - void Reconstruction::WriteImagesBinary(const std::string& path) - """ - images = {} - with open(path_to_model_file, "rb") as fid: - num_reg_images = read_next_bytes(fid, 8, "Q")[0] - for _ in range(num_reg_images): - binary_image_properties = read_next_bytes( - fid, num_bytes=64, format_char_sequence="idddddddi" - ) - image_id = binary_image_properties[0] - qvec = np.array(binary_image_properties[1:5]) - tvec = np.array(binary_image_properties[5:8]) - camera_id = binary_image_properties[8] - image_name = "" - current_char = read_next_bytes(fid, 1, "c")[0] - while current_char != b"\x00": # look for the ASCII 0 entry - image_name += current_char.decode("utf-8") - current_char = read_next_bytes(fid, 1, "c")[0] - num_points2D = read_next_bytes(fid, num_bytes=8, format_char_sequence="Q")[ - 0 - ] - x_y_id_s = read_next_bytes( - fid, - num_bytes=24 * num_points2D, - format_char_sequence="ddq" * num_points2D, - ) - xys = np.column_stack( - [tuple(map(float, x_y_id_s[0::3])), tuple(map(float, x_y_id_s[1::3]))] - ) - point3D_ids = np.array(tuple(map(int, x_y_id_s[2::3]))) - images[image_id] = Image( - id=image_id, - qvec=qvec, - tvec=tvec, - camera_id=camera_id, - name=image_name, - xys=xys, - point3D_ids=point3D_ids, - ) - return images - - -def read_intrinsics_binary(path_to_model_file): - """ - see: src/base/reconstruction.cc - void Reconstruction::WriteCamerasBinary(const std::string& path) - void Reconstruction::ReadCamerasBinary(const std::string& path) - """ - cameras = {} - with open(path_to_model_file, "rb") as fid: - num_cameras = read_next_bytes(fid, 8, "Q")[0] - for _ in range(num_cameras): - camera_properties = read_next_bytes( - fid, num_bytes=24, format_char_sequence="iiQQ" - ) - camera_id = camera_properties[0] - model_id = camera_properties[1] - model_name = CAMERA_MODEL_IDS[camera_properties[1]].model_name - width = camera_properties[2] - height = camera_properties[3] - num_params = CAMERA_MODEL_IDS[model_id].num_params - params = read_next_bytes( - fid, num_bytes=8 * num_params, format_char_sequence="d" * num_params - ) - cameras[camera_id] = Camera( - id=camera_id, - model=model_name, - width=width, - height=height, - params=np.array(params), - ) - assert len(cameras) == num_cameras - return cameras - - -def focal2fov(focal, pixels): - return 2 * math.atan(pixels / (2 * focal)) - - -def read_extrinsics_text(path): - """ - Taken from https://github.com/colmap/colmap/blob/dev/scripts/python/read_write_model.py - """ - images = {} - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - image_id = int(elems[0]) - qvec = np.array(tuple(map(float, elems[1:5]))) - tvec = np.array(tuple(map(float, elems[5:8]))) - camera_id = int(elems[8]) - image_name = elems[9] - elems = fid.readline().split() - xys = np.column_stack( - [tuple(map(float, elems[0::3])), tuple(map(float, elems[1::3]))] - ) - point3D_ids = np.array(tuple(map(int, elems[2::3]))) - images[image_id] = Image( - id=image_id, - qvec=qvec, - tvec=tvec, - camera_id=camera_id, - name=image_name, - xys=xys, - point3D_ids=point3D_ids, - ) - return images - - -def read_colmap_bin_array(path): - """ - Taken from https://github.com/colmap/colmap/blob/dev/scripts/python/read_dense.py - - :param path: path to the colmap binary file. - :return: nd array with the floating point values in the value - """ - with open(path, "rb") as fid: - width, height, channels = np.genfromtxt( - fid, delimiter="&", max_rows=1, usecols=(0, 1, 2), dtype=int - ) - fid.seek(0) - num_delimiter = 0 - byte = fid.read(1) - while True: - if byte == b"&": - num_delimiter += 1 - if num_delimiter >= 3: - break - byte = fid.read(1) - array = np.fromfile(fid, np.float32) - array = array.reshape((width, height, channels), order="F") - return np.transpose(array, (1, 0, 2)).squeeze() - - -def read_next_bytes(fid, num_bytes, format_char_sequence, endian_character="<"): - """Read and unpack the next bytes from a binary file. - :param fid: - :param num_bytes: Sum of combination of {2, 4, 8}, e.g. 2, 6, 16, 30, etc. - :param format_char_sequence: List of {c, e, f, d, h, H, i, I, l, L, q, Q}. - :param endian_character: Any of {@, =, <, >, !} - :return: Tuple of read and unpacked values. - """ - data = fid.read(num_bytes) - return struct.unpack(endian_character + format_char_sequence, data) - - -def write_next_bytes(fid, data, format_char_sequence, endian_character="<"): - """pack and write to a binary file. - :param fid: - :param data: data to send, if multiple elements are sent at the same time, - they should be encapsuled either in a list or a tuple - :param format_char_sequence: List of {c, e, f, d, h, H, i, I, l, L, q, Q}. - should be the same length as the data list or tuple - :param endian_character: Any of {@, =, <, >, !} - """ - if isinstance(data, (list, tuple)): - bytes = struct.pack(endian_character + format_char_sequence, *data) - else: - bytes = struct.pack(endian_character + format_char_sequence, data) - fid.write(bytes) - - -def read_cameras_text(path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::WriteCamerasText(const std::string& path) - void Reconstruction::ReadCamerasText(const std::string& path) - """ - cameras = {} - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - camera_id = int(elems[0]) - model = elems[1] - width = int(elems[2]) - height = int(elems[3]) - params = np.array(tuple(map(float, elems[4:]))) - cameras[camera_id] = Camera( - id=camera_id, - model=model, - width=width, - height=height, - params=params, - ) - return cameras - - -def read_cameras_binary(path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::WriteCamerasBinary(const std::string& path) - void Reconstruction::ReadCamerasBinary(const std::string& path) - """ - cameras = {} - with open(path_to_model_file, "rb") as fid: - num_cameras = read_next_bytes(fid, 8, "Q")[0] - for _ in range(num_cameras): - camera_properties = read_next_bytes( - fid, num_bytes=24, format_char_sequence="iiQQ" - ) - camera_id = camera_properties[0] - model_id = camera_properties[1] - model_name = CAMERA_MODEL_IDS[camera_properties[1]].model_name - width = camera_properties[2] - height = camera_properties[3] - num_params = CAMERA_MODEL_IDS[model_id].num_params - params = read_next_bytes( - fid, - num_bytes=8 * num_params, - format_char_sequence="d" * num_params, - ) - cameras[camera_id] = Camera( - id=camera_id, - model=model_name, - width=width, - height=height, - params=np.array(params), - ) - assert len(cameras) == num_cameras - return cameras - - -def write_cameras_text(cameras, path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::WriteCamerasText(const std::string& path) - void Reconstruction::ReadCamerasText(const std::string& path) - """ - HEADER = ( - "# Camera list with one line of data per camera:\n" - + "# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]\n" - + "# Number of cameras: {}\n".format(len(cameras)) - ) - with open(path, "w") as fid: - fid.write(HEADER) - for _, cam in cameras.items(): - to_write = [cam.id, cam.model, cam.width, cam.height, *cam.params] - line = " ".join([str(elem) for elem in to_write]) - fid.write(line + "\n") - - -def write_cameras_binary(cameras, path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::WriteCamerasBinary(const std::string& path) - void Reconstruction::ReadCamerasBinary(const std::string& path) - """ - with open(path_to_model_file, "wb") as fid: - write_next_bytes(fid, len(cameras), "Q") - for _, cam in cameras.items(): - model_id = CAMERA_MODEL_NAMES[cam.model].model_id - camera_properties = [cam.id, model_id, cam.width, cam.height] - write_next_bytes(fid, camera_properties, "iiQQ") - for p in cam.params: - write_next_bytes(fid, float(p), "d") - return cameras - - -def read_images_text(path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadImagesText(const std::string& path) - void Reconstruction::WriteImagesText(const std::string& path) - """ - images = {} - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - image_id = int(elems[0]) - qvec = np.array(tuple(map(float, elems[1:5]))) - tvec = np.array(tuple(map(float, elems[5:8]))) - camera_id = int(elems[8]) - image_name = elems[9] - elems = fid.readline().split() - xys = np.column_stack( - [ - tuple(map(float, elems[0::3])), - tuple(map(float, elems[1::3])), - ] - ) - point3D_ids = np.array(tuple(map(int, elems[2::3]))) - images[image_id] = Image( - id=image_id, - qvec=qvec, - tvec=tvec, - camera_id=camera_id, - name=image_name, - xys=xys, - point3D_ids=point3D_ids, - ) - return images - - -def read_images_binary(path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadImagesBinary(const std::string& path) - void Reconstruction::WriteImagesBinary(const std::string& path) - """ - images = {} - with open(path_to_model_file, "rb") as fid: - num_reg_images = read_next_bytes(fid, 8, "Q")[0] - for _ in range(num_reg_images): - binary_image_properties = read_next_bytes( - fid, num_bytes=64, format_char_sequence="idddddddi" - ) - image_id = binary_image_properties[0] - qvec = np.array(binary_image_properties[1:5]) - tvec = np.array(binary_image_properties[5:8]) - camera_id = binary_image_properties[8] - binary_image_name = b"" - current_char = read_next_bytes(fid, 1, "c")[0] - while current_char != b"\x00": # look for the ASCII 0 entry - binary_image_name += current_char - current_char = read_next_bytes(fid, 1, "c")[0] - image_name = binary_image_name.decode("utf-8") - num_points2D = read_next_bytes(fid, num_bytes=8, format_char_sequence="Q")[ - 0 - ] - x_y_id_s = read_next_bytes( - fid, - num_bytes=24 * num_points2D, - format_char_sequence="ddq" * num_points2D, - ) - xys = np.column_stack( - [ - tuple(map(float, x_y_id_s[0::3])), - tuple(map(float, x_y_id_s[1::3])), - ] - ) - point3D_ids = np.array(tuple(map(int, x_y_id_s[2::3]))) - images[image_id] = Image( - id=image_id, - qvec=qvec, - tvec=tvec, - camera_id=camera_id, - name=image_name, - xys=xys, - point3D_ids=point3D_ids, - ) - return images - - -def write_images_text(images, path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadImagesText(const std::string& path) - void Reconstruction::WriteImagesText(const std::string& path) - """ - if len(images) == 0: - mean_observations = 0 - else: - mean_observations = sum( - (len(img.point3D_ids) for _, img in images.items()) - ) / len(images) - HEADER = ( - "# Image list with two lines of data per image:\n" - + "# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME\n" - + "# POINTS2D[] as (X, Y, POINT3D_ID)\n" - + "# Number of images: {}, mean observations per image: {}\n".format( - len(images), mean_observations - ) - ) - - with open(path, "w") as fid: - fid.write(HEADER) - for _, img in images.items(): - image_header = [ - img.id, - *img.qvec, - *img.tvec, - img.camera_id, - img.name, - ] - first_line = " ".join(map(str, image_header)) - fid.write(first_line + "\n") - - points_strings = [] - for xy, point3D_id in zip(img.xys, img.point3D_ids): - points_strings.append(" ".join(map(str, [*xy, point3D_id]))) - fid.write(" ".join(points_strings) + "\n") - - -def write_images_binary(images, path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadImagesBinary(const std::string& path) - void Reconstruction::WriteImagesBinary(const std::string& path) - """ - with open(path_to_model_file, "wb") as fid: - write_next_bytes(fid, len(images), "Q") - for _, img in images.items(): - write_next_bytes(fid, img.id, "i") - write_next_bytes(fid, img.qvec.tolist(), "dddd") - write_next_bytes(fid, img.tvec.tolist(), "ddd") - write_next_bytes(fid, img.camera_id, "i") - for char in img.name: - write_next_bytes(fid, char.encode("utf-8"), "c") - write_next_bytes(fid, b"\x00", "c") - write_next_bytes(fid, len(img.point3D_ids), "Q") - for xy, p3d_id in zip(img.xys, img.point3D_ids): - write_next_bytes(fid, [*xy, p3d_id], "ddq") - - -def read_points3D_text(path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadPoints3DText(const std::string& path) - void Reconstruction::WritePoints3DText(const std::string& path) - """ - points3D = {} - with open(path, "r") as fid: - while True: - line = fid.readline() - if not line: - break - line = line.strip() - if len(line) > 0 and line[0] != "#": - elems = line.split() - point3D_id = int(elems[0]) - xyz = np.array(tuple(map(float, elems[1:4]))) - rgb = np.array(tuple(map(int, elems[4:7]))) - error = float(elems[7]) - image_ids = np.array(tuple(map(int, elems[8::2]))) - point2D_idxs = np.array(tuple(map(int, elems[9::2]))) - points3D[point3D_id] = Point3D( - id=point3D_id, - xyz=xyz, - rgb=rgb, - error=error, - image_ids=image_ids, - point2D_idxs=point2D_idxs, - ) - return points3D - - -def read_points3D_binary(path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadPoints3DBinary(const std::string& path) - void Reconstruction::WritePoints3DBinary(const std::string& path) - """ - points3D = {} - with open(path_to_model_file, "rb") as fid: - num_points = read_next_bytes(fid, 8, "Q")[0] - for _ in range(num_points): - binary_point_line_properties = read_next_bytes( - fid, num_bytes=43, format_char_sequence="QdddBBBd" - ) - point3D_id = binary_point_line_properties[0] - xyz = np.array(binary_point_line_properties[1:4]) - rgb = np.array(binary_point_line_properties[4:7]) - error = np.array(binary_point_line_properties[7]) - track_length = read_next_bytes(fid, num_bytes=8, format_char_sequence="Q")[ - 0 - ] - track_elems = read_next_bytes( - fid, - num_bytes=8 * track_length, - format_char_sequence="ii" * track_length, - ) - image_ids = np.array(tuple(map(int, track_elems[0::2]))) - point2D_idxs = np.array(tuple(map(int, track_elems[1::2]))) - points3D[point3D_id] = Point3D( - id=point3D_id, - xyz=xyz, - rgb=rgb, - error=error, - image_ids=image_ids, - point2D_idxs=point2D_idxs, - ) - return points3D - - -def write_points3D_text(points3D, path): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadPoints3DText(const std::string& path) - void Reconstruction::WritePoints3DText(const std::string& path) - """ - if len(points3D) == 0: - mean_track_length = 0 - else: - mean_track_length = sum( - (len(pt.image_ids) for _, pt in points3D.items()) - ) / len(points3D) - HEADER = ( - "# 3D point list with one line of data per point:\n" - + "# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)\n" - + "# Number of points: {}, mean track length: {}\n".format( - len(points3D), mean_track_length - ) - ) - - with open(path, "w") as fid: - fid.write(HEADER) - for _, pt in points3D.items(): - point_header = [pt.id, *pt.xyz, *pt.rgb, pt.error] - fid.write(" ".join(map(str, point_header)) + " ") - track_strings = [] - for image_id, point2D in zip(pt.image_ids, pt.point2D_idxs): - track_strings.append(" ".join(map(str, [image_id, point2D]))) - fid.write(" ".join(track_strings) + "\n") - +from general import transform_save_bpy -def write_points3D_binary(points3D, path_to_model_file): - """ - see: src/colmap/scene/reconstruction.cc - void Reconstruction::ReadPoints3DBinary(const std::string& path) - void Reconstruction::WritePoints3DBinary(const std::string& path) - """ - with open(path_to_model_file, "wb") as fid: - write_next_bytes(fid, len(points3D), "Q") - for _, pt in points3D.items(): - write_next_bytes(fid, pt.id, "Q") - write_next_bytes(fid, pt.xyz.tolist(), "ddd") - write_next_bytes(fid, pt.rgb.tolist(), "BBB") - write_next_bytes(fid, pt.error, "d") - track_length = pt.image_ids.shape[0] - write_next_bytes(fid, track_length, "Q") - for image_id, point2D_id in zip(pt.image_ids, pt.point2D_idxs): - write_next_bytes(fid, [image_id, point2D_id], "ii") - - -def detect_model_format(path, ext): - if ( - os.path.isfile(os.path.join(path, "cameras" + ext)) - and os.path.isfile(os.path.join(path, "images" + ext)) - and os.path.isfile(os.path.join(path, "points3D" + ext)) - ): - print("Detected model format: '" + ext + "'") - return True - - return False - - -def read_model(path, ext=""): - # try to detect the extension automatically - if ext == "": - if detect_model_format(path, ".bin"): - ext = ".bin" - elif detect_model_format(path, ".txt"): - ext = ".txt" - else: - print("Provide model format: '.bin' or '.txt'") - return - - if ext == ".txt": - cameras = read_cameras_text(os.path.join(path, "cameras" + ext)) - images = read_images_text(os.path.join(path, "images" + ext)) - points3D = read_points3D_text(os.path.join(path, "points3D") + ext) - else: - cameras = read_cameras_binary(os.path.join(path, "cameras" + ext)) - images = read_images_binary(os.path.join(path, "images" + ext)) - points3D = read_points3D_binary(os.path.join(path, "points3D") + ext) - return cameras, images, points3D - - -def write_model(cameras, images, points3D, path, ext=".bin"): - if ext == ".txt": - write_cameras_text(cameras, os.path.join(path, "cameras" + ext)) - write_images_text(images, os.path.join(path, "images" + ext)) - write_points3D_text(points3D, os.path.join(path, "points3D") + ext) - else: - write_cameras_binary(cameras, os.path.join(path, "cameras" + ext)) - write_images_binary(images, os.path.join(path, "images" + ext)) - write_points3D_binary(points3D, os.path.join(path, "points3D") + ext) - return cameras, images, points3D - - -def qvec2rotmat(qvec): - return np.array( - [ - [ - 1 - 2 * qvec[2] ** 2 - 2 * qvec[3] ** 2, - 2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3], - 2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2], - ], - [ - 2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3], - 1 - 2 * qvec[1] ** 2 - 2 * qvec[3] ** 2, - 2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1], - ], - [ - 2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2], - 2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1], - 1 - 2 * qvec[1] ** 2 - 2 * qvec[2] ** 2, - ], - ] - ) - - -def rotmat2qvec(R): - Rxx, Ryx, Rzx, Rxy, Ryy, Rzy, Rxz, Ryz, Rzz = R.flat - K = ( - np.array( - [ - [Rxx - Ryy - Rzz, 0, 0, 0], - [Ryx + Rxy, Ryy - Rxx - Rzz, 0, 0], - [Rzx + Rxz, Rzy + Ryz, Rzz - Rxx - Ryy, 0], - [Ryz - Rzy, Rzx - Rxz, Rxy - Ryx, Rxx + Ryy + Rzz], - ] - ) - / 3.0 - ) - eigvals, eigvecs = np.linalg.eigh(K) - qvec = eigvecs[[3, 0, 1, 2], np.argmax(eigvals)] - if qvec[0] < 0: - qvec *= -1 - return qvec - - -def get_oss_client(cfg_path): - with open(os.path.expanduser(cfg_path), "r") as config: - cfg = yaml.safe_load(config) - - AccessKeyId_down = cfg["run"]["down"]["AccessKeyId"] - AccessKeySecret_down = cfg["run"]["down"]["AccessKeySecret"] - Endpoint_down = cfg["run"]["down"]["Endpoint"] - Bucket_down = cfg["run"]["down"]["Bucket"] - - oss_client = oss2.Bucket( - oss2.Auth(AccessKeyId_down, AccessKeySecret_down), Endpoint_down, Bucket_down - ) - - return oss_client +from compute_print_net import get_oss_client class DataTransfer: ''' @@ -1161,20 +320,6 @@ class DataTransfer: return True - def download_single_file(self): - """ - 下载单个文件从OSS到本地 - """ - # 确保本地目录存在 - os.makedirs(os.path.dirname(self.local_path), exist_ok=True) - - # 直接下载文件 - try: - self.oss_client.get_object_to_file(self.oss_path, self.local_path) - print(f"文件已下载到: {self.local_path}") - except oss2.exceptions.NoSuchKey: - print(f"OSS文件不存在: {self.oss_path}") - def upload_data(self): ''' 上传数据到OSS @@ -1225,18 +370,6 @@ class DataTransfer: import requests import json import shutil - -def get_api(url): - try: - response = requests.get(url) - response.raise_for_status() # 检查请求是否成功 - response = json.loads(response.text) - if response.get("code") != 1000: - raise Exception(f"Error fetching URL {url}: {response.get('message')}") - else: - return response - except requests.exceptions.RequestException as e: - raise Exception(f"Error fetching URL {url}: {e}") from dataclasses import dataclass @dataclass @@ -1292,7 +425,6 @@ def read_pids_from_json(pid_file): return list_model_info, data def download_data_by_json(model_info, workdir, oss_client ): - try: pid = model_info.pid model_height = model_info.model_height @@ -1405,12 +537,11 @@ def download_transform_save_by_batch(batch_id, workdir, oss_config): transform_save_o3d(layout_data, original_obj_pid_dir) - -def download_datas_by_json(pid_file, workdir, oss_config): +def download_datas_by_json(json_name, workdir, oss_config): oss_client = get_oss_client(oss_config) #json_path = os.path.join(workdir, "3DPrintLayout.json") - json_path = os.path.join(workdir, f"{pid_file}.json") + json_path = os.path.join(workdir, f"{json_name}.json") # 读取所有PID list_model_info, data = read_pids_from_json(json_path) @@ -1418,16 +549,14 @@ def download_datas_by_json(pid_file, workdir, oss_config): # 批量下载 for model_info in list_model_info: print(f"开始下载PID: {model_info}") - download_data_by_json(model_info, args.workdir, oss_client) + download_data_by_json(model_info, workdir, oss_client) return data -def download_transform_save_by_json(pid_file, workdir, oss_config): - layout_data = download_datas_by_json(pid_file, workdir, oss_config) - +def download_transform_save_by_json(json_name, workdir, oss_config): + layout_data = download_datas_by_json(json_name, workdir, oss_config) original_obj_pid_dir = workdir - - transform_save_o3d(layout_data, original_obj_pid_dir) + transform_save_bpy(layout_data, original_obj_pid_dir) def upload_result(base_original_obj_dir, oss_config, batch_id): @@ -1458,60 +587,37 @@ if __name__ == "__main__": is_by_batch = True is_transform_save = False + batch_id = 10118 if is_by_batch: - # 通过批次下载 + # 通过batch_id下载 + """ parser.add_argument("--batch_id", type=str, required=True, help="batch_id") - parser.add_argument("--workdir", type=str, required=True) - parser.add_argument("--oss_config", type=str, required=True) args = parser.parse_args() + batch_id = args.batch_id """ - # batch_id = args.batch_id - batch_id = 10118 - # workdir = args.workdir workdir = f"{print_data_dir}{batch_id}" - # oss_config = args.oss_config - if is_transform_save: download_transform_save_by_batch(batch_id, workdir, oss_config) else: download_datas_by_batch(batch_id, workdir, oss_config) - """ - oss_client = get_oss_client(args.oss_config) - # 读取所有path - list_print_model_info = read_paths_from_batch(args.batch_id) - print(f"从文件读取了 {len(list_print_model_info)} 个path") - # 批量下载 - for batch_model_info in list_print_model_info: - print(f"开始下载print_model_info: {batch_model_info}") - download_data_by_batch(batch_model_info, args.workdir, oss_client) - """ else: # 通过Json下载 - parser.add_argument("--batch_id", type=str, required=True, help="包含PID列表的json文件路径") - parser.add_argument("--workdir", type=str, required=True) - parser.add_argument("--oss_config", type=str, required=True) - args = parser.parse_args() - if is_transform_save: - download_transform_save_by_json(args.batch_id, args.workdir, args.oss_config) - else: - download_datas_by_json(args.batch_id, args.workdir, args.oss_config) - """ - oss_client = get_oss_client(args.oss_config) - pid_file = os.path.join(args.workdir, "3DPrintLayout.json") - - print("pid_file=", pid_file) - # 读取所有PID - list_model_info = read_pids_from_json(pid_file) - print(f"从文件读取了 {len(list_model_info)} 个PID") - # 批量下载 - for model_info in list_model_info: - print(f"开始下载PID: {model_info}") - download_data_by_json(model_info, args.workdir, oss_client) + parser.add_argument("--batch_id", type=str, required=True, help="batch_id") + args = parser.parse_args() + batch_id = args.batch_id """ + workdir = f"{print_data_dir}{batch_id}" + + json_name = batch_id + + if is_transform_save: + download_transform_save_by_json(json_name, workdir, oss_config) + else: + download_datas_by_json(json_name, workdir, oss_config) \ No newline at end of file diff --git a/download_print_out.py b/download_print_out.py index 03c0d1f..83f4c28 100644 --- a/download_print_out.py +++ b/download_print_out.py @@ -15,8 +15,12 @@ import shutil from config import url_get_oss_suffix_by_orderId -def download_transform_save_by_json(pid_file, workdir, oss_config): - layout_data = download_datas_by_json(pid_file, workdir, oss_config) +from general import transform_save_bpy + +from compute_print_net import get_oss_client + +def download_transform_save_by_json(json_name, workdir, oss_config): + layout_data = download_datas_by_json(json_name, workdir, oss_config) original_obj_pid_dir = workdir transform_save_bpy(layout_data, original_obj_pid_dir) @@ -241,21 +245,6 @@ def download_data_by_json(model_info, workdir, oss_client ): except Exception as e: print(f"下载失败: {pid}, 错误: {str(e)}") pass - -def get_oss_client(cfg_path): - with open(os.path.expanduser(cfg_path), "r") as config: - cfg = yaml.safe_load(config) - - AccessKeyId_down = cfg["run"]["down"]["AccessKeyId"] - AccessKeySecret_down = cfg["run"]["down"]["AccessKeySecret"] - Endpoint_down = cfg["run"]["down"]["Endpoint"] - Bucket_down = cfg["run"]["down"]["Bucket"] - - oss_client = oss2.Bucket( - oss2.Auth(AccessKeyId_down, AccessKeySecret_down), Endpoint_down, Bucket_down - ) - - return oss_client def download_datas_by_json(pid_file, workdir, oss_config): oss_client = get_oss_client(oss_config) diff --git a/general.py b/general.py index 5f35dc5..f10b21a 100644 --- a/general.py +++ b/general.py @@ -6,6 +6,7 @@ from config import * from compute_print_net_out import mesh_transform_by_matrix from compute_print_net_out import down_sample from compute_print_net_out import voxel_size +from compute_print_net_out import read_mesh # -------------------------- 开始:运行 ----------------------------------