VLAlert / training /PRETRAIN /test_pretrain_data.py
AsianPlayer's picture
Add VLAlert code
1e05592 verified
Raw
History Blame Contribute Delete
6.3 kB
#!/usr/bin/env python3
"""
测试脚本:验证数据准备流程
"""
import json
import pickle
from pathlib import Path
from collections import Counter
def test_data_preparation():
"""测试数据准备结果"""
print("=" * 60)
print("测试预训练数据准备")
print("=" * 60)
data_file = Path("PROJECT_ROOT/data/dataset/pretrain/train/pretrain_data.pkl")
summary_file = Path("PROJECT_ROOT/data/dataset/pretrain/train/pretrain_summary.json")
# 1. 检查文件存在
print("\n1. 检查文件...")
if not data_file.exists():
print(f"❌ 未找到: {data_file}")
print("请先运行: python prepare_pretrain_data.py")
return False
print(f"✓ 找到数据文件: {data_file}")
if not summary_file.exists():
print(f"⚠️ 未找到统计文件: {summary_file}")
else:
print(f"✓ 找到统计文件: {summary_file}")
# 2. 加载数据
print("\n2. 加载数据...")
with open(data_file, "rb") as f:
data = pickle.load(f)
print(f"✓ 数据加载成功")
# 3. 验证数据结构
print("\n3. 验证数据结构...")
required_splits = ["train", "val", "test"]
for split in required_splits:
if split not in data:
print(f"❌ 缺少split: {split}")
return False
print(f"✓ {split} split存在")
# 4. 统计信息
print("\n4. 数据统计:")
print("-" * 60)
total_stats = {
"train": {"cases": 0, "task1": 0, "task2": 0, "task3": 0},
"val": {"cases": 0, "task1": 0, "task2": 0, "task3": 0},
"test": {"cases": 0, "task1": 0, "task2": 0, "task3": 0}
}
for split in required_splits:
split_data = data[split]
n_cases = split_data.get("total_cases", 0)
n_task1 = len(split_data.get("task1_environment", []))
n_task2 = len(split_data.get("task2_accident_detection", []))
n_task3 = len(split_data.get("task3_sequence_prediction", []))
total_stats[split]["cases"] = n_cases
total_stats[split]["task1"] = n_task1
total_stats[split]["task2"] = n_task2
total_stats[split]["task3"] = n_task3
print(f"\n{split.upper()}:")
print(f" 案例数: {n_cases}")
print(f" 任务1 (环境描述): {n_task1} 样本")
print(f" 任务2 (事故检测): {n_task2} 样本")
print(f" 任务3 (序列预测): {n_task3} 样本")
print(f" 总样本: {n_task1 + n_task2 + n_task3}")
# 5. 数据质量检查
print("\n5. 数据质量检查:")
print("-" * 60)
# 检查train集的样本
train_task1 = data["train"]["task1_environment"][:5]
train_task2 = data["train"]["task2_accident_detection"][:5]
train_task3 = data["train"]["task3_sequence_prediction"][:3]
print("\n任务1样本示例:")
for i, sample in enumerate(train_task1[:2], 1):
print(f" 样本{i}:")
print(f" 图像: {sample['image_path']}")
print(f" 标签: {sample['label']}")
print(f" 来源: {sample['metadata']['dataset']}")
print("\n任务2样本示例:")
for i, sample in enumerate(train_task2[:2], 1):
print(f" 样本{i}:")
print(f" 图像: {sample['image_path']}")
print(f" 标签: {sample['label']}")
print("\n任务3样本示例:")
for i, sample in enumerate(train_task3[:1], 1):
print(f" 样本{i}:")
print(f" 序列长度: {len(sample['image_sequence'])}")
print(f" 首帧: {sample['image_sequence'][0]}")
print(f" 标签: {sample['label'][:80]}...")
# 6. 检查图像路径
print("\n6. 验证图像路径...")
test_paths = []
if train_task1:
test_paths.append(train_task1[0]["image_path"])
if train_task2:
test_paths.append(train_task2[0]["image_path"])
if train_task3:
test_paths.append(train_task3[0]["image_sequence"][0])
all_valid = True
for path in test_paths:
if not Path(path).exists():
print(f"❌ 图像不存在: {path}")
all_valid = False
if all_valid:
print(f"✓ 抽查的 {len(test_paths)} 个图像路径有效")
# 7. 任务分布统计
print("\n7. 任务分布:")
print("-" * 60)
# Task2标签分布
task2_labels = [s["label"] for s in data["train"]["task2_accident_detection"]]
label_counts = Counter(task2_labels)
print(f"\n任务2标签分布:")
for label, count in label_counts.items():
print(f" {label}: {count} ({count/len(task2_labels)*100:.1f}%)")
# Task3事故比例
task3_samples = data["train"]["task3_sequence_prediction"]
accident_count = sum(1 for s in task3_samples if "Accident: Yes" in s["label"])
print(f"\n任务3事故分布:")
print(f" 有事故: {accident_count} ({accident_count/len(task3_samples)*100:.1f}%)")
print(f" 无事故: {len(task3_samples)-accident_count} ({(len(task3_samples)-accident_count)/len(task3_samples)*100:.1f}%)")
# 8. 总结
print("\n" + "=" * 60)
print("测试总结:")
print("=" * 60)
total_samples = sum(
total_stats["train"]["task1"] +
total_stats["train"]["task2"] +
total_stats["train"]["task3"]
for _ in ["train"]
) + sum(
total_stats["val"]["task1"] +
total_stats["val"]["task2"] +
total_stats["val"]["task3"]
for _ in ["val"]
) + sum(
total_stats["test"]["task1"] +
total_stats["test"]["task2"] +
total_stats["test"]["task3"]
for _ in ["test"]
)
print(f"✓ 总案例数: {sum(total_stats[s]['cases'] for s in required_splits)}")
print(f"✓ 总样本数: {total_samples}")
print(f"✓ 数据准备成功!")
return True
if __name__ == "__main__":
success = test_data_preparation()
if success:
print("\n✅ 所有检查通过!可以开始训练。")
print("\n下一步:")
print("1. 使用 pretrain_dataset.py 加载数据")
print("2. 编写VLM微调脚本")
print("3. 开始预训练")
else:
print("\n❌ 检查失败,请修复错误后重试。")