File size: 6,130 Bytes
ece7754 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | # MVTec LOCO 前景分割工具
**[中文版 README](README_CN.md)** | **[English README](README.md)**
本工具使用 U²-Net 为 MVTec LOCO 异常检测数据集生成二值前景掩码。
## 概述
`mvtec_loco_fg_segmentation.py` 脚本处理整个 MVTec LOCO 数据集,为所有图像生成二值前景掩码。它使用 U²-Net 模型执行显著性目标检测,并将概率图转换为二值掩码。
## 功能特点
- **完整数据集处理**:处理所有类别(breakfast_box, screw_bag, juice_bottle, splicing_connectors, pushpins)
- **灵活的结构支持**:处理 test 和 train 分割中的所有子目录(good, logical_anomalies, structural_anomalies)
- **二值掩码输出**:生成标准的二值掩码(0/255),使用 L 模式(灰度)
- **参数可配置**:可自定义阈值、类别、分割和处理选项
- **GPU/CPU 支持**:自动检测并利用可用硬件
## 环境要求
### 环境设置
```bash
# 创建 conda 环境
conda create -n u2net python=3.8 -y
conda activate u2net
# 安装依赖
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 --index-url https://download.pytorch.org/whl/cu116
pip install opencv-python scikit-image matplotlib numpy pillow
```
### 模型权重
下载 U²-Net 模型权重并放置到正确目录:
- 从 [GoogleDrive](https://drive.google.com/file/d/1ao1ovG1Qtx4b7EoskHXmi2E9rp5CHLcZ/view) 下载 `u2net.pth`(176.3 MB)
- 放置到:`./saved_models/u2net/u2net.pth`
### 数据集结构
确保您的 MVTec LOCO 数据集遵循以下结构:
```
mvtec_loco_anomaly_detection/
├── breakfast_box/
│ ├── test/
│ │ ├── good/
│ │ ├── logical_anomalies/
│ │ └── structural_anomalies/
│ └── train/
│ └── good/
├── screw_bag/
│ ├── test/
│ └── train/
└── ... (其他类别)
```
## 使用方法
### 基本用法
```bash
# 使用默认设置处理整个数据集
python mvtec_loco_fg_segmentation.py
# 显示帮助信息
python mvtec_loco_fg_segmentation.py -h
```
### 高级用法
```bash
# 指定自定义数据集和模型路径
python mvtec_loco_fg_segmentation.py \
--dataset_path /path/to/mvtec_loco \
--model_path /path/to/u2net.pth
# 仅处理特定类别
python mvtec_loco_fg_segmentation.py \
--categories breakfast_box juice_bottle
# 仅处理测试集
python mvtec_loco_fg_segmentation.py \
--splits test
# 使用不同的二值化阈值
python mvtec_loco_fg_segmentation.py \
--threshold 0.3
# 自定义输出目录名称
python mvtec_loco_fg_segmentation.py \
--output_dir custom_masks
# 使用多进程优化处理速度
python mvtec_loco_fg_segmentation.py \
--num_workers 4 \
--batch_size 4
```
## 命令行参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `--dataset_path` | str | `/root/hy-data/datasets/mvtec_loco_anomaly_detection` | MVTec LOCO 数据集根目录路径 |
| `--model_path` | str | `./saved_models/u2net/u2net.pth` | U2NET 模型权重文件路径 |
| `--output_dir` | str | `fg_mask` | 生成掩码的输出目录名称 |
| `--threshold` | float | `0.5` | 二值掩码生成阈值 |
| `--categories` | list | `所有5个类别` | 要处理的类别 |
| `--splits` | list | `['test', 'train']` | 要处理的数据集分割 |
| `--batch_size` | int | `1` | 处理批次大小 |
| `--num_workers` | int | `1` | 数据加载工作进程数 |
## 输出结构
脚本生成以下结构的掩码:
```
mvtec_loco_anomaly_detection/
├── fg_mask/ # 生成的掩码目录
│ ├── breakfast_box/
│ │ ├── test/
│ │ │ ├── good/
│ │ │ │ ├── 000.png # 二值掩码(0/255 值)
│ │ │ │ ├── 001.png
│ │ │ │ └── ...
│ │ │ ├── logical_anomalies/
│ │ │ └── structural_anomalies/
│ │ └── train/
│ │ └── good/
│ └── ... (其他类别)
└── ... (原始数据集)
```
## 掩码属性
- **格式**:PNG 图像
- **模式**:L(灰度,单通道)
- **值**:二值(背景为0,前景为255)
- **尺寸**:与原始图像相同
- **阈值**:可配置(默认0.5)
## 性能说明
- **推荐GPU**:使用支持CUDA的GPU处理速度显著更快
- **内存使用**:每张图像在处理期间需要约200MB GPU内存
- **处理时间**:现代GPU上每张图像约2-3秒
- **总图像数**:完整数据集中约5000+张图像
## 故障排除
### 常见问题
1. **CUDA内存不足**:减少批次大小或使用CPU处理
2. **找不到模型**:确保u2net.pth在正确目录中
3. **数据集路径错误**:验证MVTec LOCO数据集结构
4. **权限错误**:检查输出目录的写入权限
### 错误信息
- `ERROR: Dataset path not found`:检查数据集路径和提取情况
- `ERROR: Model path not found`:正确下载并放置u2net.pth
- `ERROR: Invalid categories`:使用有效的类别名称
## 示例输出
脚本提供详细的进度信息:
```
配置信息:
数据集路径: /root/hy-data/datasets/mvtec_loco_anomaly_detection
模型路径: ./saved_models/u2net/u2net.pth
输出目录: fg_mask
二值化阈值: 0.5
类别: ['breakfast_box', 'screw_bag', 'juice_bottle', 'splicing_connectors', 'pushpins']
分割: ['test', 'train']
...加载 U2NET---
处理类别: breakfast_box
处理 breakfast_box/test/good
找到 102 张图像
处理 1/102: 000.png
处理 20/102: 019.png
...
```
## 引用
如果您在研究中使用此工具,请引用原始的 U²-Net 论文:
```bibtex
@InProceedings{Qin_2020_PR,
title = {U2-Net: Going Deeper with Nested U-Structure for Salient Object Detection},
author = {Qin, Xuebin and Zhang, Zichen and Huang, Chenyang and Dehghan, Masood and Zaiane, Osmar and Jagersand, Martin},
journal = {Pattern Recognition},
volume = {106},
pages = {107404},
year = {2020}
}
```
## 许可证
本工具扩展了原始 U²-Net 实现。请参考原始仓库的许可证信息。 |