基于DeepLabv3的遥感图像语义分割教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于DeepLabv3的遥感图像语义分割教程
基于DeepLab v3的遥感图像语义分割教程
前⾔
前两个⽉做过⼀次基于Unet的遥感图像语义分割教程,效果较差。
这次选⽤⼀个稍微新⼀点的模型,再跑⼀次相同的数据集,加上迁移学习的技巧,看看效果怎么样。
教程准备
1. 开源的图像语义分割DeepLabv3代码(⼆分类)
2. DeepLabv3+基本原理(借鉴)
核⼼代码
1. dataloader
数据读取部分,最值得注意的就是images和labels的数据格式,⽂件读取的⽅法倒是次要的,千篇⼀律。
这⾥我们读取的图像依旧是上次的数据集,images是(3 X 256 X 256)的RGB图像,labels是0、1、2、3...7的单通道灰度图(256 X 256),记得读取的时候⽤GRAY_SCALE模式。
数据的预处理部分,将images数据集做归⼀化处理(也可再加上标准差处理),转化成0~1的tensor;将labels转化成long型,这⾥设置long是因为后⾯的损失函数CrossEntropyLoss需要标签是Long的格式,如果⽤MSELoss的损失函数,那么⽤float格式,数据⼤⼩范围不做调整,转换成tensor即可。
2. model(transfer learning)
model⽤的是DeepLab v3模型,backbone是Resnet101模型。
在此基础上进⾏迁移学习,可以得到更好的效果。
下⾯给出了DeepLab v3+模型的源码,与v3⼤同⼩异,⽹络结构本⼈不做解释。
加载完Resnet101模型的参数后,替换最后⼀层为新的outputchannels。
常⽤迁移学习代码:
2. Training
这⾥的重点主要是看模型输出的数据维度。
可以看到outputs['out']是没有经过概率化的数组,数组的维度是(batchsize X category X height X width),⽽label的维度是(batchsize X height X width)。
在损失函数为nn.CrossEntropyLoss()的情况下,label的维度中不需要category的1维,如果有的话进⾏sequeeze;损失函数为nn.MSELoss的情况下,label的维度是(batchsize X 1 X height X width)。
每次epoch结束,保存该过程中最好的模型参数。
这⾥有点疑问:nn.CrossEntropyLoss对样本做了概率化处理再计算损失;那么nn.MSELoss呢?这个是不是⼆分类、多分类都可以⽤,是不是也对样本做了概率化处理呢?
3. choose cost func/optimizer
除了前述的损失函数之外,这⾥还需要定义优化器。
此外还有两个计算指标,f1_score和accuracy_score,其中accuracy_score⽤来计算多类别预测中成功的百分⽐,roc_auc_score是⼆分类中使⽤的指标,这些⽅法源于sklearn.metrics。
结果
10个epoch下的结果...⽤的训练集,还是不咋地。
指标变化图
预测类型分布
结果对⽐
后记
1. nn.MSELoss需要了解了解,弄清楚这些损失函数做的计算处理和要求输⼊的数组维度。
2. 这⾥⽤了f1_score和auccracy_score两个指标。
只看了后者的,前者没关⼼。
3. click库输⼊参数的⽅法看起来⽐argparse.ArgumentParser()还简单。
4. ⼀般来说,还需要调整epochs/batchsize/lr/gamma来调参。
5. 6G显存不够啊,想换新显卡了。
6. 有空介绍⼀下时间序列分析(RNN、LSTM)相关的模型,ConvLSTM这类图像时序模型看起来挺有意思的,看看能不能找到源码吧。