2 changed files with 194 additions and 0 deletions
@ -0,0 +1,194 @@ |
|||||
|
import os |
||||
|
import numpy as np |
||||
|
from collections import defaultdict |
||||
|
from tqdm import tqdm |
||||
|
import pickle |
||||
|
from brep2sdf.scripts.process_brep import parse_solid |
||||
|
from brep2sdf.utils.logger import logger |
||||
|
|
||||
|
def analyze_brep_stats(step_path_list): |
||||
|
"""分析BRep文件的统计信息 |
||||
|
|
||||
|
Args: |
||||
|
step_path_list: STEP文件路径列表 |
||||
|
|
||||
|
Returns: |
||||
|
stats_dict: 包含统计信息的字典 |
||||
|
""" |
||||
|
stats = defaultdict(list) |
||||
|
failed_files = [] |
||||
|
|
||||
|
for step_path in tqdm(step_path_list, desc="分析BRep文件"): |
||||
|
try: |
||||
|
# 解析STEP文件 |
||||
|
data = parse_solid(step_path) |
||||
|
if data is None: |
||||
|
failed_files.append(os.path.basename(step_path)) |
||||
|
continue |
||||
|
|
||||
|
# 收集统计信息 |
||||
|
stats['num_faces'].append(len(data['surf_wcs'])) |
||||
|
stats['num_edges'].append(len(data['edge_wcs'])) |
||||
|
stats['num_vertices'].append(len(data['corner_unique'])) |
||||
|
|
||||
|
# 计算每个面的点数 |
||||
|
face_points = [len(face) for face in data['surf_wcs']] |
||||
|
stats['points_per_face'].extend(face_points) |
||||
|
|
||||
|
# 计算每条边的采样点数 |
||||
|
edge_points = [len(edge) for edge in data['edge_wcs']] |
||||
|
stats['points_per_edge'].extend(edge_points) |
||||
|
|
||||
|
except Exception as e: |
||||
|
logger.error(f"处理文件 {step_path} 时出错: {str(e)}") |
||||
|
failed_files.append(os.path.basename(step_path)) |
||||
|
continue |
||||
|
|
||||
|
# 计算最终统计结果 |
||||
|
stats_dict = { |
||||
|
'total_files': len(step_path_list), |
||||
|
'successful_files': len(step_path_list) - len(failed_files), |
||||
|
'failed_files': failed_files, |
||||
|
'success_rate': (len(step_path_list) - len(failed_files)) / len(step_path_list) * 100, |
||||
|
|
||||
|
'face_stats': { |
||||
|
'min': np.min(stats['num_faces']), |
||||
|
'max': np.max(stats['num_faces']), |
||||
|
'mean': np.mean(stats['num_faces']), |
||||
|
'median': np.median(stats['num_faces']), |
||||
|
'std': np.std(stats['num_faces']) |
||||
|
}, |
||||
|
|
||||
|
'edge_stats': { |
||||
|
'min': np.min(stats['num_edges']), |
||||
|
'max': np.max(stats['num_edges']), |
||||
|
'mean': np.mean(stats['num_edges']), |
||||
|
'median': np.median(stats['num_edges']), |
||||
|
'std': np.std(stats['num_edges']) |
||||
|
}, |
||||
|
|
||||
|
'vertex_stats': { |
||||
|
'min': np.min(stats['num_vertices']), |
||||
|
'max': np.max(stats['num_vertices']), |
||||
|
'mean': np.mean(stats['num_vertices']), |
||||
|
'median': np.median(stats['num_vertices']), |
||||
|
'std': np.std(stats['num_vertices']) |
||||
|
}, |
||||
|
|
||||
|
'face_points_stats': { |
||||
|
'min': np.min(stats['points_per_face']), |
||||
|
'max': np.max(stats['points_per_face']), |
||||
|
'mean': np.mean(stats['points_per_face']), |
||||
|
'median': np.median(stats['points_per_face']), |
||||
|
'std': np.std(stats['points_per_face']) |
||||
|
}, |
||||
|
|
||||
|
'edge_points_stats': { |
||||
|
'min': np.min(stats['points_per_edge']), |
||||
|
'max': np.max(stats['points_per_edge']), |
||||
|
'mean': np.mean(stats['points_per_edge']), |
||||
|
'median': np.median(stats['points_per_edge']), |
||||
|
'std': np.std(stats['points_per_edge']) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return stats_dict |
||||
|
|
||||
|
def print_stats(stats_dict): |
||||
|
"""打印统计信息""" |
||||
|
logger.info("\n=== BRep文件统计信息 ===") |
||||
|
|
||||
|
# 基本信息 |
||||
|
logger.info(f"\n处理文件总数: {stats_dict['total_files']}") |
||||
|
logger.info(f"成功处理文件数: {stats_dict['successful_files']}") |
||||
|
logger.info(f"失败文件数: {len(stats_dict['failed_files'])}") |
||||
|
logger.info(f"成功率: {stats_dict['success_rate']:.2f}%") |
||||
|
|
||||
|
# 几何元素统计 |
||||
|
for name, stats in [ |
||||
|
('面', stats_dict['face_stats']), |
||||
|
('边', stats_dict['edge_stats']), |
||||
|
('顶点', stats_dict['vertex_stats']) |
||||
|
]: |
||||
|
logger.info(f"\n{name}统计:") |
||||
|
logger.info(f" 最小值: {stats['min']}") |
||||
|
logger.info(f" 最大值: {stats['max']}") |
||||
|
logger.info(f" 平均值: {stats['mean']:.2f}") |
||||
|
logger.info(f" 中位数: {stats['median']}") |
||||
|
logger.info(f" 标准差: {stats['std']:.2f}") |
||||
|
|
||||
|
# 点云统计 |
||||
|
for name, stats in [ |
||||
|
('面点云', stats_dict['face_points_stats']), |
||||
|
('边点云', stats_dict['edge_points_stats']) |
||||
|
]: |
||||
|
logger.info(f"\n{name}统计:") |
||||
|
logger.info(f" 最小点数: {stats['min']}") |
||||
|
logger.info(f" 最大点数: {stats['max']}") |
||||
|
logger.info(f" 平均点数: {stats['mean']:.2f}") |
||||
|
logger.info(f" 中位数点数: {stats['median']}") |
||||
|
logger.info(f" 点数标准差: {stats['std']:.2f}") |
||||
|
|
||||
|
# 失败文件列表 |
||||
|
if stats_dict['failed_files']: |
||||
|
logger.info("\n失败文件列表:") |
||||
|
for file in stats_dict['failed_files']: |
||||
|
logger.info(f" - {file}") |
||||
|
|
||||
|
def get_step_files(root_dir): |
||||
|
"""递归获取所有STEP文件路径 |
||||
|
|
||||
|
Args: |
||||
|
root_dir: 数据集根目录 |
||||
|
|
||||
|
Returns: |
||||
|
dict: 按数据集分割的文件路径字典 |
||||
|
""" |
||||
|
step_files_dict = {'train': [], 'val': [], 'test': []} |
||||
|
|
||||
|
for split in ['train', 'val', 'test']: |
||||
|
split_dir = os.path.join(root_dir, split) |
||||
|
if not os.path.exists(split_dir): |
||||
|
logger.warning(f"目录不存在: {split_dir}") |
||||
|
continue |
||||
|
|
||||
|
files = [os.path.join(split_dir, f) |
||||
|
for f in os.listdir(split_dir) |
||||
|
if f.endswith('.step')] |
||||
|
step_files_dict[split] = files |
||||
|
logger.info(f"找到 {split} 集 STEP 文件: {len(files)} 个") |
||||
|
|
||||
|
return step_files_dict |
||||
|
|
||||
|
def main(): |
||||
|
"""主函数""" |
||||
|
# 数据集根目录 |
||||
|
root_dir = '/mnt/mynewdisk/dataset/furniture/step/furniture_dataset_step/' |
||||
|
if not os.path.exists(root_dir): |
||||
|
logger.error(f"数据集根目录不存在: {root_dir}") |
||||
|
return |
||||
|
|
||||
|
# 获取所有数据集的STEP文件 |
||||
|
step_files_dict = get_step_files(root_dir) |
||||
|
|
||||
|
# 统计每个数据集的信息 |
||||
|
for split, files in step_files_dict.items(): |
||||
|
if not files: |
||||
|
logger.warning(f"{split} 集没有找到STEP文件") |
||||
|
continue |
||||
|
|
||||
|
logger.info(f"\n=== {split.upper()} 集统计 ===") |
||||
|
stats = analyze_brep_stats(files) |
||||
|
print_stats(stats) |
||||
|
|
||||
|
# 保存统计结果 |
||||
|
save_dir = '/home/wch/brep2sdf/test_data/stats' |
||||
|
os.makedirs(save_dir, exist_ok=True) |
||||
|
save_path = os.path.join(save_dir, f'{split}_stats.pkl') |
||||
|
with open(save_path, 'wb') as f: |
||||
|
pickle.dump(stats, f) |
||||
|
logger.info(f"统计结果已保存到: {save_path}") |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
main() |
||||
|
|
Loading…
Reference in new issue