当前项目的现役主路径已经收缩为一个纯净的超声分割全监督基线。
现在真实生效的模型与训练链路只有一条:
输入图像 -> 纯 SwinV2 编码器 -> 纯分割解码器 -> 分割头 -> seg_logits -> 分割损失
当前主路径已经满足以下要求:
aux_loss这份文档只描述当前真实主链,不再记录历史结构语义。
X_SSL_Net 当前可以理解为:
一个面向超声图像分割的纯单头 2D segmentation baseline,主干为 SwinV2 encoder + segmentation decoder。
训练统一从下面这个入口启动:
tools/train.py
它负责:
--set 覆盖参数trainer.train()当前正式 trainer 仍然叫:
SupervisedSegmentationTrainer
但它现在已经只做纯分割训练,不再处理任何边界辅助分支。
当前现役模型是:
SegmentationModel2d
它的内部结构为:
SwinV2Encoder2dSegmentationDecoder2dSegmentationHead2d最终只输出:
seg_logitsX_SSL_Net/
|
|-- tools/
| |-- train.py
| |-- run_us_experiments.sh
| `-- summarize_results.py
|
|-- configs/
| |-- segmentation/
| `-- swinv2/
|
|-- lib/
| |-- trainers/
| |-- modules/
| |-- data/
| `-- tools/
|
`-- tmp/docs/training/
tools/tools/train.py
统一训练启动入口tools/run_us_experiments.sh
纯分割实验脚本tools/summarize_results.py
汇总 best.pth 中的实验结果configs/segmentation/train_sup_us_template.yaml
当前最核心的纯分割训练模板us_exp_sup_busi.yaml
BUSI 示例配置us_exp_sup_busi_ablation.yaml
目前内容已与普通纯分割配置对齐,不再承载边界消融语义lib/trainers/builder.py
trainer 注册与构建base.py
训练公共底座supervised.py
当前纯分割训练流程实现lib/modules/swinv2_encoder_2d.py
纯 SwinV2 编码器封装decoder_2d.py
当前纯分割解码器实现segmentation_2d.py
当前主模型封装build_swinv2.py
SwinV2 backbone 构建器lib/data/builder.py
构建样本索引loaders.py
构建 dataset 与 dataloaderdatasets.py
真正读取 image 和 maskaugment.py
数据增强lib/tools/当前主路径真正会用到的核心工具只有:
loss.py
主分割损失构建metrics.py
Dice / IoU 等验证指标optim.py
optimizer 和 scheduler 构建+----------------------------------------------------------------------------------+
| 当前纯分割训练系统 |
+----------------------------------------------------------------------------------+
| |
| tools/train.py |
| | |
| v |
| 读取 YAML 配置 + 应用 --set 覆盖 |
| | |
| v |
| build_trainer(cfg) |
| | |
| v |
| SupervisedSegmentationTrainer |
| | |
| +------------------- build() -------------------+ |
| | | |
| v v |
| build_dataloader() SegmentationModel2d |
| | | |
| v v |
| SegmentationRecordDataset SwinV2Encoder2d |
| | | |
| v v |
| image, mask batch multi-scale features |
| | |
| v |
| SegmentationDecoder2d |
| | |
| v |
| decoded feature |
| | |
| v |
| SegmentationHead2d |
| | |
| v |
| seg_logits |
| | |
| v |
| seg_loss |
| | |
| v |
| backward + optimizer.step() |
| | |
| v |
| validation / metric / checkpoint |
| |
+----------------------------------------------------------------------------------+
Input Image [B, 3, H, W]
|
v
SwinV2Encoder2d
|
+-- feature_0 (可选 patch_embed 特征)
+-- feature_1
+-- feature_2
+-- feature_3
`-- feature_4
|
v
SegmentationDecoder2d
|
+-- Decode Block 1: deepest + skip_3
+-- Decode Block 2: upsample + skip_2
+-- Decode Block 3: upsample + skip_1
`-- Decode Block 4: upsample + skip_0
|
v
decoded feature
|
v
SegmentationHead2d
|
v
seg_logits
|
v
上采样回输入分辨率
dataset.root
|
v
build_dataset_index(dataset_name, root)
|
v
apply split
|
v
SegmentationRecordDataset
|
+-- 读取 image
+-- 读取 mask
+-- 应用 augmentation
+-- resize image/mask
|
v
DataLoader
|
v
batch = {
image,
mask,
dataset_name,
sample_id,
split,
class_name,
meta
}
[开始]
|
v
执行 tools/train.py --config xxx.yaml --set key=value ...
|
v
parse_args()
|
v
load_yaml_config()
|
v
apply_dotlist_overrides()
|
v
build_trainer(cfg)
|
v
trainer.build()
|
+--> 构建 model
+--> 构建 optimizer
+--> 构建 scheduler
+--> 构建 train loader
+--> 构建 val loader
+--> 恢复 checkpoint(如配置)
`--> 初始化 SwanLab(如启用)
|
v
trainer.train()
|
v
[进入 epoch 循环]
[epoch 开始]
|
v
model.train()
optimizer.zero_grad()
|
v
for batch in train_loader:
|
+--> 取 image, mask
|
+--> model(image)
| |
| `--> seg_logits
|
+--> 计算 seg_loss
|
+--> total_loss = seg_loss
|
+--> backward()
|
+--> 如果到达 accum_steps:
| |
| +--> 可选 gradient clipping
| +--> optimizer.step()
| +--> scaler.update()
| `--> optimizer.zero_grad()
|
`--> 记录 step 日志
|
v
epoch 结束后 scheduler.step()
|
v
如果需要验证:
|
+--> model.eval()
+--> 遍历 val_loader
+--> 统计 val loss
`--> 统计 Dice / IoU
|
v
保存 checkpoint
|
v
判断 early stopping
image
|
v
SegmentationModel2d.forward()
|
+--> features = encoder(image)["features"]
|
+--> decoder_out, _ = decoder(features)
|
`--> seg_logits = segmentation_head(decoder_out, output_size=input_size)
|
v
return {
seg_logits
}
SegmentationModel2d文件:lib/modules/segmentation_2d.py
这是当前主模型封装。
它的职责非常直接:
seg_logits它不再负责:
SwinV2Encoder2d文件:lib/modules/swinv2_encoder_2d.py
职责:
当前主链只使用它的:
featuresSegmentationDecoder2d文件:lib/modules/decoder_2d.py
这是当前纯分割解码器。
每层解码块 SegmentationDecodeBlock2d 的工作方式是:
DecodeRefineBlock2d 做轻量残差细化当前已经没有:
SegmentationHead2d文件:lib/modules/segmentation_2d.py
职责:
最终输出:
seg_logitsSupervisedSegmentationTrainer文件:lib/trainers/supervised.py
虽然类名仍然保留 SegmentationTrainer 字样,但当前内容已经是纯单头分割训练。
build()build() 当前做的事:
SegmentationModel2d_compute_losses()当前 loss 计算已经简化为:
outputs = model(image)
seg_logits = outputs["seg_logits"]
seg_loss = criterion(seg_logits, mask)
total_loss = seg_loss
也就是:
total_loss = seg_loss
train()当前训练循环做的事:
seg_logitsseg_lossSegmentationRecordDataset 返回:
imagemaskdataset_namesample_idsplitclass_namemeta[0, 1]当前 lib/data/builder.py 支持:
BUS-UCLMBUSIBUS-BRABUS_UCCCAUIDDTIOTU_2dTN3KTG3K当前主路径只保留主分割损失。
默认配置示例:
loss:
name: dicece
task_mode: binary
params:
include_background: true
lambda_dice: 0.7
lambda_ce: 0.3
也就是说当前优化目标只围绕 mask 分割本身。
当前验证指标通常为:
diceiou默认配置:
adamw当前仍支持:
torch.autocastGradScalertrainer.namesupervised_segmentationtrain.seedtrain.epochstrain.batch_sizetrain.val_batch_sizetrain.accum_stepstrain.amptrain.grad_clip.enabledmetrics.task_modeloss.namedataset.dataset_namedataset.rootdataset.image_sizedataset.num_classesmodel.model_namemodel.decoder_channelsmodel.use_multiscale_featuresmodel.include_patch_embedoptimizer.lrcheckpoint.monitorcfgimage[B, C, H, W]mask[B, 1, H, W]featuresdecoder_outseg_logitsseg_losstotal_losstotal_loss = seg_lossbest_metricgrad_scaler文件:tools/run_us_experiments.sh
当前脚本只做纯分割实验组织。
支持两种模式:
已经不再支持:
当前项目已经完成主路径净化,可以用下面几句话概括:
SegmentationModel2d。SwinV2Encoder2d + SegmentationDecoder2d + SegmentationHead2d。aux_loss 和相关消融入口。