MichaelFan01 / STDC-Seg

Source Code of our CVPR2021 paper "Rethinking BiSeNet For Real-time Semantic Segmentation"
MIT License
709 stars 132 forks source link

关于模型代码的问题 #24

Open Lininggggggg opened 3 years ago

Lininggggggg commented 3 years ago

您好, 您代码里的模型结构是和论文一样的吗?我看了好久对应不起来啊,现在还是理解不了您的网络结构究竟是什么样的。 我只想知道网络的主干部分,对着图4来看,但是感觉您代码里对应部分的代码对照不起来啊。 麻烦您能再简要介绍下您的模型结构吗?

Lininggggggg commented 3 years ago

另外,您论文里提到采用UNet结构,请问您的结构是不是一路下采样,然后最后再直接用插值方法上采样得到和原来输入图大小的输出结果图?

menghd commented 3 years ago

另外,您论文里提到采用UNet结构,请问您的结构是不是一路下采样,然后最后再直接用插值方法上采样得到和原来输入图大小的输出结果图?

代作者回一下,正好在reproduce,是可以对应上的,一个是整体图就是含Laplace卷积的图,你可以先去看一下bisenet的结构图就更好理解了,还有一个小图有不同channel数concat的那张,作者是改进了里面的stage:stdc还有就是对detail guidance进行了设计,ushape应该是指bisenet最后的几层不同特征层的拼接

menghd commented 3 years ago

您好, 您代码里的模型结构是和论文一样的吗?我看了好久对应不起来啊,现在还是理解不了您的网络结构究竟是什么样的。 我只想知道网络的主干部分,对着图4来看,但是感觉您代码里对应部分的代码对照不起来啊。 麻烦您能再简要介绍下您的模型结构吗?

stdcnet.py中的两个bottleneck类对应stdc-architecture.png(作者最终用的是cat那个好像),两个stdcnet类是对应stdcseg-architecture.png是对应里左边的5个stage,model_stages.py里面的arm和ffm,bisenet等类就是context info的搭建,图中右边detail loss拉普拉斯卷积的guidance那些则是在loss文件夹下,train.py则是组装成完整的stdcseg-architecture.png

MichaelFan01 commented 3 years ago

您好, 您代码里的模型结构是和论文一样的吗?我看了好久对应不起来啊,现在还是理解不了您的网络结构究竟是什么样的。 我只想知道网络的主干部分,对着图4来看,但是感觉您代码里对应部分的代码对照不起来啊。 麻烦您能再简要介绍下您的模型结构吗?

stdcnet.py中的两个bottleneck类对应stdc-architecture.png(作者最终用的是cat那个好像),两个stdcnet类是对应stdcseg-architecture.png是对应里左边的5个stage,model_stages.py里面的arm和ffm,bisenet等类就是context info的搭建,图中右边detail loss拉普拉斯卷积的guidance那些则是在loss文件夹下,train.py则是组装成完整的stdcseg-architecture.png

赞,解释的很到位~

Lininggggggg commented 3 years ago

您好,重新看了好一会还是有些不懂 image 截图中红色框图实现是ContextPath中的backbone函数吗? 蓝色框的实现则是ContextPath的实现吗?

Lininggggggg commented 3 years ago

如果是的话,那下图中三个圈起来的模块的实现分别是对应哪些代码? image 其中的ffm我知道了是feat_fuse = self.ffm(feat_res8, feat_cp8); 那请问其他两个呢?

Lininggggggg commented 3 years ago

另外,请问框起来的变量feat_out_sp2,feat_out_sp4,feat_out_sp8,feat_out_sp16, feat_out, feat_out16, feat_out32都分别是做什么的(大哭,看不懂啊); 如果我只想return输出得到最终的output图,请问是哪个变量?是feat_out, feat_out16或者feat_out32三个其中一个都可以吗?还是feat_out这个变量而已,其他变量只是为了多角度约束损失函数的? image

menghd commented 3 years ago

