【深度学习】语义分割-研究思路

笔记参考

1.知乎回答:语义分割如何走下去
2.详解Swin Transformer核心实现,经典模型也能快速调优
4.深度学习领域怎么找创新点总结

截至2020-5

找思路-1

链接:https://www.zhihu.com/question/390783647/answer/1221984335

(1)手动设计网络结构 -> NAS搜索;
(2)固定感受野 -> 引入空间注意力做感受野自动调节;
(3)效果提升不上去 -> 换个思路做实时分割来对比结果;
(4)有监督太热门 -> 引入弱监督 (GAN, 知识蒸馏, …) + trick = 差不多的score;
(5)DNN太枯燥,融入点传统视觉的方法搞成end-to-end训练;
(6)CNN太单调,配合GCN搞点悬念;
(7)嫌2D太low逼,转3D点云分割;
(8)将CNN的套路在Transformer做多一遍;

觉得太懒?积木堆起:A+B,A+B+C,A+B+C+D,…

积木总结:
A-注意力机制:SE ~ Non-local ~ CcNet ~ GC-Net ~ Gate ~ CBAM ~ Dual Attention ~ Spatial Attention ~ Channel Attention【只要你能熟练的掌握加法、乘法、并行、串行四大法则,外加知道一点基本矩阵运算规则(如:HW * WH = HH)和sigmoid/softmax操作,那么你就能随意的生成很多种注意力机制】

B-卷积结构:Residual block ~ Bottle-neck block ~ Split-Attention block ~ Depthwise separable convolution ~ Recurrent convolution ~ Group convolution ~ Dilated convolution ~ Octave convolution ~ Ghost convolution ~ …
直接替换掉原始卷积块就完事了

C-多尺度模块:ASPP ~ PPM ~ DCM ~ DenseASPP ~ FPA ~ OCNet ~ MPM…
好好把ASPP和PPM这两个模块理解一下,搞多/减少几条分支,并联改成串联或者串并联结合,每个分支搞点加权,再结合点注意力或者替换卷积又可以组装上百种新结构出来了

D-损失函数:Focal loss ~ Dice loss ~ BCE loss ~ Wetight loss ~ Boundary loss ~ Lovász-Softmax loss ~ TopK loss ~ Hausdorff distance(HD) loss ~ Sensitivity-Specificity (SS) loss ~ Distance penalized CE loss ~ contour-aware Loss…

E-池化结构:Max pooling ~ Average pooling ~ Random pooling ~ Strip Pooling ~ Mixed Pooling ~…

F-归一化模块:Batch Normalization ~Layer Normalization ~ Instance Normalization ~ Group Normalization ~ Switchable Normalization ~ Filter Response Normalization…

G-学习衰减策略:StepLR ~ MultiStepLR ~ ExponentialLR ~ CosineAnnealingLR ~ ReduceLROnPlateau ~…

H-优化算法:BGD ~ SGD ~ Adam ~ RMSProp ~ Lookahead ~…

I-数据增强:水平翻转、垂直翻转、旋转、平移、缩放、裁剪、擦除、反射变换 ~ 亮度、对比度、饱和度、色彩抖动、对比度变换 ~ 锐化、直方图均衡、Gamma增强、PCA白化、高斯噪声、GAN ~ Mixup

J-骨干网络:LeNet ~ ResNet ~ DenseNet ~ VGGNet ~ GoogLeNet ~ Res2Net ~ ResNeXt ~ InceptionNet ~ SqueezeNet ~ ShuffleNet ~ SENet ~ DPNet ~ MobileNet ~NasNet ~ DetNet ~ EfficientNet ~ …

ps未来的方案走势,最好的参考还是参照人脑的语义分割过程,感觉人脑是先模式判决然后分割的,这样在分割的时候就引入了判决结果带来的先验了。

把语义分割几个主要子方向的论文猛看,比如弱监督语义分割、域自适应语义分割、小样本语义分割,甚至可以尝试一下基于神经架构搜索的语义分割。你看论文时,挑一些最新的、优质的论文,把每个细节360度无死角的全部吃透,然后把**论文复现一遍(最好是复现开源代码了的),**我觉得你只要足够熟练,肯定会有idea,这些论文都是人为创造出来的,都是遵循一定套路的!要在对这个领域非常熟悉的情况下再去改架构,不要略懂一点就盲目地去改,盲目地改肯定不行的,你要一眼就能看出别人魔改结构的套路才行!

