论文:SegAN: Adversarial Network with Multi-scaleL1Loss for MedicalImage Segmentation
代码:https://github.com/YuanXue1993/SegAN
数据集: BRATS 2013 、BRATS 2015; 2.5D的网络
作者提出用对抗网络进行分割,损失函数使用多尺度L1损失函数。该论文的判别器和生成器分别为critic network (C)和segmentor network (S)。
首先介绍一下SegAN与原始的GAN的区别。
- 损失函数的区别。经典的GAN的generator和discriminator的损失是分开的。本论文为segmentor和critic networks提出一个多尺度损失函数。Critic考虑分割结果和真实label多尺度的特征差异来最大化多尺度L1函数。
- 我们的segmentor S是全卷积网络,仅对通过critic的梯度进行训练,其目的是最小化与critic一样的损失函数。
- SegAN是端对端的,不需要多分辨率的网络输入。
网络结构

整个网络分为segmentor和critic两部分:
1、segmentor部分为类似unet的u型网络,,encoder部分为4层stride=2的卷积,decoder部分为4层upsample,输出为网络预测的肿瘤二值图像;
2、critic有两个输入,一个是原图和分割网络预测结果mask之后的图,另一个是原图和label进行mask之后的原图。(mask表示相乘)。
部分的网络共用segmentor部分encoder的前三层,分别向critic部分输入经预测的肿瘤二值图掩膜的原始输入图像,以及经真值肿瘤二值图掩膜的原始输入图像,最后的loss计算两个不同输出之间的MAE值(L1 loss)。其中Multi-scale体现在对critic部分每一个卷积层输出的特征图像都计算MAE值,最后的总loss取平均。
3、训练方式类似于GAN的min-max对抗学习过程。首先,固定S(segmentor),对C(critic)进行一轮训练;再固定C(critic),对S(segmentor)进行一轮训练,如此反复。对 critic 的训练想使loss变大(min),对 segmentor 训练想使loss变小(max)。
其多尺度目标函数 如下式所示:

表示训练图像个数,
表示训练集的图片,
表示相应的 Ground Truth,
是平均绝对误差 (MAE) 或者L1距离,
是分割预测标签映射对输入的图像进行掩膜(mask——即,预测的标签图和原始图像的逐像素乘法),
是真实标签对输入的图像进行掩膜(mask)。
,表示
j批判网络对输入的分层特征的提取。具体的
如下

L表示C网络总共的层的个数。 表示从
提取的第
层的特征。
代码调试
代码简洁,默认的数据集为 ISIC,不是BRATS,只有train,val 没有 test。
- 把 num_workers 改为 0
- train.py
parser.add_argument('--cuda', action='store_true',help='using GPU or not')
加上 default=True
属性,或者运行时输入 python train.py --cuda
action='store_true'
,默认为Flase
,只要运行时该变量有传参就可将该变量设为True
-
TypeError: conv2d(): argument 'padding' must be tuple of ints, but found element of type float at pos 1
python 版本不同,导致出现RuntimeError: argument must tuple
将net.py
line 14,15,/
改成//
。 -
output_masked[:,d,:,:] = input_mask[:,d,:,:].unsqueeze(1)* output
将train.py line 123
等行改为output_masked[:,d,:,:] = input_mask[:,d,:,:]* (output.squeeze(1))
参考链接:SegAN:Adversarial Network with Multi-scale L1 Loss for Medical Image Segmentation-笔记
[论文笔记] SegAN: Adversarial Network with Multi-scale L1 Loss for Medical Image Segmentation
SegAN——蠢的一匹的个人翻译
GAN Loss可以应用在语义分割上来提升性能吗?
【python】argparse.add_argument中的action为‘store_true’使用说明
网友评论