136 lines
5.2 KiB
Python
136 lines
5.2 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
检查fast_results.pkl文件的结构和内容
|
|||
|
|
显示评估结果的统计信息
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
import pickle
|
|||
|
|
|
|||
|
|
def load_results_sample(file_path, max_samples=5):
|
|||
|
|
"""安全地加载结果文件的一部分"""
|
|||
|
|
print(f"📂 分析文件: {file_path}")
|
|||
|
|
|
|||
|
|
# 检查文件大小
|
|||
|
|
file_size = os.path.getsize(file_path)
|
|||
|
|
print(f"📏 文件大小: {file_size / (1024**3):.2f} GB")
|
|||
|
|
if file_size > 50 * 1024**3: # 50GB
|
|||
|
|
print("⚠️ 文件过大,将只分析前几个样本")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
with open(file_path, 'rb') as f:
|
|||
|
|
# 尝试加载
|
|||
|
|
results = pickle.load(f)
|
|||
|
|
|
|||
|
|
print(f"✅ 成功加载数据")
|
|||
|
|
print(f"📊 数据类型: {type(results)}")
|
|||
|
|
|
|||
|
|
if isinstance(results, list):
|
|||
|
|
analyze_list_results(results, max_samples)
|
|||
|
|
else:
|
|||
|
|
print(f"⚠️ 意外的数据类型: {type(results)}")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 加载失败: {e}")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def analyze_list_results(results, max_samples=5):
|
|||
|
|
"""分析列表类型的评估结果"""
|
|||
|
|
total_samples = len(results)
|
|||
|
|
print(f"📏 总样本数: {total_samples}")
|
|||
|
|
|
|||
|
|
if total_samples == 0:
|
|||
|
|
print("⚠️ 结果列表为空")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 分析前几个样本
|
|||
|
|
samples_to_analyze = min(max_samples, total_samples)
|
|||
|
|
print(f"🔍 分析前 {samples_to_analyze} 个样本:")
|
|||
|
|
|
|||
|
|
sample_stats = {
|
|||
|
|
'has_boxes_3d': 0,
|
|||
|
|
'has_scores_3d': 0,
|
|||
|
|
'has_labels_3d': 0,
|
|||
|
|
'has_masks_bev': 0,
|
|||
|
|
'total_boxes': 0,
|
|||
|
|
'box_score_ranges': [],
|
|||
|
|
'mask_shapes': []
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for i in range(samples_to_analyze):
|
|||
|
|
sample = results[i]
|
|||
|
|
print(f"\n 样本 {i+1}:")
|
|||
|
|
|
|||
|
|
if isinstance(sample, dict):
|
|||
|
|
# 检查3D检测结果
|
|||
|
|
if 'boxes_3d' in sample:
|
|||
|
|
sample_stats['has_boxes_3d'] += 1
|
|||
|
|
boxes = sample['boxes_3d']
|
|||
|
|
if hasattr(boxes, 'tensor'):
|
|||
|
|
num_boxes = boxes.tensor.shape[0]
|
|||
|
|
else:
|
|||
|
|
num_boxes = len(boxes) if hasattr(boxes, '__len__') else 0
|
|||
|
|
sample_stats['total_boxes'] += num_boxes
|
|||
|
|
print(f" 📦 boxes_3d: {num_boxes} 个检测框")
|
|||
|
|
|
|||
|
|
if 'scores_3d' in sample:
|
|||
|
|
sample_stats['has_scores_3d'] += 1
|
|||
|
|
scores = sample['scores_3d']
|
|||
|
|
if hasattr(scores, '__len__') and len(scores) > 0:
|
|||
|
|
score_range = [float(np.min(scores)), float(np.max(scores))]
|
|||
|
|
sample_stats['box_score_ranges'].append(score_range)
|
|||
|
|
print(f" 🎯 scores_3d: 范围 [{score_range[0]:.4f}, {score_range[1]:.4f}]")
|
|||
|
|
if 'labels_3d' in sample:
|
|||
|
|
sample_stats['has_labels_3d'] += 1
|
|||
|
|
labels = sample['labels_3d']
|
|||
|
|
if hasattr(labels, '__len__') and len(labels) > 0:
|
|||
|
|
unique_labels = np.unique(labels)
|
|||
|
|
print(f" 🏷️ labels_3d: {len(unique_labels)} 个类别 {unique_labels}")
|
|||
|
|
|
|||
|
|
# 检查BEV分割结果
|
|||
|
|
if 'masks_bev' in sample:
|
|||
|
|
sample_stats['has_masks_bev'] += 1
|
|||
|
|
masks = sample['masks_bev']
|
|||
|
|
if hasattr(masks, 'shape'):
|
|||
|
|
shape = masks.shape
|
|||
|
|
sample_stats['mask_shapes'].append(shape)
|
|||
|
|
print(f" 🗺️ masks_bev: 形状 {shape}")
|
|||
|
|
print(f" 分割类别数: {shape[0]}, BEV尺寸: {shape[1]}×{shape[2]}")
|
|||
|
|
|
|||
|
|
# 统计每个类别的像素占比
|
|||
|
|
for c in range(min(3, shape[0])): # 只显示前3个类别
|
|||
|
|
if hasattr(masks, 'shape') and len(shape) >= 3:
|
|||
|
|
pixel_count = np.sum(masks[c])
|
|||
|
|
total_pixels = shape[1] * shape[2]
|
|||
|
|
percentage = pixel_count / total_pixels * 100
|
|||
|
|
print(f" 类别{c}: {pixel_count}像素 ({percentage:.2f}%)")
|
|||
|
|
else:
|
|||
|
|
print(f" ⚠️ 意外的样本类型: {type(sample)}")
|
|||
|
|
|
|||
|
|
# 汇总统计
|
|||
|
|
print(f"\n📈 统计汇总 (前{samples_to_analyze}个样本):")
|
|||
|
|
print(f" 📦 包含3D检测框: {sample_stats['has_boxes_3d']}/{samples_to_analyze}")
|
|||
|
|
print(f" 🎯 包含检测分数: {sample_stats['has_scores_3d']}/{samples_to_analyze}")
|
|||
|
|
print(f" 🏷️ 包含检测标签: {sample_stats['has_labels_3d']}/{samples_to_analyze}")
|
|||
|
|
print(f" 🗺️ 包含BEV分割: {sample_stats['has_masks_bev']}/{samples_to_analyze}")
|
|||
|
|
print(f" 📊 总检测框数: {sample_stats['total_boxes']}")
|
|||
|
|
|
|||
|
|
if sample_stats['box_score_ranges']:
|
|||
|
|
all_scores = [r for ranges in sample_stats['box_score_ranges'] for r in ranges]
|
|||
|
|
print(f" 🎯 检测分数范围: [{min(all_scores):.4f}, {max(all_scores):.4f}]")
|
|||
|
|
if sample_stats['mask_shapes']:
|
|||
|
|
shapes = sample_stats['mask_shapes']
|
|||
|
|
print(f" 🔲 BEV分割形状: {shapes[0] if shapes else 'N/A'}")
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
if len(sys.argv) != 2:
|
|||
|
|
print("用法: python INSPECT_FAST_RESULTS.py <results_file>")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
results_file = sys.argv[1]
|
|||
|
|
load_results_sample(results_file)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|