踩坑实录——多光谱影像(.tif)输入深度学习网络训练

项目场景:

从github下载了fastercnn_Resnet50的目标识别网络,尝试把多光谱影像数据集(.tif)输入进去进行训练,由于本人是刚接触深度学习的小白,网上又没有找到相关教程,只能一边DEBUG一边理解。


问题描述:坑1

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第1张图片


原因分析:

经过百度可以知道这错误是因为PIL不支持.tif多波段图像的读取导致的。在修改网络的时候我有一个原则,就是不修改第三方库的源码,原因是因为我个人功力不够,所以不敢轻易修改。根据报错提示我定位到my_dataset.py文件的image = Image.open(img_path) 这个位置
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第2张图片
在这个位置我们可以看到使用PIL模块对图像进行读取的,返回的是一个Image对象,然后在后面一段代码中,我发现Image对象是经过了transforms这个地方后被转换为张量了

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第3张图片顺藤摸瓜,找到这个transforms.py,发现是利用tochvision.transforms.ToTensor()这个函数把Imges对象转为Tensor。在研究transforms.ToTensor()这个函数的时候,发现输入可以是PIL.Image对象或numpy.ndarray对象,因此我只需要在ToTensor()这个函数之前把多波段影像转换为numpy.ndarray进行输入就可以了。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第4张图片


解决方案:

所以,坑1的解决方案就很明确了。我们找到自定义数据集的数据读取的文件my_dataset的__getitem__方法,把原来的image = Image.open(img_path) 改成自己写的方法,我这里用的是gdal,重新写了对多光谱波段的读取方法,返回值是ndarray。具体实现过程请移步到这里。

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第5张图片
这样子这个坑就填完了,我们喝杯水休息一下,然后运行程序,继续下一个坑。

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第6张图片



问题描述:坑2

在这里插入图片描述


原因分析:

这个错误我看到448,我记得我的tif图像的维度应该是6 * 448 * 448,但是这里提示第一个448,经过一段时间的DEBUG,最后把错误锁在了自己上一步写的读取图像的方法。原因是GDAL读取影像和cv2读取影像有点类似,原本图像应该是【6,448,448】,但是GDAL和cv2读取的时候是【448,6,448】。所以只需要把维度变换一下,变成【C,W,H】即可。


解决方案:

在transforms.py文件中,找到这个类,把张量的维度进行变换。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第7张图片



问题描述:坑3

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第8张图片


原因分析:

修改了坑2之后还出现这个问题让我非常无奈。没办法,又是一步步DEBUG,最后把问题锁定在self.image_mean和self.image_std这两个变量,经过一段时间的百度后才了解,这是用于图片去均值化操作的变量。顺藤摸瓜后找到了这两个变量定义的位置,就在faster_rcnn_framework.py这个文件中,可以看到现在image_mean和image_std这两个变量都只有三个,分别是RGB通道的均值和方差,这里的参数是网上ImageNet数据集的参数。因此我需要在这里补充我另外三个通道的参数。关于如何计算栅格图像各个波段的均值和方差,我在另一篇博文里有写,需要的可以出门右拐去看。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第9张图片


解决方案:

好了,在我算出其他三个波段的均值和方差后就可以补充上去了,算出的均值和方差记得要做归一化处理(除以255)。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第10张图片



问题描述:坑4

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第11张图片


原因分析:

这个坑是我最最最容易找到的解决方法的一个坑,因为我一直知道model文件需要修改输入的图片的波段数量。所以我看到模型文件resnet50_fpn_model.py有报错的时候,我第一时间就找到问题所在,我的猜想没有错,只需要把Resnet网络的输入通道修改为和输入图片的通道数量一致即可。


解决方案:

把这里改成6。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第12张图片



问题描述:坑5

这个坑真的是很难发现,因为他在第三方库里的源码,但是功夫不负有心人啊,终究还是让爷给找到了。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第13张图片


原因分析:

因为网络在训练的时候,会把所有的张量都做归一化后再扔进去网络里面。又因为默认的图片都是RGB格式的,所以这个函数直接除以255做了归一化处理。但是我们的波段值域并非都在【0,255】这个范围。


解决方案:

这个解决只能在数据预处理部分去做了,只需要把其他波段的数据都映射到【0,255】的范围就可以了,这个操作在我另一篇博文里有介绍,请移步!



问题描述:坑6

踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第14张图片


原因分析:

这个坑也很好理解,原因就是预训练模型的参数与我们要训练的模型参数的数量不匹配。原因应该就是我们通道数变了,网上预训练的权重几乎都是RGB三通道的权重。


解决方案:

解决方法就是不要载入预训练参数,或者要找到适合你模型的预训练参数。也就是说很难实现迁移学习了。呜呜呜。。。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第15张图片



问题描述:坑7,脏数据(大坑)

这个坑就是出现 loss is Nan,stop training,这个坑可把我逼疯了,在百度的过程中,因为出现这个原因太多太多了。我随便给一篇给大家观摩一下。

https://blog.csdn.net/m0_52571323/article/details/112122263?ops_request_misc=&request_id=&biz_id=102&utm_term=loss%20is%20nan&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-112122263.pc_search_result_before_js&spm=1018.2226.3001.4187


原因分析:

因为导致这个问题出现的原因是在是太多了,我一度想要放弃。后来打了一把王者放松放松后开始思考,我之前一直跑模型的时候都没出现过这个坑,那证明参数应该不会有问题,直到我看到脏数据也会导致这个情况发生,我才顺着这个思路下去。因为Tensor里面不能出现NAN值和除数为0的情况。外加我之前在打标签的时候发现影像出现白点,结果我在arcgis再看了一下。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第16张图片


解决方案:

结果很明显了,我随后把蓝色波段去掉,重新生成了一批新的数据进行训练,然后模型就快乐地跑起来了。
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第17张图片


总结

在使用自定义的数据集的时候,脏数据的情况是很常见的,这让我想起了在用网上典型的数据集快乐的奔跑的时候,那时候不用想这么多,只是专心理解网络架构和算法就好。
下周开始自己写模型,希望不会被折磨的太惨。TvT…
踩坑实录——多光谱影像(.tif)输入深度学习网络训练_第18张图片

你可能感兴趣的:(深度学习,遥感影像处理,python,网络,pytorch)