语义分割的好处,首先,可以将分割问题看做其他问题的backbone的优化,所以分割所做的各种module,可以直接加到其他方案中(形成所谓A+B的套路方法),反之亦然。其次,同语义分割类似的像素级应用,把最后一层softmax换成回归,你将收获一大批其他同类型问题(同理可以套用A+B到C等的相关套路)。

创新思路-2

深度学习前人精度很高了,该怎么创新?

  1. 在原始的数据集上加一些噪声,例如随机遮挡,或者调整饱和度亮度什么的,主要是根据具体的任务来增加噪声或扰动,不可乱来。如果它的精度下降的厉害,那你的思路就来了,如何在有遮挡或有噪声或其他什么情况下,保证模型的精度。(无事生非)

  2. 用它的模型去尝试一个新场景的数据集,因为它原来的模型很可能是过拟合的。如果在新场景下精度下降的厉害,思路又有了,如何提升模型的泛化能力,实现在新场景下的高精度。(无事生非)

  3. 思考一下它存在的问题,例如模型太大,推理速度太慢,训练时间太长,收敛速度慢等。一般来说这存在一个问题,其他问题也是连带着的。如果存在以上的问题,你就可以思考如何去提高推理速度,或者在尽可能不降低精度的情况下,大幅度减少参数量或者计算量,或者加快收敛速度。(后浪推前浪)

  4. 考虑一下模型是否太复杂,例如:人工设计的地方太多,后处理太多,需要调参的地方太多。基于这些情况,你可以考虑如何设计一个end-to-end模型,在设计过程中,肯定会出现训练效果不好的情况,这时候需要自己去设计一些新的处理方法,这个方法就是你的创新。(后浪推前浪)

  5. 替换一些新的结构,引入一些其它方向的技术,例如transformer,特征金字塔技术等。这方面主要是要多关注一些相关技术,前沿技术,各个方向的内容建议多关注一些。(推陈出新)

  6. ==.尝试去做一些特定的检测或者识别。==通用的模型往往为了保证泛化能力,检测识别多个类,而导致每个类的识别精度都不会很高。因此你可以考虑只去检测或识别某一个特定的类。以行为识别为例,一些通用的模型可以识别几十个动作,但你可以专门只做跌倒检测。在这种情况下你可以加很多先验知识在模型中,换句话说,你的模型就是专门针对跌倒设计的,因此往往精度可以更高。(出奇制胜)

  7. 如果把创新的标准放得低一点,那么把A算法的部分步骤(或者某运算、函数),嵌入B算法内部,应该算是创新吧,
    例如
    1)把跨层恒等连接加入卷积神经网络,就得到了残差网络;
    2)把非局部均值引入残差网络,就得到了非局部神经网络(non-local neural network);
    3)把软阈值化引入残差网络,就得到了适合强噪数据的残差收缩网络。

融合了几个前人设计好的loss然后效果得到了提升,虽然这种也算是创新

个人认为。一般就是深度学习在你所在领域的一些应用,一般就是残差网络等cnn构架,或者lstm.gru或者它们的组合。或者加入注意力机制,某些结构的改进等。一般写的时候结构框图画的漂亮一点,多给出一些图和表,例如混淆矩阵,损失曲线等。如果可以通过可视化的手段说明一下使用深度学习的效果一般可以在稍微上一个档次。

  1. 后来发现原来大家都在用trick。不加余弦衰减,不加mixup,不训练200个epoch,基本就达不到目前大家说的那个SOTA效果,但是这些不会有人和你说的,他们只会说我在resnet50上训练到了多少多少的准确率。

现在真的很多就在test调参

一般都会设置随机种子。我拿到一个2019的论文,种子是2019,我随手把他改成了1314,结果f1提升了1.5。。。我自己都惊呆了。。。直接sota了[捂脸]

