# Seg 图像分割项目使用说明

本项目是一个多路线图像分割实验与推理工程，包含自研 `segmentation_models_pytorch` 训练流程、YOLO 分割流程、MMSegmentation 流程，以及数据预处理、视频抽帧、图片叠加和结果分析工具。

## 1. 项目结构

| 路径 | 用途 |
| --- | --- |
| `Seg_All_In_One_SegModel/` | 基于 `segmentation_models_pytorch` 的语义分割训练、推理、参数量/FLOPs/FPS 统计和输出完整性检查。 |
| `Seg_All_In_One_YoloModel/` | 基于 Ultralytics YOLO 的实例/语义分割训练、推理、热力图可视化和横向对比。 |
| `Seg_All_In_One_MMSeg/` | 基于 OpenMMLab MMSegmentation 的模型配置、训练和结果汇总流程。 |
| `Seg_All_In_One_Analysis/` | 汇总不同模型的指标、FLOPs、FPS，生成表格和 mIoU/FPS 图。 |
| `DataSet_Own/1. 图片预处理（内含使用手册）/` | 自有数据的重命名、尺寸统一、图像/标签配对、标签重建、叠加和拼接检查。 |
| `Seg_Predict_Own_Video_V2/` | 将视频按固定间隔抽帧，转换为 `DataSet_Public/<dataset>/images/val` 格式。 |
| `Tool-图片堆叠/` | 快速检查原图和标签是否匹配，并生成透明叠加图。 |
| `Tool-可视化/` | YOLO 标签生成、热图、FPS 等可视化辅助脚本。 |
| `Back_Up.sh` | 将算法目录同步到 `Hardisk/` 和 `Nas_BackUp_Seg/` 的本地/NAS 备份脚本。 |

大体量目录如 `DataSet_Public/`、`DataSet_Own/` 中的数据、`BestMode_Predict_Results_DataSet_Public/`、`Hardisk/`、`Nas_BackUp_Seg/`、模型权重和训练产物不进入 Git。

## 2. Conda 环境

推荐使用独立环境 `seg_smp`。本机已有可运行的 `SMP` 环境时，最快方式是克隆它：

```bash
conda create --name seg_smp --clone SMP -y
conda activate seg_smp
python -V
python -c "import torch; print(torch.cuda.is_available(), torch.__version__)"
```

从零安装时可参考：

```bash
conda create -n seg_smp python=3.9 -y
conda activate seg_smp

pip install torch==2.8.0+cu129 torchvision==0.23.0+cu129 --index-url https://download.pytorch.org/whl/cu129
pip install -r requirements-seg_smp.txt

cd Seg_All_In_One_MMSeg
pip install -v -e .
cd ..
```

如果使用批量脚本，默认会激活 `seg_smp`。如需临时使用旧环境：

```bash
SEG_CONDA_ENV=SMP bash yolo_train.sh
```

环境验证：

```bash
conda run -n seg_smp python -c "import torch, segmentation_models_pytorch, ultralytics, mmcv, mmengine, mmseg, cv2, albumentations; print('ok')"
```

## 3. 数据约定

SegModel 默认读取：

```text
DataSet_Public/<dataset>/
  images/train
  images/val
  labels_GT/train
  labels_GT/val
```

YOLO 默认读取：

```text
DataSet_Public/<dataset>/
  images/train
  images/val
  labels/train
  labels/val
```

切换数据集时：

- SegModel：修改 `Seg_All_In_One_SegModel/config.py` 中的 `DATA_DIR`、`OUTPUTS_DIR`、`PREDICT_BEST_MODEL_DIR`、类别和图像尺寸。
- YOLO：修改 `Seg_All_In_One_YoloModel/dataset.yaml` 中的 `path`、`train`、`val`、`test`、`names`；必要时修改 `yolo_config.py` 的训练参数。
- MMSeg：按 `Seg_All_In_One_MMSeg/※使用手册/※2025_9_23_MMSeg使用手册` 生成数据集和算法配置。

## 4. SegModel 使用方式

```bash
cd Seg_All_In_One_SegModel
conda activate seg_smp

# 单模型训练
CUDA_VISIBLE_DEVICES=0 python train.py -a Unet

# 批量训练
bash train.sh

# 单模型推理
CUDA_VISIBLE_DEVICES=0 python 1_predict.py -a Unet

# 批量推理
bash predict.sh

# 参数量、FLOPs、FPS
CUDA_VISIBLE_DEVICES=0 python 2_predict_params_and_FLOPs_V2.py

# 检查预测 raw mask 是否齐全
python 1_predict_raw_masks_check.py
```

可选模型包括：

```text
Unet, UnetPlusPlus, FPN, PSPNet, DeepLabV3, DeepLabV3Plus,
Linknet, MAnet, PAN, UPerNet, Segformer, DPT
```

训练结果先写入 `DataSet_Public_outputs/<dataset>_outputs-SegModel/`，脚本结束后会移动到 `Hardisk/`；推理结果写入 `BestMode_Predict_Results_DataSet_Public/<dataset>_outputs-SegModel/`。

## 5. YOLO 使用方式

