如何用PyTorch进行语义分割?一个教程教会你|资源
木易 发自 凹非寺
量子位 报道 | 公众号 QbitAI
很久没给大家带来教程资源啦。
正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorch进行语义分割。
△图源:stanford
该教程是基于2020年ECCV Vipriors Chalange Start Code实现了语义分割,并且添加了一些技巧。
友情提示:教程中的所有文件均可以在文末的开源地址获取。
预设置
在开始训练之前,得首先设置一下库、数据集等。
库准备
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)。
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
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)。
交叉熵损失函数,常用在大多数语义分割场景,但它有一个明显的缺点,那就是对于只用分割前景和背景的时候,当前景像素的数量远远小于背景像素的数量时,模型严重偏向背景,导致效果不好。
# Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
类别加权交叉熵损失函数是在交叉熵损失函数的基础上为每一个类别添加了一个权重参数,使其在样本数量不均衡的情况下可以获得更好的效果。
# Weighted Cross Entropy Loss
python baseline.py --save_path baseline_run_deeplabv3_resnet50_wce --crop_size 576 1152 --batch_size 8 --loss weighted_ce;
焦点损失函数则更进一步,用来解决难易样本数量不平衡。
# 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效果不好。
# Batch Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --crop_size 576 1152 --batch_size 8;
IN在图像像素上,对H、W做归一化,用在风格化迁移。
# Instance Normalization
python baseline.py --save_path baseline_run_deeplabv3_resnet50_instancenorm --crop_size 576 1152 --batch_size 8 --norm instance;
GN将通道分组,然后再做归一化。
# 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。
# 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的基础上,引入了语义分割。
# 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进行增强。
# CopyBlob Augmentation
python baseline.py --save_path baseline_run_deeplabv3_resnet50_copyblob --crop_size 576 1152 --batch_size 8 --copyblob;
推理
训练结束后,对训练完成的模型进行评估。
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,同时必须使用单一批次。
# Multi-Scale Inference
python baseline.py --save_path baseline_run_deeplabv3_resnet50 --batch_size 1 --predict --mst;
使用验证集计算度量
计算指标并将结果保存到results.txt中。
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技术和产品新动态
一键三连「分享」、「点赞」和「在看」
科技前沿进展日日相见~
如何用PyTorch进行语义分割?一个教程教会你|资源相关推荐
- 如何用PyTorch进行语义分割?
木易 发自 凹非寺 量子位 报道 | 公众号 QbitAI 很久没给大家带来教程资源啦. 正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorc ...
- python实现语义分割_如何用PyTorch进行语义分割?一文搞定
很久没给大家带来教程资源啦. 正值PyTorch 1.7更新,那么我们这次便给大家带来一个PyTorch简单实用的教程资源:用PyTorch进行语义分割. 图源:stanford 该教程是基于2020 ...
- pytorch 归一化_用PyTorch进行语义分割
点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 木易 发自 凹非寺 量子位 报道 | 公众号 QbitAI 很久没给大家带来教程 ...
- 使用PyTorch进行语义分割
本篇文章使用进行pytorch进行语义分割的实验. 1.什么是语义分割? 语义分割是一项图像分析任务,我们将图像中的每个像素分类为对应的类. 这类似于我们人类在默认情况下一直在做的事情.每当我们看到某 ...
- 【Python】mmSegmentation语义分割框架教程(自定义数据集、训练设定、数据增强)
文章目录 0.mmSegmentation介绍 1.mmSegmentation基本框架 1.1.mmSegmentation的model设置 1.2.mmSegmentation的dataset设置 ...
- 三个优秀的PyTorch实现语义分割框架
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 使用的VOC数据集链接开放在文章中,预训练模型已上传Github,环境我使用Colab pro ...
- Pytorch可视化语义分割特征图
简介 深度学习中有时候可视化特征图是必要的,特别是对于语义分割任务,合理分析特征图也许能够发现新的idea!接下来讲解一种Pytorch框架下的可视化方法,这里采取的网络模型为Deeplabv3+,首 ...
- 你了解如何用GAN做语义分割吗
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前 言 本文主要推荐一篇使用GAN来做语义分割的论文. 论文名 ...
- Pytorch深度学习实战教程:UNet语义分割网络
1 前言 本文属于Pytorch深度学习语义分割系列教程. 该系列文章的内容有: Pytorch的基本使用 语义分割算法讲解 本文的开发环境如下: 开发环境:Windows 开发语言:Python3. ...
最新文章
- 陆首群:评人工智能如何走向新阶段?
- 机器学习狗太苦逼了!自动化调参哪家强?
- 数据库 DB database SQL DBMS
- sso登陆劫持漏洞(单点登录劫持,低危)
- python爬app_Python爬虫抓取手机APP的传输数据
- 富士康iPhone生产线自动化进展太缓,所以无法遵守中国的加班条例?
- SSM-水果商城-导入项目-学习-2
- QGroundControl实现多机控制
- win7 开启梦幻桌面
- dell 服务器 非官方网站,教你如何在非官方渠道购买DELL电脑。
- Vue的开发常用的工具有哪些?
- Understanding Deep Image Representations by Inverting Them
- 二分法求解方程的根java_【数值分析】利用二分法和牛顿公式求解方程的根
- XP突然弹出“automation 服务器不能创建对象”的有效解决方法--win10专业版
- 痱子的预防和治疗方法
- 你有哪些独到的识人技巧?
- The Picture of Dorian Gray——17
- 三年的工作-软通动力
- SpringCloud Gateway + Spring Security
- edge for android 6.0,Microsoft Edge for Android v44
热门文章
- 您是否应该始终偏爱xrange()而不是range()?
- 如何获取文件的完整路径?
- 乐行科技获1.08亿元A轮融资,并推出艾特好车
- CSS上下左右居中的几种方法
- github建站之路
- Spring Boot 与DBunit 配合使用
- [Python爬虫] 之三十:Selenium +phantomjs 利用 pyquery抓取栏目
- 织梦dedecms移动版设置二级域名的方法 织梦如何设置m.开头的域名
- Python 2.7 学习笔记 内置语句、函数、标准库
- 让PPT声音播放不再“哑口无言”