深度学习很常见的一个现象是A提出了一个methodA,resultA = methodA + trickA。接着B提出了一个methodB,resultB = methodB + trickB。B在他们的文章中会宣称resultB ~> resultA,从而得出methodB ~> methodA的结论。但其实很有可能只是trickB ~> trickA,或者说trickB对methodB的提升比trickA对methodA的提升大。如果“公平”的比较的话,很有可能会出现下面的几种情况:methodA ~> methodB (都不加trick);methodA + trickA ~> methodB + trickA(这不一定说明methodA ~> methodB,可能只是trickA更适用于methodA);methodA + trickB ~> methodB + trickB (这种情况可能是B最不想见到的)。为了显示出methodB的solid,B一般不会在文章中提及他们使用的全部trick。

最容易的就是做交叉application,算法A在任务B上的表现等。如果发会议就能毕业的话,ccf的c类会议里有相当一部分都有>40%接受率(ICANN,IJCNN,ICPR等),你魔改一点网络结构去尝试解决一个没人在乎的问题,只要写的别太拉胯就硕士毕业了。
最容易毕业发文章的大概就是套application,发个会议就顺利过关了。

  1. 对于科研菜鸟,读文献最开始要广泛的读。
    第一步,你要知道什么领域有什么问题,你想解决什么领域的什么问题。所以方方面面的论文,感兴趣的领域都多读一读,建议多读一读综述。

第二步,确定你想要解决问题的解决方法,可能解决这个问题会用到很多不同的算法,找一个感兴趣的,方法流行的,也就是近几年方法的研究热点。这样的好处是,可参考论文多,研究有价值。这个阶段大多数人论文会看的云里雾里,根本不知道写的是什么,不要慌张,跳过实验部分,只看他用了什么基础方法,意义是什么。

第三步,这个时候已经确定这个方法了,去专门的学习这个方法的原理,系统的学习它的方法步骤。
觉得掌握之后,就在知网下载一些差一点的学校学报的期刊,这种文章多是对方法没有改进,大多是应用一下,这种文章对于论文初级选手太友好了,这个时候你会发现,你看懂了第一篇文章,从头到尾。多看上几篇基本知道这个方法的一个写论文的步骤,实验的结果流程。

第四步,开始接触高质量的文章了,国内大多数论文都是方法改进和应用创新,方法改进更能发表高质量的论文。国外的文章改进的很好,我们老师说完完全全创造一个新方法是不太可能的,这都是数学家之类的科学家做的事,我们能改进的效果更好,就很好了。所以,接触一些高质量的中文,有能力多看外文,然后熟悉他们的改进,进行归纳分析,有的论文会结合多种方法,改进的形式和组合太多了。

最后给大家说一个套路,很多朋友不知道怎么找自己论文改进之处,创新点,可以把其中两种或者多种改进方式相结合,在结合不同的改进方法,可以找出很多点,当然了,找出点来不一定效果好,这个得通过后期实验验证和优化了。

以上都是一些针对性的思路,最原始的做法应该是看完方向上比较重要的论文后自己写一个综述,写的过程中往往会发现一些问题,不一定就是要去跟sota模型比精度,而是解决这个方向上还存在的问题。

例如前面提到的实现轻量化,提高推理速度,实现实时检测,设计end to end模型,都属于解决这个方向上存在的问题,此外还包括一些其他的问题,这个得根据具体任务才能分析。

如果说写完综述后还是没思路,一来是建议尝试以上思路,二来建议找一些跟你方向相关的经典论文看一看,边看边想,这四个字最重要。

文章核心

一篇文章的核心我总结了下大概是:
你做这个工作有什么意义?-> 这个工作目前还存在什么挑战->以前,现有的方法是如何解决的?它们还存在什么缺陷?->你的方法同别人的方法有何不同?你为什么能解决的比别人更好?创新性在哪?「这里故事要讲的好」->实验图表吹吹吹…

实现

链接:https://www.zhihu.com/question/390783647/answer/2359428992

语义分割实现:
第一种方法是滑动窗口,我们将输入图像分解成许多小的局部图像,但是这种方法在计算上会很昂贵。所以,我们在实践中并没有真正使用这个方法。
另一种方法是
完全卷积网络
,其中网络有一整堆卷积层,没有完全连接的层,从而保留了输入的空间大小,这在计算上也是极其昂贵的。
第三个也是最好的一个方法,那就是对图像进行上采样和下采样。因此,我们不需要对图像的完整空间分辨率进行所有卷积,我们可能会在原始分辨率下遍历少量卷积层,然后对该特征图进行下采样,然后对其进行上采样。

