sam_crack/README.md
2025-12-24 13:43:34 +08:00

303 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SAM2 Crack500 评估项目
使用 SAM2Segment 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 数据集作者