# deeplearning **Repository Path**: jinghenggao/deeplearning ## Basic Information - **Project Name**: deeplearning - **Description**: 南开大学 深度学习课程 课程大作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-13 - **Last Updated**: 2026-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ECSSD 显著性目标检测实验 本仓库包含四路方法:`poolnet/`、`EGNet/`、`EGNetSCR/` 和 `cpsnet/`。数据集统一放在 `dataset/ECSSD/`,评测统一使用 SalMetric 风格的 `Max F-measure` 和 `MAE`。 ## 环境 ```powershell Set-ExecutionPolicy -Scope Process Bypass .\setup_windows_conda.ps1 conda activate ecssd cd D:\nankai\deeplearning\final ``` ## 数据划分 ```powershell .\poolnet\scripts\make_ecssd_split.ps1 ``` 生成固定 `seed42` 划分: ```text dataset/ECSSD/splits/seed42/train.txt dataset/ECSSD/splits/seed42/test.txt dataset/ECSSD/splits/seed42/train_dev.txt dataset/ECSSD/splits/seed42/val_dev.txt ``` ## 共享基础权重 四路方法的当前复现入口统一使用 ResNet-18 ImageNet 初始化权重: ```text weights/resnet18_imagenet.pth ``` 若文件缺失,下载 `https://download.pytorch.org/models/resnet18-f37072fd.pth` 后按上述文件名保存。 ## PoolNet ```powershell .\poolnet\scripts\train_poolnet_res18_ecssd.ps1 full .\poolnet\scripts\test_poolnet_res18_ecssd.ps1 .\poolnet\scripts\eval_ecssd_salmetric.ps1 ``` 结果文件: ```text poolnet/results/poolnet_res18_ecssd_metrics.txt ``` ## EGNet 当前本地 EGNet 使用 ResNet-18 复现版本,初始化权重为: ```text weights/resnet18_imagenet.pth ``` 训练、测试和评测: ```powershell python -B EGNet\run.py ` --mode train ` --train_root dataset\ECSSD ` --train_list dataset\ECSSD\splits\seed42\train.txt ` --save_fold EGNet\results\egnet_train ` --epoch 30 ` --batch_size 1 ` --num_thread 0 python -B EGNet\run.py ` --mode test ` --sal_mode e ` --test_mode 1 ` --model EGNet\results\egnet_train\run-nnet\models\final_bone.pth ` --num_thread 0 .\EGNet\scripts\eval_egnet_ecssd_salmetric.ps1 ``` 结果文件: ```text EGNet/results/egnet_ecssd_metrics.txt ``` ## EGNet-SCR `EGNetSCR/` 是在 EGNet 思路上做的独立增强版本,和原始 `EGNet/` 分开维护,不再修改原目录代码。当前版本命名为 EGNet-SCR,核心是 structure-consistent refinement: - context-edge residual refinement head - weighted BCE + weighted IoU structure loss - base-final structure supervision and refine stability loss - saliency-edge consistency 与 hflip consistency - hflip test-time averaging; agreement gate remains available for ablation - 固定随机种子与可复现实验脚本 初始化权重放在: ```text weights/resnet18_imagenet.pth ``` 完整复现: ```powershell .\EGNetSCR\scripts\reproduce_egnet_scr_ecssd.ps1 ``` 或分开运行: ```powershell .\EGNetSCR\scripts\train_egnet_scr_ecssd.ps1 .\EGNetSCR\scripts\test_egnet_scr_ecssd.ps1 .\EGNetSCR\scripts\eval_egnet_scr_ecssd_salmetric.ps1 ``` 结果文件: ```text EGNetSCR/results/egnet_scr_res18_ecssd_metrics.txt ``` ## CPSNet `cpsnet/` 是本仓库新建的主线方法: ```text ResNet-18 encoder + FPN decoder + foreground/background prototype refinement + uncertainty weighted loss + boundary band weighted loss + reliable prototype thresholds + residual refinement calibration + HFlip TTA + optional PoolNet-style global pooling guidance + optional EGNet-style edge guidance and edge supervision + DPC logit calibration head and calibration L1 loss ``` CPSNet 现在吸收了 PoolNet 和 EGNet 中比较可靠的思想,但不引用它们的训练权重: - PoolNet:用深层全局池化上下文增强主体定位。 - EGNet:用低层边缘分支做辅助监督,并把边缘置信图作为 refinement cue。 - DPC:把主体定位 logits 和最终概率图校准解耦,用可学习 logits calibration head 做实验性概率校准;全量结果未优于 guided 主线。 ResNet-18 初始化权重放在: ```text weights/resnet18_imagenet.pth ``` 运行: ```powershell .\cpsnet\scripts\train_cpsnet_res18_ecssd.ps1 full .\cpsnet\scripts\test_cpsnet_res18_ecssd.ps1 .\cpsnet\scripts\eval_cpsnet_ecssd_salmetric.ps1 ``` 以上默认运行 `guided` 变体,也就是 PoolNet-style global guidance + EGNet-style edge guidance。复跑旧 CPSNet baseline 或 DPC 实验分支: ```powershell .\cpsnet\scripts\train_cpsnet_res18_ecssd.ps1 full baseline .\cpsnet\scripts\test_cpsnet_res18_ecssd.ps1 "" hflip baseline .\cpsnet\scripts\eval_cpsnet_ecssd_salmetric.ps1 "" "" "" baseline .\cpsnet\scripts\train_cpsnet_res18_ecssd.ps1 full dpc .\cpsnet\scripts\test_cpsnet_res18_ecssd.ps1 "" hflip dpc .\cpsnet\scripts\eval_cpsnet_ecssd_salmetric.ps1 "" "" "" dpc ``` 默认测试使用 HFlip TTA、`fg_threshold=0.72`、`bg_threshold=0.32`。主线 guided 使用 `refine_scale=1.5`,DPC 显式运行时使用模型自身的 `prediction_logits`。若要单次前向测试: ```powershell .\cpsnet\scripts\test_cpsnet_res18_ecssd.ps1 "" single ``` 结果文件: ```text cpsnet/results/cpsnet_res18_ecssd_pool_edge_tta_hflip_metrics.txt ``` ## 当前结果 ECSSD `seed42` 测试集结果: | Method | Max F-measure | MAE | | ------------------------ | ------------: | ---------: | | PoolNet-ResNet18 | 0.8619241 | 0.07858574 | | EGNet-ResNet18 | 0.8889621 | 0.06815438 | | EGNet-SCR-ResNet18 | 0.8979639 | 0.05943531 | | CPSNet-ResNet18 | 0.871875 | 0.08209577 | EGNet-SCR 当前记录来自 `EGNetSCR/results/egnet_scr_res18_ecssd_metrics.txt`,对应 ResNet-18、hflip averaging 和 `edge_blend=0.10` 的默认测试设置。`CPSNet-PoolEdge guided` 相比旧 CPSNet 提升了 Max F-measure,但 MAE 变差,说明融合分支让最佳阈值下的主体分割更强,但整体概率图的像素级误差更高。DPC-CPSNet 的全量实验没有解决这个校准问题,MAE 进一步变差,因此当前默认主线保留 guided。 CPSNet 的完整试错记录、失败分支代码和历史指标保存在: ```text cpsnet_development_history/ ``` ## 可视化分析 根目录提供 `matplotlib` 可视化脚本,默认比较 PoolNet、EGNet 和当前主线 CPSNet;如需加入 `EGNetSCR`,可按相同格式在脚本中补一条结果路径: ```powershell python -B visualize_salmetric_results.py ``` 输出: ```text salmetric_visual_analysis.png ``` 主线 CPSNet 的误差样例图和拆解数据: ```text cpsnet/results/cpsnet_hflip_failure_examples.png cpsnet/results/cpsnet_hflip_error_breakdown.json ```