AstarLight / Satellite-Segmentation

615 stars 233 forks source link

关于该git代码与训练集问题的相关解释 #57

Open Shikairan opened 4 years ago

Shikairan commented 4 years ago

关于该git我收到许多疑问与求助,这里我需要声明一下本人不是该git的作者。 该git代码unet部分是没有问题的,可以使用,注意一下shape中channel的顺序就行。 但是segnet部分建议不要使用,因为segnet模型是需要在pooling时记住pooling index的,然后在upsampling的时候借用pooling index去恢复图像,keras是在upsampling的时候是没有根据pooling index去特定恢复的功能,这里需要自己用tf去写一个pooling与upsampling。

其次,git里的训练数据集是有问题的。有兴趣的可以打开一张训练图与标记图去看看,建筑的标记及其不准确,有的顺带将大楼阴影标记为建筑,有的将道路上的树木标记为建筑,有的将一个建筑的一半标记为建筑另一半是标记为道路的,而且标记的边缘极其粗糙,经常会带着一些一些奇奇怪怪的东西一并标记成建筑。这也能解释为什么评论里到处都是问准确率的问题,拿着一个有问题的训练集当然训练不好。

最后需要指明一点的是,这个代码所需要的GPU性能还是挺高的,尤其是显存要求。我自己的使用数据集(每张图256-256-3,共50000张图)在12GB的P100下(NVIDIA-SMI 430.26 ;Driver Version: 430.26;CUDA Version: 10.2),BS=64的unet模型就能吃满显存,BS=67下就能直接报显存爆的了错误。修改后的Segnet,在BS=17下就能爆显存。所以显卡内存不足的“道友”想要训练模型请做好心理准备。


训练最佳结果与训练时间: Segnet建筑识别最佳结果:loss:0.144, 训练精度:0.9479,验证集精度:0.9423 BS=16,epoch=30,每epoch需要30分钟,共大约15小时训练完,验证集精度在前9轮从86%收敛到91%,后续21轮从91%收敛到94%。最佳模型出现在第30轮epoch。

Segnet道路识别最佳结果:loss:0.068, 训练精度:0.9817,验证集精度:0.9800 BS=16,epoch=30,每epoch需要30分钟,共大约15小时训练完,验证集精度在第一轮就收敛到94%,后续29轮在验证精度95%-98%之间震荡。最佳模型出现在第2轮epoch。

Unet建筑识别最佳结果:loss:0.157, 训练精度:0.9391,验证集精度:0.9365 BS=64,epoch=30,每epoch需要5分钟,共大约2个半小时训练完,验证集精度在第一轮就收敛到90%,后续29轮在验证精度90%-94%之间震荡。最佳模型出现在第27轮epoch。

Unet道路识别最佳结果:loss:0.110, 训练精度:0.9729,验证集精度:0.9726 BS=64,epoch=30,每epoch需要5分钟,共大约2个半小时训练完,验证集精度在第一轮就收敛到95%,后续29轮在验证精度95%-98%之间震荡。最佳模型出现在第13轮epoch。 高分图像的建筑道路识别


最后说明一点,我没法公布保密数据集,所以要数据集的同志抱歉了。

wcl6 commented 4 years ago

请问您的Unet模型是每个类单独训练一个模型吗?如果同时训练多个模型合适吗?可以的话怎么去做?

panyinyin commented 4 years ago

请问您的Unet模型是每个类单独训练一个模型吗?如果同时训练多个模型合适吗?可以的话怎么去做?

我也想问这个问题

panyinyin commented 4 years ago

想问一下unet模型怎么跑多分类呀,里面那个classes的变量如何应用呢

zy1139069091 commented 4 years ago

@Shikairan 我跑出来的unet模型训练和验证准确率都是90%多,用模型进行预测时发现几乎什么都被识别为建筑物,数据集是用的自己的数据集。请问我这是数据集的问题吗,还是模型本身有问题

zhanglei961120 commented 4 years ago

@Shikairan 我跑出来的unet模型训练和验证准确率都是90%多,用模型进行预测时发现几乎什么都被识别为建筑物,数据集是用的自己的数据集。请问我这是数据集的问题吗,还是模型本身有问题

你好,我也遇到了同样的情况,请问你找到原因了吗?我是做水体识别,然后预测结果显示大量建筑物和道路被识别为水体。

Sept-Oct commented 3 years ago

@Shikairan 我跑出来的unet模型训练和验证准确率都是90%多,用模型进行预测时发现几乎什么都被识别为建筑物,数据集是用的自己的数据集。请问我这是数据集的问题吗,还是模型本身有问题

你好,请问你是做的多分类吗?我在用unet训练时loss一直为负,acc一直0.33左右,能交流一下为什么吗?谢谢,期待回复。

panyinyin commented 3 years ago

loss为负估计是多分类的节点没设置好吧,我之前也有过这个问题

------------------ 原始邮件 ------------------ 发件人: "AstarLight/Satellite-Segmentation" <notifications@github.com>; 发送时间: 2020年12月16日(星期三) 中午11:49 收件人: "AstarLight/Satellite-Segmentation"<Satellite-Segmentation@noreply.github.com>; 抄送: "1948954467"<1948954467@qq.com>;"Comment"<comment@noreply.github.com>; 主题: Re: [AstarLight/Satellite-Segmentation] 关于该git代码与训练集问题的相关解释 (#57)

@Shikairan 我跑出来的unet模型训练和验证准确率都是90%多,用模型进行预测时发现几乎什么都被识别为建筑物,数据集是用的自己的数据集。请问我这是数据集的问题吗,还是模型本身有问题

你好,请问你是做的多分类吗?我在用unet训练时loss一直为负,acc一直0.33左右,能交流一下为什么吗?我qq1940263484,谢谢,期待回复。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

zhgv commented 3 years ago

自己用tf去写一个pooling与upsampling?该怎么写呢?