竞赛trick 和 拾遗 buglist

MY

过采样

TTA 和 two-mode 对比实验,two-mode有效,TTA下降

attention CSCE

不同的backbone :efb6, res101, timm-resnest100e+csce, res50+focal

TTA= (img+ left flip+ right flip )/3

训练集 过采样前12882  过采样(两份)后 27578 ,过采样一份后 20230

验证集 3135

batch16, efficient b6比较大 需要双卡,resnet101 单卡就可以

训最好模型大多在epoch 44(余弦退火学习率最小处),验证结果如下:

 模型(encoder+ decoder)mIOU

TTA后mIOU

1efficientNet-b6, Unet++ 0.58690.5752
2

efficientNet-b6, Unet++ (5 6 7类过采样 x2)

0.677490.66954
3resnet101, Unet++ (5 6 7类过采样 x2)0.669470.64233
 2+3 集成0.69530.6718
5resnet101,Unet++ with scse(5 6 7类过采样 x2)0.671620.64657
6timm-resnest101e, Unet++ with scse(5 6 7类过采样 x2)0.703570.69086
7efficientNet-b6,Unet++ with scse(5 6 7类过采样 x2)0.676170.669205
8resnet50, Unet++ with focal loss (gamma=3)(5 6 7类过采样 x1)0.609830.57603
9resnet101, Unet++ with focal loss (gamma=3)(5 6 7类过采样 x2)0.656300.62337
 2+3+60.712998懒得测了
 2+5+60.711290.688518
 2+3+5+60.711860.684622

直观结论:

过采样直接有效涨0.09~0.1精度 (15%)

facol loss和scse注意力涨点不明显,大约0.002-0.01 (0.3%~ 1.5%),3/15补充 甚至 scse和focal loss 出现降点。。训练条件没有变化啊。

resnest101e或者200e,确实如传闻所言,相比resnet101涨点约0.03 (4.7%)

模型集成很有效,但不是越多越好,而是需要不同预测重点类型的模型进行有事集成,上面实验的差距不大,3模比单模涨点约 0.01-0.04 ( 1.3% ~6.2%)

加了两个flip的TTA后,精度都下降了,不明白?

 

 

dataparrelel训练的模型, 在加载模型时出现out of memory 通过换卡映射加载 解决:

model_recover = torch.load(args.model_recover_path, map_location={
   
   'cuda:0': 'cuda:1'})

https://my.oschina.net/u/4259850/blog/4706558

关于并行

https://blog.csdn.net/genous110/article/details/88385940

https://blog.csdn.net/weixin_41735859/article/details/108610687

https://blog.csdn.net/qq_37088976/article/details/98186931?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

https://blog.csdn.net/senius/article/details/96599955?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328626.9212.16153475270697407&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

https://www.cnblogs.com/blog4ljy/p/11711173.html

https://blog.csdn.net/weixin_40087578/article/details/87186613?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328627.8124.16153470880721341&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

https://blog.csdn.net/weixin_41764013/article/details/103472347?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328626.8377.16153469305198883&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

 

https://blog.csdn.net/weixin_45347379/article/details/114299947

 

strip pooling(mixed pooling module) :针对细长河流道路等类别有一定提升效果

 

smp中的focal loss

FocalLoss
classsegmentation_models_pytorch.losses.FocalLoss(mode, alpha=None, gamma=2.0, ignore_index=None, reduction='mean', normalized=False, reduced_threshold=None)[source]
Compute Focal loss

Parameters
mode – Loss mode ‘binary’, ‘multiclass’ or ‘multilabel’

alpha – Prior probability of having positive value in target.

gamma – Power factor for dampening weight (focal strength).

ignore_index – If not None, targets may contain values to be ignored. Target values equal to ignore_index will be ignored from loss computation.