swin和下游任务的结合的应用讲解

强推!!!!—详解Swin Transformer核心实现,经典模型也能快速调优

将Swin Transformer核心

制成SwinT模块的价值

如下图所示,Swin Transformer的核心模块就是黄色部分,我们需要将这个部分制成一个通用的SwinT接口,使得更多熟悉CNN的开发者将Swin Transformer应用到CV领域的不同任务中。
在这里插入图片描述
这么做的价值有两点:

1、Swin Transformer自身的能力强大,这个接口将不会过时。
①实现超大尺寸整张图片的全局注意力运算所需要的超级计算单元短时间内不会出现(个人开发者也很难拥有这种算力),也就是说,窗口注意力依然能持续使用一到两年;
②现在一般认为,简单有效的才是最好的,而Swin Transformer的实现则非常简单,很容易让人看懂并记住其工作原理;
③实践上,Swin Transformer也得到了SOTA,并且成功地获得了马尔奖,简单与强大两者加在一起才是能拿马尔奖的原因。

2、实现方便快捷的编程,例如我们要将Unet变成Swin-Unet,我们将只需要直接将Conv2D模块替换成SwinT模块即可。我们通常需要在同一个网络中,不仅使用Swin Transformer中的块,也会使用到Conv2D模块(例如Swin Transformer用在上层抽取全局特征,Conv2D用在下层抽取局部特征),因此我们要对原Swin Transformer模型进行架构上的更改。

SwinT的应用场景

1、使用SwinT模块搭建完整的Swin Transformer模型复现论文。

2、可以将现有的骨干为Conv2D的模型替换为SwinT从而搭建性能更好的网络,如Swin-Unet,以及在平常各种场景中需要叠加很多层CNN才能抽取深度特征的地方,可以将几个Conv2D层替换为一个SwinT。

3、由于SwinT输入输出完全同Conv2D,因此也可以用在语义分割、目标检测等复杂任务上

4、可以同时使用SwinT和Conv2D进行模型搭建,在需要提取高级全局特征的时候使用SwinT在需要局部信息时使用Conv2D,非常灵活。

总结

我们将Swin Transformer最核心的模块制作成了SwinT接口,使用形式类似Conv2D。
首先,这极大的方便了开发者们进行网络模型的编写,尤其是要自定义模型架构时,并混合使用Conv2D和SwinT;
然后,我们认为SwinT接口的内容非常简单并且高效,因此这个接口短期内将不会过时,可以拥有时效性上的保证;
最后,我们真实地对该接口进行了测试,证明了该接口的易用性以及精度性能。

swin和语义分割

语义分割算法分享之Swin-Transformer

在ViT等基础之上继续演变的Swin刚刚拿到了ICCV2021的 best paper,经过实际使用体验来看,确实效果较好,从语义分割角度来看,Swin不仅在ADE20K取得了sota的效果,在各个其他场景数据集下都有极为优秀的表现,精度相比PSPnet和deeplabv3+等基于CNN的分割算法都有较大提升(优点:精度高,缺点:实时性较差,极度依赖预训练模型,由于tf较新,在嵌入式端部署可能会存在问题,目前嵌入式端推理框架还都是基于常规卷积做加速。)。

最后分割头接的是upernet,基于pspnet改进,在PPM融合后的特征,再分别和conv2-conv5分别做4次融合,融合方式类似于fpn, 最后融合这么多次融合出一个fused feature map

具体地,在4个stage中。每次stage后都会将output的feature map append进一个list
对于每个stage:

分别是:

1x128x128x128

1x256x64x64

1x512x32x32

1x1024x16x16

四组feature map喂入对应upernet的分支中做下图的特征融合,可以看到和检测的FPN非常的类似在这里插入图片描述
参数SETR太大了,相比swin-L要多三分一参数,mIOU要低3个点,训练:也是一样的transform系列极端依赖预训练模型,从头开始训基本训不动
整体来看,整个Swin是发现问题---->解决问题的形式:

问题:SETR太大

解决:采用基于Windows的局部注意力(W-MSA)

问题:不同Windows之间缺乏信息交互(同时期的Segformer直接加了overlap)

解决:对W-MSA进行改进,通过SW-MSA解决

猜你喜欢

转载自blog.csdn.net/zhe470719/article/details/124590790
今日推荐