前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用PyTorch进行语义分割?一个教程教会你|资源

如何用PyTorch进行语义分割?一个教程教会你|资源

作者头像
量子位
发布2023-03-10 15:02:36
3240
发布2023-03-10 15:02:36
举报
文章被收录于专栏:量子位量子位
木易 发自 凹非寺  量子位 报道 | 公众号 QbitAI

很久没给大家带来教程资源啦。

正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorch进行语义分割。

图源:stanford

该教程是基于2020年ECCV Vipriors Chalange Start Code实现了语义分割,并且添加了一些技巧。

友情提示:教程中的所有文件均可以在文末的开源地址获取。

预设置

在开始训练之前,得首先设置一下库、数据集等。

库准备

代码语言:javascript
复制
pip install -r requirements.txt

下载数据集

教程使用的是来自Cityscapes的数据集MiniCity Dataset。

数据集的简单数据分析

将各基准类别进行输入:

之后,便从0-18计数,对各类别进行像素标记:

使用deeplab v3进行基线测试,结果发现次要类别的IoU特别低,这样会导致难以跟背景进行区分。

如下图中所示的墙、栅栏、公共汽车、火车等。

分析结论:数据集存在严重的类别不平衡问题。

训练基准模型

使用来自torchvision的DeepLabV3进行训练。

硬件为4个RTX 2080 Ti GPU (11GB x 4),如果只有1个GPU或较小的GPU内存,请使用较小的批处理大小(< = 8)。

代码语言:javascript
复制
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
代码语言:javascript
复制
python baseline.py --save_path baseline_run_deeplabv3_resnet101 --model DeepLabv3_resnet101 --train_size 512 1024 --test_size 512 1024 --crop_size 384 768 --batch_size 8;

损失函数

有3种损失函数可供选择,分别是:交叉熵损失函数(Cross-Entropy Loss)、类别加权交叉熵损失函数(Class-Weighted Cross Entropy Loss)和焦点损失函数(Focal Loss)。

交叉熵损失函数,常用在大多数语义分割场景,但它有一个明显的缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,模型严重偏向背景,导致效果不好。

代码语言:javascript
复制
# Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;

类别加权交叉熵损失函数是在交叉熵损失函数的基础上为每一个类别添加了一个权重参数,使其在样本数量不均衡的情况下可以获得更好的效果。

代码语言:javascript
复制
# Weighted Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50_wce --crop_size 576 1152 --batch_size 8 --loss weighted_ce;

焦点损失函数则更进一步,用来解决难易样本数量不平衡。

代码语言:javascript
复制
# Focal Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50_focal --crop_size 576 1152 --batch_size 8 --loss focal --focal_gamma 2.0;

归一化层

有4种归一化方法:BN(Batch Normalization)、IN(Instance Normalization)、GN(Group Normalization)和EvoNorm(Evolving Normalization)。

BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。

代码语言:javascript
复制
# Batch Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;

IN在图像像素上,对H、W做归一化,用在风格化迁移。

代码语言:javascript
复制
# Instance Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_instancenorm --crop_size 576 1152 --batch_size 8 --norm instance;

GN将通道分组,然后再做归一化。

代码语言:javascript
复制
# Group Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_groupnorm --crop_size 576 1152 --batch_size 8 --norm group;

EvoNorm则是4月份由谷歌和DeepMind 联合发布的一项新技术。实验证明,EvoNorms 在多个图像分类模型上效果显著,而且还能很好地迁移到 Mask R-CNN 模型和 BigGAN。

代码语言:javascript
复制
# Evolving Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_evonorm --crop_size 576 1152 --batch_size 8 --norm evo;

数据增强

2种数据增强技术:CutMix、Copy Blob。

  • CutMix

将一部分区域cut掉但不填充0像素,而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。

而在这里,则是在原有CutMix的基础上,引入了语义分割。

代码语言:javascript
复制
# CutMix Augmentation
python baseline.py --save_path baseline_run_deeplabv3_resnet50_cutmix --crop_size 576 1152 --batch_size 8 --cutmix;
  • Copy Blob

在 Blob 存储的基础上构建,并通过Copy的方式增强了性能。

另外,如果要解决前面所提到的类别不平衡问题,则可以使用视觉归纳优先的CopyBlob进行增强。

代码语言:javascript
复制
# CopyBlob Augmentation
python baseline.py --save_path baseline_run_deeplabv3_resnet50_copyblob --crop_size 576 1152 --batch_size 8 --copyblob;

推理

训练结束后,对训练完成的模型进行评估。

代码语言:javascript
复制
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --batch_size 4 --predict;

多尺度推断

使用[0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.2]进行多尺度推理。另外,使用H-Flip,同时必须使用单一批次。

代码语言:javascript
复制
# Multi-Scale Inference
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --batch_size 1 --predict --mst;

使用验证集计算度量

计算指标并将结果保存到results.txt中。

代码语言:javascript
复制
python evaluate.py --results baseline_run_deeplabv3_resnet50/results_val --batch_size 1 --predict --mst;

最终结果

最后的单一模型结果是0.6069831962012341,

如果使用了更大的模型或者更大的网络结构,性能可能会有所提高。

另外,如果使用了各种集成模型,性能也会有所提高。

资源地址: https://github.com/hoya012/semantic-segmentation-tutorial-pytorch

本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

「MEET 2021智能未来大会」启幕,

早鸟票限时抢购中,扫码预定席位!

李开复博士、尹浩院士、清华唐杰教授,以及来自小米美团爱奇艺小冰亚信浪潮、容联、澎思地平线G7等知名AI大厂的大咖嘉宾齐聚,期待关注AI的朋友报名参会、共探新形势下智能产业发展之路。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

一键三连「分享」、「点赞」和「在看」

科技前沿进展日日相见~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子位 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 预设置
  • 训练基准模型
  • 推理
  • 最终结果
相关产品与服务
批量计算
批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档