如何使用PyTorch进行语义分割?好久没给大家带来教程资源了。PyTorch1.7正在更新中,所以这次我们将为大家带来一个简单实用的PyTorch教程资源:SemanticSegmentationwithPyTorch。来源:stanford本教程基于2020ECCVVipriorsChalangeStartCode实现语义分割,并添加了一些技巧。友情提示:教程中所有文件均可在文末开源地址获取。在开始训练之前,首先要设置库、数据集等,库准备pipinstall-rrequirements.txt下载数据集教程使用的是Cityscapes的数据集MiniCityDataset。数据集简单数据分析输入每个benchmark类别:之后从0-18计数,对每个类别进行像素标记:使用deeplabv3进行baseline测试,发现secondarycategory的IoU特别低,会导致难以从背景中区分出来。如下图所示的墙壁、栅栏、公共汽车、火车等。分析结论:数据集中存在严重的类别不平衡问题。训练基准模型使用来自torchvision的DeepLabV3进行训练。硬件是4个RTX2080TiGPU(11GBx4),如果您只有1个GPU或更少的GPU内存,请使用较小的批处理大小(<=8)。pythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50--crop_size5761152--batch_size8;pythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet101--modelDeepLabv3_resnet101--train_size5121024--test_size5121024--crop_size384_768Thereare3kindsoflossfunctionstochoosefromrespectively:crossoverlossfunctionEntropylossfunction(交叉熵损失)、类别加权交叉熵损失函数(Class-WeightedCrossEntropyLoss)和焦点损失函数(FocalLoss)。交叉熵损失函数在大多数语义分割场景中普遍使用,但它有一个明显的缺点,即当只分割前景和背景时,当前景像素数远小于背景像素数时,模型严重偏背景,导致效果不佳。#CrossEntropyLosspythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50--crop_size5761152--batch_size8;类别加权交叉熵损失函数在交叉熵损失函数的基础上,为每个类别增加了一个权重参数,这样可以在样本数量不平衡的情况下得到更好的结果。#WeightedCrossEntropyLosspythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_wce--crop_size5761152--batch_size8--lossweighted_ce;focusloss函数更进了一步,解决了难易样本数量不平衡的问题。#FocalLosspythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_focal--crop_size5761152--batch_size8--lossfocal--focal_gamma2.0;归一化层有4种归一化方法:BN(BatchNormalization)、IN(InstanceNormalization)、GN(GroupNormalization)和EvoNorm(EvolvingNormalization)。BN在batch上,对N、H和W进行归一化,并保留通道C的维度。BN对于较小的batchsizes效果不佳。#BatchNormalizationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50--crop_size5761152--batch_size8;在图像像素上,归一化H和W,并将其用于程式化迁移。#InstanceNormalizationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_instancenorm--crop_size5761152--batch_size8--norminstance;GN对通道进行分组,然后对其进行归一化。#GroupNormalizationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_groupnorm--crop_size5761152--batch_size8--normgroup;EvoNorm是谷歌和DeepMind在4月份联合发布的一项新技术。实验表明,EvoNorms在多种图像分类模型上都有很好的效果,它也可以很好地迁移到MaskR-CNN模型和BigGAN。#EvolvingNormalizationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_evonorm--crop_size5761152--batch_size8--normevo;数据增强2种数据增强技术:CutMix、CopyBlob。CutMix切掉一部分区域但不填充0像素,而是随机填充训练集中其他数据的区域像素值,分类结果按一定比例分布。这里在原有CutMix的基础上引入了语义分割。#CutMixAugmentationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_cutmix--crop_size5761152--batch_size8--cutmix;CopyBlob建立在Blob存储的基础上,通过Copy增强了性能。另外,如果要解决前面提到的类别不平衡问题,可以使用视觉归纳优先的CopyBlob进行增强。#CopyBlobAugmentationpythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50_copyblob--crop_size5761152--batch_size8--copyblob;推理训练后,评估训练的模型。pythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50--batch_size4--predict;多尺度推理使用[0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.2]进行多尺度推理。此外,对于H-Flip,必须同时使用一个批次。#Multi-ScaleInferencepythonbaseline.py--save_pathbaseline_run_deeplabv3_resnet50--batch_size1--predict--mst;使用验证集计算指标并将结果保存到results.txt。pythonevaluate.py--resultsbaseline_run_deeplabv3_resnet50/results_val--batch_size1--predict--mst;最终单体模型的最终结果为0.6069831962012341。如果使用更大的模型或更大的网络结构,可能会提高性能。此外,如果使用各种集成模型,性能也会提高。