normalized – Compute normalized focal loss (https://arxiv.org/pdf/1909.07829.pdf).

reduced_threshold – Switch to reduced focal loss. Note, when using this mode you should use reduction=”sum”.

Shape
y_pred - torch.Tensor of shape (N, C, H, W)

y_true - torch.Tensor of shape (N, H, W) or (N, C, H, W)

 

机器学习之类别不平衡问题 (3) —— 采样方法

https://www.cnblogs.com/massquantity/p/9382710.html

 

【CV中的Attention机制】语义分割中的scSE模块

https://zhuanlan.zhihu.com/p/102036086

SMP 文档 https://smp.readthedocs.io/en/latest/models.html#id2

class UnetPlusPlusDecoder(nn.Module):
    def __init__(
            self,
            encoder_channels,
            decoder_channels,
            n_blocks=5,
            use_batchnorm=True,
            attention_type=None,
            center=False,
    ):

 

resnet的演化(res2net,resnext,se-resnet,sk-resnet,resnest)

https://blog.csdn.net/qq_33270279/article/details/105664790

 

从loss处理图像分割中类别极度不均衡的状况---keras

https://blog.csdn.net/m0_37477175/article/details/83004746

 

遇到的坑:

$ pip install segmentation-models-pytorch

segmentation_models_pytorch.losses 找不到

$ pip install git+https://github.com/qubvel/segmentation_models.pytorch

在服务器端不可以,于是pip 从本地文件夹安装

pip install -e /path/to/your/setup.py

torch.load()加载模型时报错 RuntimeError: storage has wrong size: expected -4778698069145096240 got 1

权重文件不完整 
https://blog.csdn.net/weixin_43820848/article/details/100710460

 

被一个读取数据集的问题搞得 loss 不下降 完全不收敛 mad

原因:读取的img、label,没有排序,标签不对应

RuntimeError: Expected 4-dimensional input for 4-dimensional weight 64 3 3, but got 3-dimensional in

https://blog.csdn.net/zhonglongshen/article/details/103478814

numpy.argmax(axis=0...)的理解: 沿着某轴(b0,c1,w2,h3)方向取最大元素的索引

 

 

 

 

 

 

 

pytorch 余弦退火学习率

https://zhuanlan.zhihu.com/p/261134624

https://blog.csdn.net/qq_37612828/article/details/108213578

 

十个原因可能导致 训练集明明很高,验证集,测试集 validation accuracy stuck 准确率 很低 损失不减小

https://blog.csdn.net/u013249853/article/details/89393982/

遥感语义分割

https://www.cnblogs.com/wzp-749195/p/11114624.html

https://www.cnblogs.com/skyfsm/p/8330882.html

Sanet

https://blog.csdn.net/sinat_17456165/article/details/106913474?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

注意力机制

https://blog.csdn.net/xys430381_1/article/details/89323444?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

 

基于深度学习的遥感影像语义分割(初级版)

https://zhuanlan.zhihu.com/p/110379460

GDAL

如果自己做的图包含多个波段(往往大于4个),Opencv或PIL就不太顶用了,这时候GDAL就派上用场了
例如我有一个十波段图像,用此函数读取后为numpy数组类,shape为[h,w,10]

from osgeo import gdal
import numpy as np

def load_img(path):
    dataset = gdal.Open(path)
    im_width = dataset.RasterXSize
    im_height = dataset.RasterYSize
    im_data = dataset.ReadAsArray(0,0,im_width,im_height)
    im_data = im_data.transpose((1,2,0)) #此步保证矩阵为channel_last模式
    return im_data

进阶 

 

图像分割中的loss--处理数据极度不均衡的状况

https://www.cnblogs.com/hotsnow/p/10954624.html

 

 

 

datawhale :数据竞赛Tricks集锦

https://blog.csdn.net/Datawhale/article/details/100981726?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.control

 

语义分割trick集合

https://blog.csdn.net/qq_17403617/article/details/111566212?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.control

 

cver: 目标检测比赛思路、tricks集锦、资料汇总

https://blog.csdn.net/amusi1994/article/details/113667916?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-3&spm=1001.2101.3001.4242

 

目标检测 奇技淫巧

https://blog.csdn.net/e01528/article/details/82354477?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242

https://blog.csdn.net/e01528/article/details/82354477?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242

 

median frequency balancing  给不同类别的loss 不同权重

https://blog.csdn.net/fanzonghao/article/details/85263553

这样有助于提高 小类别的损失,加强学习

但是同时也可能导致 其他类别学习不够,整体的分数会上升吗?

 

dice coefficient


 

Jaccard(iou)如下:

Jaccard也可以写成

所以dice coefficient就等于Jaccard分子分母各加了一个AB交集。

 

 

 

TTA  测试时增强

顾名思义是测试时增强的意思,可将准确率提高若干个百分点,它就是测试时增强(test time augmentation, TTA)。这里会为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数。
尽管有作弊的嫌疑。
但这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,能解决上述问题。

https://blog.csdn.net/MRZHUGH/article/details/109190678?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

 

语义分割中的数据增强

语义分割任务和分类是很像的,图像分类是粗粒度分类,语义分割是稠密分类—针对图像中每一个像素分类。那么在对语义分割任务做数据增强时完全可以很容易的使用图像分类的数据扩充技巧。

https://blog.csdn.net/xijuezhu8128/article/details/111304151

 

数据随机缩放(极其重要) https://zhuanlan.zhihu.com/p/66289073?utm_source=weibo

无论对于什么样的数据集,规模多大的数据集,在语义分割任务中,数据随机缩放给模型带来的收益永远是最大的。我们在训练网络时,如果将padding给的过大,而卷积核大小不变你会发现我们的卷积核能力被弱化,过大的padding增加了数据集的单一性,假设你对一张大小为16x16的图像增加了64x64的padding,甚至更大,大到我们本来的图像在在增加padding之后显的很渺小,那这新的图像对于卷积核来看,基本上就是一张呼呼的图像,如果整个数据集都是这种图像,那对于卷积核来讲,太单一了,当然也没有人会这样做。数据集的多样性,包括尺度多样性,光照多样性,目标姿态多样性。尺度多样性不仅在深度学习中使用,在传统计算机视觉中也是很重要的方法。

我敢保证,对于随机翻转,镜像翻转,色彩偏移等数据增强技术手段为模型所带来的收益加一起也不一定有尺度的随机缩放所带来的效果好。

随机尺度缩放为模型所带来的收益是最直接的,最可观的。同一个物体的不同尺度,对于卷积核来讲,那就是感受视野的不同,我们的卷积核不仅需要能在大的感受视野中获得好的分类能力,也得具备在小的感受视野中获得很好的分类能力。你看很多语义分割论文中出现下图像情况,是最典型的感受视野不足所造成的,在这种情况下,你采用随机反转,颜色偏移,甚至增多这种类型的数据图像,有用吗?没用的,要想改善这种情况的发生,要么增大卷积核,要么尺度随机缩放。增大卷积核直接增大计算量,为计算带来了负担,可有人又说了,可以采用膨胀卷积增大感受视野而不增加计算量,从理论上是这样的,可是实际上真的是这样吗?其实不然,我下文会讨论。

 

 

目前来讲,有效实现卷积的也就3种方式

im2col(上图) ,winograd, FFT,但是还是im2col比较常见,winograd好像是商汤最近几年提出来的,通过特殊数学计算方式,减少计算量,目前该方法被应用在腾讯移动端深度学习框架NCNN中,至于FFT,还没见到用在深度学习种。

至于为什么使用im2col,这还是贾清扬大神在写caffe时提出来的,因为图像中,一个块内的像素点在内存中是地址不连续的,所以对于同一个块内的像素想要缓存到cache上,可能出现多次内存访问,效率极低,所以设计出im2co方式,提前将需要计算的像素点放在连续地址上。

因此,对于同一图像,除了原始图像在内存中占空间,使用im2col又会消耗另一份空间。

 

语义分割指标

4.1运行时间

考虑到是否可复现以及对后续研究者的帮助,有必要在提供运行时间的同时给出系统运行的硬件信息,以及基准方法的配置。如果合理地做到了这些,后续的研究者们将可以判断出这个方法是否对其实际场景实用,并且可以使用相同的环境进行公平的对比。

4.2占用内存

内存占用是图像分割中的另一个重要的问题。虽然不及运行时间那样受限,因为扩充容量一般是可行的,其仍然是系统的一个限制因素。在某些场景下,例如机器人平台上的芯片,内存并不会像高性能服务器中一样充裕。即使是普遍用来加速深度网络的高端的显卡也不会搭载大容量的存储空间。基于这些考虑,以及与在时间问题上相似的对于实际应用的考虑,详细记录网络所占用的最大及平均存储空间是极其必要的。

4.3准确率

我们已经提出了许多用于评估语义分割问题准确率的评价指标,这些指标通常是像素准确率及IoU的变体。在本文中回顾在了语义分割问题中最常用的评价指标,用来度量逐个像素标注类的方法的表现。

我们假设共有 类,即 ,包括一个空类或背景, 是本属于第 类却被分到第 类的像素数量。也就是说, 代表的是分类正确的正例数量。

像素准确率(PA):是最简单的度量标准,只是简单的计算正确分类的结果和此类像素的比值。

像素准确平均值(MPA):在PA的基础上有一点小小的改进:正确像素的比值是以每个类别的正确率之和,然后在整个类别上做平均。

平均交并比(MIoU):这是标准的分割问题的度量手段,它计算两个集合之间的交集和并集之比。在分割问题中,这两个集合通常是真值和预测出来的分割图。这个比值可以这样计算:真实正例(交集)的数量除以总数量(包括真实正例、错误负例、以及错误正例(并集))。

频率加权交并比:是对MIoU的改进,对每个类别按照重要性进行加权,权值来为其出现的频率。

 

 

warmup lr

翻译一下就是对学习率进行预热,最开始是在 ResNet 的论文中提到的一种方法,原始是先在前几个 epoch 或 iter 或目标达到一个水准之前以小于预设值得 lr 进行训练,然后再恢复 lr 到初始值。后来 Facebook 提出了改良版本,详情请移步论文: Gradual warmup[5],这也是当前检测和分割中必不可少的环节,mmdetection 中默认是启用了的:

 

 lr 如何计算

学习率的初始化设置一直是一个比较头疼的问题,有的时候需要经常实验才能得到一个比较好的值,我们在检测任务中常用的计算方法是:lr = 0.02 / 8 x num_gpus x img_per_gpu / 2,一般情况都是这么计算后设置。

 

目标检测后处理的 soft-nms

Soft-NMS 改进了之前比较暴力的 NMS,当 IOU 超过某个阈值后,不再直接删除该框,而是降低它的置信度 (得分),如果得分低到一个阈值,就会被排除;但是如果降低后仍然较高,就会被保留。

focal loss  来自 retinanet

CV 中根据实验结果调整损失函数最先考虑的一个,论文: Focal Loss for Dense Object Detection, 主要是针对模型拟合困难的样例或者样本不均衡的样例,在图像分类中常用作最终的损失函数,直接进行优化,而在目标检测中却有两个选择,一个是在 RPN 层使用 FocalLoss,这样可以缓解由于目标占比较少导致生成的 anchor 正负样本比例失衡;另一种就是类似图像分类一样,在 bbox_head 中使用

 

 

学习率规划解决了什么问题,防止陷入局部最优?

adam,adamw,sgdm各有什么益处

什么样的loss更好,分类?回归?解决类别的不平衡?

 

模型预测:

  • 多折模型集成精度收益 > 单折TTA;
  • 多折模型的预测阈值可以加入搜索过程;

类别不均衡:

  • 少数类别上采样;
  • 整图分类 + 分割损失 一起训练;
  • 整图分类:10个二分类;

 

个人感受

数据科学,模型、调参之后,主要是对数据的研究,数据的分布的充分足够有利于模型的泛化性能

所有,接近测试集的数据增强和模型的集成(包括传统的集成学习)都是提升泛化能力的好方法。

模型:特征提取很重要,越好的特征(backbone和neck的协作)对下游的head 分类,回归(语义归纳模块)非常关键

所以 什么是更好的数据,怎么增强是更好的数据

什么是好的特征,什么backbone和neck是好的

注意力机制解决了什么问题,有什么益处

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值