# SAM2 Crack500 评估项目 使用 SAM2(Segment Anything Model 2)在 Crack500 数据集上进行裂缝分割评估。 ## 📋 项目概述 本项目实现了 **方式 1:基于边界框提示(Bounding Box Prompting)** 来评估 SAM2 在混凝土裂缝分割任务上的性能。 ### 核心思路 1. 从 Ground Truth 掩码中提取裂缝区域的边界框(连通域分析) 2. 将边界框作为提示输入 SAM2 模型 3. 评估 SAM2 的分割结果与 GT 的差异 4. 计算多种评估指标(IoU, Dice, F1-Score 等) ## 🏗️ 项目结构 ``` sam_crack/ ├── crack500/ # Crack500 数据集 │ ├── test.txt # 测试集文件列表 │ ├── testcrop/ # 测试图像 │ └── testdata/ # 测试掩码 ├── sam2/ # SAM2 模型库 │ └── checkpoints/ # 模型权重 ├── src/ # 源代码 │ ├── bbox_prompt.py # 边界框提示推理 │ ├── evaluation.py # 评估指标计算 │ └── visualization.py # 可视化工具 ├── results/ # 结果输出 │ └── bbox_prompt/ │ ├── predictions/ # 预测掩码 │ ├── visualizations/ # 可视化图像 │ ├── evaluation_results.csv │ └── evaluation_summary.json ├── run_bbox_evaluation.py # 主运行脚本 └── README.md # 本文件 ``` ## 🚀 快速开始 ### 1. 环境准备 确保已安装 SAM2 和相关依赖: ```bash # 激活 conda 环境 conda activate sam2 # 安装额外依赖 pip install opencv-python scikit-image pandas matplotlib seaborn tqdm ``` ### 2. 下载模型权重 ```bash cd sam2/checkpoints ./download_ckpts.sh cd ../.. ``` 或手动下载: - [sam2.1_hiera_small.pt](https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_small.pt) ### 3. 运行完整评估 ```bash # 运行完整流程(推理 + 评估 + 可视化) python run_bbox_evaluation.py # 或使用自定义参数 python run_bbox_evaluation.py \ --checkpoint ./sam2/checkpoints/sam2.1_hiera_small.pt \ --expand_ratio 0.05 \ --num_vis 20 ``` ### 4. 查看结果 ```bash # 评估结果 cat results/bbox_prompt/evaluation_summary.json # 可视化图像 ls results/bbox_prompt/visualizations/ ``` ## 🧩 TaskRunner 工作流 项目已经迁移到任务编排模式,`run_bbox_evaluation.py` / `run_point_evaluation.py` 会在内部构建 `TaskRunner`: - **边界框评估**(推理 + 评估 + 可视化) ```bash python run_bbox_evaluation.py --data_root ./crack500 --test_file ./crack500/test.txt \ --expand_ratio 0.05 --output_dir ./results/bbox_prompt ``` - **点提示多实验**(默认对 1/3/5 点进行评估,可通过 `--point_configs` / `--per_component` 调整) ```bash python run_point_evaluation.py --data_root ./crack500 --test_file ./crack500/test.txt \ --point_configs 1 3 5 --per_component ``` - **直接运行 TOML 任务**:在 `tasks/` 目录提供了 `bbox_eval.toml`、`point_eval.toml` 模板,可按需修改数据路径或 `extra_params` 然后执行 ```bash python -m src.tasks.run_task --task_file tasks/bbox_eval.toml ``` 所有任务都会依赖 `ConfigRegistry` 中的配置(默认 `sam2_bbox_prompt`),如需自定义数据集位置或提示模式,可在 CLI 中通过参数覆盖,或在 TOML 的 `[task.dataset_overrides]` / `[task.dataset_overrides.extra_params]` 区域修改。 ## 📊 评估指标 本项目计算以下评估指标: | 指标 | 说明 | | ---------------- | ---------------------------------------- | | **IoU** | Intersection over Union,交并比 | | **Dice** | Dice 系数,医学图像常用指标 | | **Precision** | 精确率,预测为正的样本中真正为正的比例 | | **Recall** | 召回率,真实为正的样本中被正确预测的比例 | | **F1-Score** | Precision 和 Recall 的调和平均 | | **Skeleton IoU** | 骨架 IoU,针对细长裂缝的特殊指标 | ## 🎯 命令行参数 ```bash python run_bbox_evaluation.py --help ``` ### 主要参数 | 参数 | 默认值 | 说明 | | ---------------- | ------------------------------------------ | -------------------- | | `--data_root` | `./crack500` | 数据集根目录 | | `--test_file` | `./crack500/test.txt` | 测试集文件 | | `--checkpoint` | `./sam2/checkpoints/sam2.1_hiera_small.pt` | 模型权重路径 | | `--model_cfg` | `sam2.1_hiera_s.yaml` | 模型配置文件 | | `--output_dir` | `./results/bbox_prompt` | 输出目录 | | `--expand_ratio` | `0.05` | 边界框扩展比例(5%) | | `--num_vis` | `20` | 可视化样本数量 | | `--vis_all` | `False` | 是否可视化所有样本 | ### 流程控制参数 | 参数 | 说明 | | ---------------------- | ---------------------------- | | `--skip_inference` | 跳过推理步骤(使用已有预测) | | `--skip_evaluation` | 跳过评估步骤 | | `--skip_visualization` | 跳过可视化步骤 | ### 使用示例 ```bash # 只运行推理 python run_bbox_evaluation.py --skip_evaluation --skip_visualization # 只运行评估(假设已有预测结果) python run_bbox_evaluation.py --skip_inference --skip_visualization # 使用不同的边界框扩展比例 python run_bbox_evaluation.py --expand_ratio 0.1 # 可视化所有样本 python run_bbox_evaluation.py --skip_inference --skip_evaluation --vis_all ``` ## 📈 结果示例 ### 评估结果统计 ``` ============================================================ 评估结果统计: ============================================================ IoU : 0.7234 ± 0.1456 Dice : 0.8123 ± 0.1234 Precision : 0.8456 ± 0.1123 Recall : 0.7890 ± 0.1345 F1-Score : 0.8156 ± 0.1234 Skeleton IoU : 0.6789 ± 0.1567 ============================================================ ``` ### 可视化说明 生成的可视化图像包含 4 个子图: 1. **Original Image**: 原始图像 2. **Ground Truth**: 真实掩码 3. **Prediction**: SAM2 预测掩码 4. **Overlay Visualization**: 叠加可视化 - 🟡 黄色:True Positive(正确预测) - 🟢 绿色:False Negative(漏检) - 🔴 红色:False Positive(误检) ## 🔧 模块说明 ### 1. bbox_prompt.py 边界框提示推理模块,核心功能: - `extract_bboxes_from_mask()`: 从 GT 掩码提取边界框 - `predict_with_bbox_prompt()`: 使用边界框提示进行 SAM2 预测 - `process_test_set()`: 批量处理测试集 ### 2. evaluation.py 评估指标计算模块,核心功能: - `compute_iou()`: 计算 IoU - `compute_dice()`: 计算 Dice 系数 - `compute_precision_recall()`: 计算 Precision 和 Recall - `compute_skeleton_iou()`: 计算骨架 IoU - `evaluate_test_set()`: 批量评估测试集 ### 3. visualization.py 可视化模块,核心功能: - `create_overlay_visualization()`: 创建叠加可视化 - `create_comparison_figure()`: 创建对比图 - `visualize_test_set()`: 批量可视化测试集 - `create_metrics_distribution_plot()`: 创建指标分布图 ## 🔬 技术细节 ### 边界框生成策略 1. 使用 `cv2.connectedComponentsWithStats()` 进行连通域分析 2. 为每个连通域计算最小外接矩形 3. 可选:扩展边界框 N% 模拟不精确标注 4. 过滤面积小于阈值的噪声区域 ### SAM2 推理流程 ```python # 1. 设置图像 predictor.set_image(image) # 2. 使用边界框提示预测 masks, scores, logits = predictor.predict( box=bbox, multimask_output=False ) # 3. 合并多个边界框的预测结果 combined_mask = np.logical_or(mask1, mask2, ...) ``` ## 📝 注意事项 1. **GPU 内存**: 推荐使用至少 8GB 显存的 GPU 2. **模型选择**: - `sam2.1_hiera_tiny`: 最快,精度较低 - `sam2.1_hiera_small`: 平衡速度和精度(推荐) - `sam2.1_hiera_large`: 最高精度,速度较慢 3. **边界框扩展**: - 0%: 严格边界框 - 5%: 轻微扩展(推荐) - 10%: 较大扩展,模拟粗略标注 ## 🐛 常见问题 ### Q1: 模型加载失败 ```bash # 检查模型文件是否存在 ls -lh sam2/checkpoints/ # 重新下载模型 cd sam2/checkpoints && ./download_ckpts.sh ``` ### Q2: CUDA 内存不足 ```python # 使用更小的模型 --checkpoint ./sam2/checkpoints/sam2.1_hiera_tiny.pt --model_cfg sam2.1_hiera_t.yaml ``` ### Q3: 导入错误 ```bash # 确保 SAM2 已正确安装 cd sam2 pip install -e . ``` ## 📚 参考资料 - [SAM2 官方仓库](https://github.com/facebookresearch/sam2) - [SAM2 论文](https://arxiv.org/abs/2408.00714) - [Crack500 数据集](https://github.com/fyangneil/pavement-crack-detection) ## 📄 许可证 本项目遵循 MIT 许可证。SAM2 模型遵循 Apache 2.0 许可证。 ## 🙏 致谢 - Meta AI 的 SAM2 团队 - Crack500 数据集作者