From 1e7afd03e48ba4ba22fdd1c80dbd856d8bc5e799 Mon Sep 17 00:00:00 2001 From: mckay Date: Sun, 10 Nov 2024 12:46:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 + deep_sdf/__pycache__/__init__.cpython-39.pyc | Bin 276 -> 0 bytes deep_sdf/__pycache__/data.cpython-39.pyc | Bin 4137 -> 0 bytes deep_sdf/__pycache__/mesh.cpython-39.pyc | Bin 3030 -> 0 bytes deep_sdf/__pycache__/utils.cpython-39.pyc | Bin 1435 -> 0 bytes deep_sdf/__pycache__/workspace.cpython-39.pyc | Bin 4412 -> 0 bytes .../__pycache__/chamfer.cpython-39.pyc | Bin 1184 -> 0 bytes .../deep_sdf_decoder.cpython-39.pyc | Bin 2311 -> 0 bytes .../__pycache__/convert_utils.cpython-310.pyc | Bin 10811 -> 0 bytes .../__pycache__/convert_utils.cpython-39.pyc | Bin 11127 -> 0 bytes scripts/process_furniture.py | 393 +++++++++++++----- 11 files changed, 299 insertions(+), 102 deletions(-) delete mode 100644 deep_sdf/__pycache__/__init__.cpython-39.pyc delete mode 100644 deep_sdf/__pycache__/data.cpython-39.pyc delete mode 100644 deep_sdf/__pycache__/mesh.cpython-39.pyc delete mode 100644 deep_sdf/__pycache__/utils.cpython-39.pyc delete mode 100644 deep_sdf/__pycache__/workspace.cpython-39.pyc delete mode 100644 deep_sdf/metrics/__pycache__/chamfer.cpython-39.pyc delete mode 100644 networks/__pycache__/deep_sdf_decoder.cpython-39.pyc delete mode 100644 scripts/__pycache__/convert_utils.cpython-310.pyc delete mode 100644 scripts/__pycache__/convert_utils.cpython-39.pyc diff --git a/.gitignore b/.gitignore index 82f9275..158fe5b 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,11 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + + +# model +*.stl +*.obj +*.npz +*.step +test_data/ \ No newline at end of file diff --git a/deep_sdf/__pycache__/__init__.cpython-39.pyc b/deep_sdf/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 7f9b61ee286cbed54a381d380cf77ef376938f28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmYe~<>g`kg8%n8(%%B<#~=<>Hp)?DSW(sD| zWPS}OWH{HY}z;Xbp3n^ey1b``WIe9*q3*F+#nn71xMQAS@A6;VZhLu`sQvHpy;>tajP z#0_8@SX&nxSi6yU{muSXe;YgQ2=>5gZoj~}tyYIqw|D~dCA2$e>URKLYsPbS*ZO=s zvvZc)dlvAAGpE3F$I!o-xtY~xbDrC|le>cLSm*Z4Tkx#R?mM{$j&C?_?w>Q&&%C)W z_&mS}J7>(wdG2-DyLjK}o2Q$nLC$eTyES$8)A4lLxSyO(5|t&Qk&e>0lP5jkY1TOI z4U)#K-_C9|OPY_AcE)jbqMiPzmumi4>ADifk&1`oL82lxc_?~Pdp$+Vv_BYiyS=ol z{l~FP3Gt3cau{dLK$k_F#gQ6KWGB(C8V`C|JHSC`q0&B$swC54XAmnDrSULnS9__- z;zl9t&SNcAZxoaDdgAyn*o!O}hFp5Qk{029Q`}r)@46?9@nG zueV0`5_NKf6MrJ*NKW6sANLf5{`e$G8*yWZ!9wOe1w}yqqe&_nJsMLd@i=Kfz)2?? z$)~O7jt(Ltizw1z6b(mWGDv_|qUdxI4@e}S{3sHmP81ojTmf`KSqFHN&P&b~Fozq? z|9!2kdy_%dgAJ@+?xQzWZj&S(!0nZT6Q@J+zj(;+ zJhVG#>OMebW#mJMB=8@0#+EcM=pAduGI-$`6ZRu6-^-jc>-Q|JFL=%)M}C&M#LF>b z&w~HBt!e4t_U(h)`=f{bsaN!pPVs_3)6>oXo}``bVDwPCJ=57RS0iUhXKwO#$*4Ah zYTIjM0nvp;t83TR+sD0BL}pGer3Hm8d=L8=le1WzRbF{^#n`RK!#|b*u@x}#kQIJCa9GYk||O%C)@{8oRChH@j3J(m^mX~P{oOD#5cQJ z#58S>5vuGo={6nB(=n7ViiK=oFC8As(J)FU!|_uL1{adX?D15GSQizS&>@yD@avb^ zlSwQnk}M-%FU>}gjE9GKg`yyDv5>8?H7?%Qs4x%mQkM(ooX^5MG^Q>oQpmReUXX7YGjEpVw+O#QfK+LuEXlC64XJ2H z#;HJrr{G0;Ko+RLhLb0eN(QiAZFi6m%Cbo-O2{BZGLhum@;d~+OC!!nJUDKLv>DV# z>b=0BCLI=w3jP8ozQ4#!*A-Zwq~o~r=&A~Tj<+cCN75W3Asnf0SNJa5<)p_Nmt?jp znyiAc)a2hlEc92&;Vu+r_9(fd>_Bg4G+O8iTJ0Mnp1IIgfq7)ig5_@R>{^hy4|DeM zb9UgCSdTQGJCB(BQ|8Pu$LQItgq}UY>|0)f9W=4+#8_z>ff$RqarY zl|LrVQi<{%knMncO!cM-@;yAvU{%Az0!qh1zDLX6CGbA2sG51p(Vx%&<>&%X9@95p zS7>A$9X|OvCa4C0W%L@b0D28s$ZM>|1GWoD7&QD5=5%P{)yD>Lh^ENSmnl6I@EsI@ zws3`q;?NPk2++Ht1UZ&iAfG@l=2;%fNqtfOf1176OPMhn}Co zaw40wEm-Ddes1;cGsJ-%*wYSXQp!S6=U`TlJM!;cSX@-1StuaCKq(mZ%X3&_pJmnl zn(^x(Tc6kR0D-iW-N@?mjl4u@%tV)P$wBNeoHEvy=9_tlnOk|--xe;7>{)r)aLSjQ zE~m4cwgjaKuQl~13e{d?x>wXJszIt~kVQ0#im!1QN{T45QQDL=+QlgVG8yM9bmj;K_k=+CqP?PRfOedVoYcqJy1>`CC} zrJn)0_(JG1U%rzCWM{-fAHwQUf*|{q5&y2xWLff8*sfWT*K}+& zbg5{%k0do2Z311kHD`9T)x&|rWQZMz!Nk@<`#Gs!|&hW zTY)WUqzRSbzbkKoSU82LVhYnXLivD(8UVUxDzyDc)*GmO@(f+S`1;v@Jd%$T(qE!W zOSJG5`lQj7`;#>54U6xS%QDqel0}B6lE!31BVz5Ex5y7^v40ou!iSqV@>ktb2OkvQ fDIb!9ny`$3eEH)QJJ_muH7_U!ZV-f9;mt1rg-5Hg diff --git a/deep_sdf/__pycache__/mesh.cpython-39.pyc b/deep_sdf/__pycache__/mesh.cpython-39.pyc deleted file mode 100644 index 4636277e9fb9640f1d0f0dc1bcf224d047ff6c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3030 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 diff --git a/deep_sdf/metrics/__pycache__/chamfer.cpython-39.pyc b/deep_sdf/metrics/__pycache__/chamfer.cpython-39.pyc deleted file mode 100644 index f88bc62c80b723753c4f92d40e46b8286916dd27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 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 trimesh.Trimesh: - mesh = trimesh.load_mesh(file_path) - return mesh +from OCC.Core.STEPControl import STEPControl_Reader +from OCC.Core.BRepMesh import BRepMesh_IncrementalMesh +from OCC.Core.StlAPI import StlAPI_Writer +from OCC.Core.IFSelect import IFSelect_RetDone -def process_mesh_to_sdf( +# 配置日志记录 +def setup_logger(): + logger = logging.getLogger('furniture_processing') + logger.setLevel(logging.INFO) + + # 文件处理器 + fh = logging.FileHandler('furniture_processing.log') + fh.setLevel(logging.INFO) + + # 控制台处理器 + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + + # 创建格式器 + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + fh.setFormatter(formatter) + ch.setFormatter(formatter) + + # 添加处理器 + logger.addHandler(fh) + logger.addHandler(ch) + + return logger + +logger = setup_logger() + +def brep_to_mesh( + brep_file: str, + stl_output_file: str, + obj_output_file: str + ) -> Optional[trimesh.Trimesh]: + """将BREP/STEP文件转换为Trimesh对象并保存STL和OBJ文件""" + try: + step_reader = STEPControl_Reader() + status = step_reader.ReadFile(brep_file) + + if status != IFSelect_RetDone: + logger.error(f"无法读取BREP文件: {brep_file}") + return None + + step_reader.TransferRoots() + shape = step_reader.OneShape() + + mesh = BRepMesh_IncrementalMesh(shape, 0.1) + mesh.Perform() + + base_name = os.path.splitext(os.path.basename(brep_file))[0] + + # 保存STL + stl_writer = StlAPI_Writer() + stl_writer.Write(shape, stl_output_file) + + # 保存OBJ + mesh = trimesh.load(stl_output_file) + mesh.export(obj_output_file) + + logger.debug(f"成功转换并保存mesh: {base_name}") + return mesh + + except Exception as e: + logger.error(f"转换BREP文件失败 {brep_file}: {str(e)}") + return None + +# 现在加上x,y,z坐标值,并分成pos和neg两个组 +def sdf2xyzsdf(sdf, size=128): + # Generate coordinate grids + x, y, z = np.meshgrid(range(size), range(size), range(size), indexing='ij') + + # Stack coordinates along a new axis + coords = np.stack([x, y, z], axis=-1) + + # Reshape to match the SDF shape + coords = coords.reshape(size, size, size, 3) + + # Stack coordinates and SDF values + xyzsdf = np.concatenate([coords, sdf[..., np.newaxis]], axis=-1) + + return xyzsdf + +def split_sdf(xyzsdf): + # Separate positive and negative SDF values + pos_mask = xyzsdf[..., 3] >= 0 + neg_mask = xyzsdf[..., 3] < 0 + + pos_xyzsdf = xyzsdf[pos_mask] + neg_xyzsdf = xyzsdf[neg_mask] + + return pos_xyzsdf, neg_xyzsdf + + +def mesh_to_sdf( mesh: trimesh.Trimesh, - filename:str, - save_dir:str, - idx: str, - mesh_scale:int = 0.8, - size:int= 128, - level: int = None, -) -> str: - if not level: - level = 2 / size - - # mesh = trimesh.load(filename, force='mesh') - - # normalize mesh - vertices = mesh.vertices - bbmin = vertices.min(0) - bbmax = vertices.max(0) - center = (bbmin + bbmax) * 0.5 - scale = 2.0 * mesh_scale / (bbmax - bbmin).max() - vertices = (vertices - center) * scale - - # fix mesh - t0 = time.time() - sdf, mesh = mesh2sdf.compute( - vertices, mesh.faces, size, fix=True, level=level, return_mesh=True) - t1 = time.time() - - # sdf to x,y,z,sdf - xyzsdf = np.zeros((size, size, size, 4)) - for x in range(size): - for y in range(size): - for z in range(size): - xyzsdf[x, y, z] = [x, y, z, sdf[x, y, z]] - # output - mesh.vertices = mesh.vertices / scale + center - name = filename.split('/')[-1][:-4] - #mesh.export(os.path.join(save_dir, filename[:-4] + '.fixed.obj')) - np.save(os.path.join(save_dir, filename[:-4] + '.xyzsdf.npy'), xyzsdf) - #mesh.export(filename[:-4] + '.fixed.obj') - #np.save(filename[:-4] + '.npy', sdf) - #print('It takes %.4f seconds to process %s' % (t1-t0, filename)) - return idx - - -''' -# 定义网格 -def create_grid(x_range, y_range, z_range, resolution): - x = np.linspace(x_range[0], x_range[1], resolution) - y = np.linspace(y_range[0], y_range[1], resolution) - z = np.linspace(z_range[0], z_range[1], resolution) - grid = np.meshgrid(x, y, z) - points = np.vstack(list(map(np.ravel, grid))).T - return points -''' - - - -def test(): - # 参数设置 - input_file = "/mnt/disk2/dataset/furniture/step/furniture_dataset_step/train/bathtub_0004.step" - output_file = "tmp_data" - - # 加载BREP模型并转换为三角网格 - mesh = load_brep_to_mesh(input_file) - - process_mesh_to_sdf( - mesh=mesh, - filename=input_file, - save_dir=output_file, - idx="0000000", - ) - - - - - - -# 真的执行转换 + filename: str, + sdf_output_file: str, + mesh_scale: float = 0.8, + size: int = 128, + level: float = None, +) -> bool: + """ + 将mesh转换为SDF并保存结果 + """ + try: + if not level: + level = 2 / size + + # 标准化网格 + vertices = mesh.vertices + bbmin = vertices.min(0) + bbmax = vertices.max(0) + center = (bbmin + bbmax) * 0.5 + scale = 2.0 * mesh_scale / (bbmax - bbmin).max() + vertices = (vertices - center) * scale + + # 计算SDF + sdf, mesh = mesh2sdf.compute( + vertices, + mesh.faces, + size, + fix=True, + level=level, + return_mesh=True + ) + + # Get the dimensions of the SDF grid + size = sdf.shape[0] + + # Convert SDF to XYZ+SDF format + xyzsdf = sdf2xyzsdf(sdf, size) + + # Split into positive and negative SDF values + pos_xyzsdf, neg_xyzsdf = split_sdf(xyzsdf) + + # Save the results as a .npz file + np.savez_compressed(sdf_output_file, pos=pos_xyzsdf, neg=neg_xyzsdf) + + logger.debug(f"成功生成并保存SDF: {os.path.basename(sdf_output_file)}") + return True + + except Exception as e: + logger.error(f"处理文件失败 {filename}: {str(e)}") + return False + +def check_conversion( + step_file: str, + obj_path: str, + sdf_path: str +) -> bool: + """检查转换结果的质量""" + try: + base_name = os.path.splitext(os.path.basename(step_file))[0] + + # 检查文件是否存在 + if not (os.path.exists(obj_path) and os.path.exists(sdf_path)): + logger.warning(f"文件不完整: {base_name}") + return False + + # 加载并检查OBJ + obj_mesh = trimesh.load(obj_path) + if not (obj_mesh.is_watertight ): + logger.warning(f"网格质量不合格: {base_name}") + return False + + # 检查SDF + sdf_data = np.load(sdf_path) + # 检查pos和neg数组是否存在 + if 'pos' not in sdf_data or 'neg' not in sdf_data: + logger.warning(f"SDF数据格式不正确: {base_name}") + return False + # 检查数据维度和内容 + if np.isnan(sdf_data['pos']).any() or np.isnan(sdf_data['neg']).any(): + logger.warning(f"SDF数据包含NaN值: {base_name}") + return False + + logger.debug(f"质量检查通过: {base_name}") + return True + + except Exception as e: + logger.error(f"检查失败 {step_file}: {str(e)}") + return False + +def process(step_file: str, set_name:str) -> bool: + """处理单个STEP文件的完整流程""" + try: + base_name = os.path.splitext(os.path.basename(step_file))[0] + logger.info(f"开始处理: {base_name}") + + # 准备输出路径 + stl_output_file = os.path.join('test_data/stl', f"{set_name}/{base_name}.stl") + obj_output_file = os.path.join('test_data/obj', f"{set_name}/{base_name}.obj") + sdf_output_file = os.path.join('test_data/sdf', f"{set_name}/{base_name}.npz") + + + # 使用tqdm创建处理步骤的进度条 + steps = ['STEP->Mesh', 'Mesh->SDF', '质量检查'] + pbar = tqdm(steps, desc=f"处理 {base_name}", leave=False, position=1) + + # 1. STEP到Mesh的转换 + pbar.set_description(f"处理 {base_name} [STEP->Mesh]") + mesh = brep_to_mesh(step_file, stl_output_file, obj_output_file) + if mesh is None: + pbar.close() + return False + pbar.update(1) + + # 2. Mesh到SDF的转换 + pbar.set_description(f"处理 {base_name} [Mesh->SDF]") + if not mesh_to_sdf(mesh, step_file, sdf_output_file, mesh_scale=0.8, size=128): + pbar.close() + return False + pbar.update(1) + + # 3. 检查转换结果 + pbar.set_description(f"处理 {base_name} [质量检查]") + if not check_conversion(step_file, obj_output_file, sdf_output_file): + pbar.close() + return False + pbar.update(1) + + pbar.close() + logger.info(f"成功处理: {base_name}") + return True + + except Exception as e: + logger.error(f"处理失败 {step_file}: {str(e)}") + return False + def main(): + """主函数:并行处理所有STEP文件""" + INPUT = '/mnt/disk2/dataset/furniture/step/furniture_dataset_step' + if not os.path.exists(INPUT): + logger.error(f"输入目录不存在: {INPUT}") + return + + # 创建基础输出目录 + os.makedirs('test_data/stl', exist_ok=True) + os.makedirs('test_data/obj', exist_ok=True) + os.makedirs('test_data/sdf', exist_ok=True) + + + + logger.info("开始数据处理...") + + # 创建总体进度条 + #for set_name in ['train', 'val', 'test']: + for set_name in ['val', 'test']: + + input_dir = os.path.join(INPUT, set_name) + if not os.path.exists(input_dir): + logger.warning(f"目录不存在: {input_dir}") + continue + + os.makedirs(f'test_data/stl/{set_name}', exist_ok=True) + os.makedirs(f'test_data/obj/{set_name}', exist_ok=True) + os.makedirs(f'test_data/sdf/{set_name}', exist_ok=True) + + step_files = glob.glob(os.path.join(input_dir, '*.step')) + total_files = len(step_files) + if total_files == 0: + logger.error("没有找到任何STEP文件") + logger.info(f"找到 {set_name} 集合文件: {total_files}个") - INPUT = '/mnt/disk2/dataset/furniture/step/furniture_dataset_step' # 下面train,val和test - OUTPUT = '/app/data/furniture_sdf' - valid = 0 - for set_ in ['train', 'val', 'test']: - with ProcessPoolExecutor(max_workers=os.cpu_count() // 2) as executor: - futures = {} - for step_folder in glob.glob(os.path.join(input_folder, set_, '*.step')): - future = executor.submit(process, step_folder, timeout=300) - futures[future] = step_folder - for future in tqdm(as_completed(futures), total=len(step_dirs)): - try: - status = future.result(timeout=300) - valid += status - except TimeoutError: - print(f"Timeout occurred while processing {futures[future]}") - except Exception as e: - print(f"An error occurred while processing {futures[future]}: {e}") + valid_conversions = 0 + # 创建进度条 + with tqdm(total=total_files, desc=f"{set_name}进度", position=0) as main_pbar: + with ProcessPoolExecutor(max_workers=min(max(1, os.cpu_count() // 2), 8)) as executor: + futures = {executor.submit(process, f, set_name): f for f in step_files} + + for future in as_completed(futures): + try: + if future.result(timeout=300): + valid_conversions += 1 + main_pbar.update(1) + main_pbar.set_postfix({ + 'success_rate': f"{(valid_conversions/total_files)*100:.1f}%" + }) + except Exception as e: + logger.error(f"处理失败 {futures[future]}: {str(e)}") + main_pbar.update(1) + success_rate = (valid_conversions / total_files) * 100 # 这个变量在日志中被使用但未定义 + logger.info(f"处理完成: {set_name} 集合, 成功率: {success_rate:.2f}% = {valid_conversions}/{total_files}个") - print(f'Done... Data Converted Ratio {100.0*valid/len(step_dirs)}%') + + if __name__ == "__main__": - test() + main()