```bash
cd Seg_All_In_One_YoloModel
conda activate seg_smp

# 检查当前 dataset.yaml 解析出的路径
python yolo_config.py

# 单模型训练
CUDA_VISIBLE_DEVICES=0 python yolo_train.py --model "YOLOv8n-seg"

# 批量训练
bash yolo_train.sh

# 复制最佳权重到预测目录
bash ./Tool_Yolo_Copy_Best_Model.sh --pt_name "best.pt"

# 单模型推理
CUDA_VISIBLE_DEVICES=0 python yolo_predict_V2.py --model "YOLOv8n-seg" --conf 0.2 --pt_name "best.pt"

# 批量推理
bash yolo_predict.sh --conf 0.2 --pt_name "best.pt"

# 批量热图
bash yolo_predict.sh --heatmap_method "All" --pt_name "best.pt"

# 横向对比
python yolo_predict_V2_compare_all.py --pt_name "all"

# 检查预测 raw mask 是否齐全
python yolo_predict_raw_masks_check.py --pt_name "best.pt"
```

常用模型包括：

```text
YOLOv8n-seg, YOLOv8s-seg, YOLOv8m-seg, YOLOv8l-seg, YOLOv8x-seg,
YOLOv9c-seg, YOLOv9e-seg,
YOLO11n-seg, YOLO11s-seg, YOLO11m-seg, YOLO11l-seg, YOLO11x-seg,
YOLO12-seg
```

## 6. MMSeg 使用方式

```bash
cd Seg_All_In_One_MMSeg
conda activate seg_smp

# 首次或新增模块后注册工程
pip install -v -e .

# 下载/保存必要预训练权重
python My_All_In_One/0_Initial_Save_All_Model_locally.py

# 生成数据配置
python My_All_In_One/1_Initial_Data_All_data_from_1_Data_Parameter-V2.py

# 生成算法配置
python My_All_In_One/2_Initial_Alg_All_data_from_2_Alg_Program-V2.py

# 参数量、FLOPs、FPS
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_1_predict_params_FLOPs_FPS_V2.py

# 指标汇总
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_2_predict_matrics_from_log_V2.py

# 生成预测图和表格
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_3_predict_draw_pictures_and_tabels.py

# 提取 loss 和 best mIoU
CUDA_VISIBLE_DEVICES=0 python My_All_In_One/4_4_extract_loss_and_best_miou.py
```

MMSeg 对 `mmcv/mmengine/mmsegmentation` 版本较敏感；若遇到 `mmcv` CUDA 算子或版本错误，优先参考 MMSeg 使用手册中的安装记录。

## 7. 数据预处理与视频抽帧

自有图片预处理：

```bash
cd "DataSet_Own/1. 图片预处理（内含使用手册）"

bash 1_rename_pics.sh -i <ori_image_directory> -l <ori_label_directory>
bash 2_reformate_pics.sh -i <ori_image_directory> -l <ori_label_directory> -w 1920 -h 1080
bash 3_pair_ori_label.sh -i <ori_image_directory> -l <ori_label_directory>
bash 4_rebuild_labels.sh -l <ori_label_directory>
bash 5_TOOL_stack_pics.sh -i <ori_image_directory> -l <ori_label_directory> -r <stack_result_directory> -a 0.3
bash 6_TOOL_stitch_pics.sh -i <ori_image_directory> -l <ori_label_directory> -r <stitch_result_directory>
```

视频抽帧：

```bash
cd Seg_Predict_Own_Video_V2
python 1_Save_Frame_V2.py \
  --video ./LC_Video_1.mp4 \
  --resize "1920x1080" \
  --output_dir "../DataSet_Public/5_Predict_Video" \
  --interval 0.5
```

输出路径为：

```text
DataSet_Public/5_Predict_Video/<video_name>/images/val
```

图片叠加检查：

```bash
cd Tool-图片堆叠
python 1_check_picture_pair.py -i ./ori -l ./label
bash 2_TOOL_stack_pics.sh -i ./ori -l ./label -r ./result_0.3透明度 -a 0.3 -s _label
```

## 8. 结果分析

```bash
cd Seg_All_In_One_Analysis
conda activate seg_smp

python 1_Analysis_All.py \
  --input_dir ../BestMode_Predict_Results_DataSet_Public \
  --output_dir ./
```

脚本会交互选择数据集，合并 SegModel/MMSeg 的指标和速度数据，并生成 CSV、PNG、SVG 等分析结果。

## 9. 备份与 Git

本仓库只提交程序和轻量配置。以下内容不进入 Git：

- 数据集：`DataSet_Public/`、除预处理脚本外的 `DataSet_Own/`
- 训练和预测产物：`DataSet_Public_outputs/`、`BestMode_Predict_Results_DataSet_Public/`、`Hardisk/`、`Nas_BackUp_Seg/`
- 大权重和视频：`*.pt`、`*.pth`、`*.onnx`、`*.mp4`
- Python/构建缓存：`__pycache__/`、`.pytest_cache/`、`build/`、`dist/`

常用 Git 检查：

```bash
git status --short
git ls-files | grep -E '\\.(pt|pth|mp4|zip)$|DataSet_Public|Hardisk|BestMode' || true
```