如果是的话,那下图中三个圈起来的模块的实现分别是对应哪些代码? image 其中的ffm我知道了是feat_fuse = self.ffm(feat_res8, feat_cp8); 那请问其他两个呢?

建议先去看一下bisenet解读,这篇是改进工作,灰框是全局池化,ffm是特征融合模块,arm是注意力微调模块,这几个都是之前那篇工作里的设计,作者代码中采用的是boundary8发现效果最好,其他是还未删掉可供对比的参数设计。

Lininggggggg commented 3 years ago

如果是的话,那下图中三个圈起来的模块的实现分别是对应哪些代码? image 其中的ffm我知道了是feat_fuse = self.ffm(feat_res8, feat_cp8); 那请问其他两个呢?

建议先去看一下bisenet解读,这篇是改进工作,灰框是全局池化,ffm是特征融合模块,arm是注意力微调模块,这几个都是之前那篇工作里的设计,作者代码中采用的是boundary8发现效果最好,其他是还未删掉可供对比的参数设计。

您好,谢谢您的建议。我看了bisenet的相关内容,大概理解了些。 所以,请问本文的改进是去掉了SpatialPath,替换为损失函数的计算;且对ContextPath进行改进,其他的基本不变,对吗? 而ContextPath的改进是将原先的backbone(Xception39 或 Res18 )替换为作者提出的STDC模块对吧?即修改了下图中的红色框 image

menghd commented 3 years ago

如果是的话,那下图中三个圈起来的模块的实现分别是对应哪些代码? image 其中的ffm我知道了是feat_fuse = self.ffm(feat_res8, feat_cp8); 那请问其他两个呢?

建议先去看一下bisenet解读,这篇是改进工作,灰框是全局池化,ffm是特征融合模块,arm是注意力微调模块,这几个都是之前那篇工作里的设计,作者代码中采用的是boundary8发现效果最好,其他是还未删掉可供对比的参数设计。

您好,谢谢您的建议。我看了bisenet的相关内容,大概理解了些。 所以,请问本文的改进是去掉了SpatialPath,替换为损失函数的计算;且对ContextPath进行改进,其他的基本不变,对吗? 而ContextPath的改进是将原先的backbone(Xception39 或 Res18 )替换为作者提出的STDC模块对吧? image

嗯嗯,基本差不多是这样了,其他问题你可以问问作者hhh溜了溜了

Lininggggggg commented 3 years ago

hhh,谢谢了啊

lixuefeng810 commented 3 years ago

如果是的话,那下图中三个圈起来的模块的实现分别是对应哪些代码? image 其中的ffm我知道了是feat_fuse = self.ffm(feat_res8, feat_cp8); 那请问其他两个呢?

1.stage5下面的灰色框对应./models/model_stages.py

139        avg = F.avg_pool2d(feat32, feat32.size()[2:])
140
141        avg = self.conv_avg(avg)
142        avg_up = F.interpolate(avg, (H32, W32), mode='nearest')
  1. 8x那个橙色框对应 ./models/model_stages.py
    288  feat_out = F.interpolate(feat_out, (H, W), mode='bilinear', align_corners=True)

    feat_out就是与原图尺寸相同的最终特征图,加个softmax就能出结果了 至于feat_out16和feat_out32是BiSeNet原文中两个辅助loss,作者没做这个消融实验,默认沿用了

希望我的回答能帮到你

lixuefeng810 commented 3 years ago

另外,请问框起来的变量feat_out_sp2,feat_out_sp4,feat_out_sp8,feat_out_sp16, feat_out, feat_out16, feat_out32都分别是做什么的(大哭,看不懂啊); 如果我只想return输出得到最终的output图,请问是哪个变量?是feat_out, feat_out16或者feat_out32三个其中一个都可以吗?还是feat_out这个变量而已,其他变量只是为了多角度约束损失函数的? image

feat_out_sp2, sp4, sp8, sp16 这四个是backbone从stage1,2,3,4出来的特征图 至于feat_out16, 32是context path里经过ARM结构的两个特征图,用来计算辅助loss的(细节可以去看BISeNet的代码实现),这两个特征图不能直接用 123