异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结

异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结

本赛题任务是对光学遥感图像和SAR(合成孔径雷达)图像进行匹配,是智箭火眼2020挑战赛(https://yuanwangfw.com/hjjtzs/)的其中一题。这次比赛有五个赛道,我开始一直死磕科目一、科目二,后期觉得已无望进入复赛,在最后还有五天的时候尝试了一下科目三,竟想出来一种思路,实现之后效果也还不错,初赛排到二十几名。毕竟参赛时间太短无缘决赛,但这个思路是我完全自己想出来的,觉得有必要总结记录一下。
一、赛题简介
光学图像尺寸为800×800,SAR图像为512×512,都是单通道灰度图,训练集有2350对图片,都给出了对应的位置坐标,初赛一阶段测试集有300对图片,二阶段有714对图片。任务是找出SAR图像在光学图中的位置,两者比例尺相同,也就是说只存在平移,不存在缩放变形等操作。有城市、平原、岛屿、山地等各种地形,由于SAR图像有的有较大噪声比较模糊,任务难度还是很大的。
图1:城市地形光学遥感图像(左)和SAR图像(右)及匹配位置(左图方框)
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第1张图片
图2: 平原地形
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第2张图片
图3:岛屿地形
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第3张图片
图4:山地地形
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第4张图片
二、提取边缘线
我以前没有做过图像匹配任务,由于时间紧,拿到题目后我简单进行了文献查询没有找到直接能用的文献或开源,所以决定自己动手。首先分析,直接做SAR图和光学图的滑窗相似度计算肯定不行,因为对不同的地物两种方式的成像特点有很大不同,不能直接匹配,必须提取出两种图像的某种共同的特征图再进行匹配。我想到了提取边缘线,边缘线匹配对遥感图像有较好的区分度,但由于两种图片成像原理不同,直接使用canny算子或相位一致性算法(相位一致性算法可以百度搜索)提取出的边缘线往往直接对应关系不好。我使用深度学习来训练光学和SAR图像进行一致性的边缘提取,其标签就是对应的光学图像用传统算法(我这里用相位一致性算法提取,效果比canny好一些)提取的边缘线,训练网络使用经典图像分割网络deeplabv3+,对光学图和SAR图分别各自训练一个网络,它们的标签都使用光学图经相位一致性算法得到的边缘线图。
上图3岛屿地形中的光学图经相位一致性算法提取的边缘线:
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第5张图片
上图3岛屿地形中的雷达图经相位一致性算法提取的边缘线:
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第6张图片
上图3中光学图经深度学习提取的边缘线
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第7张图片
上图3中雷达图经深度学习提取的边缘线
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第8张图片
可以看出,经过深度学习提取的边缘线比直接用相位一致性提取的边缘线更加连续,更加突出主要边缘而忽视细小边缘。
得到光学图和SAR图的边缘线之后就可以使用模板匹配的常用算法来搜寻匹配的坐标位置了,我使用的滑窗计算SAR图和光学图的边缘线的iou,选择iou最大的位置作为匹配位置。对于本题,每图按照逐个像素滑窗可以得到288×288点的iou,可以把它可视化以观察效果。本次初赛只需要平移,没有缩放和形变,只需要使用简单的滑窗平移即可,但是缩放和形变情况下的模板匹配也不难,核心难点就是共性特征图的提取。
上图3岛屿地形中雷达图边缘线和光学图边缘线的滑窗iou可视化图,288×288,可以看出匹配位置在右上角最亮点处
异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结_第9张图片

三、进一步精炼以提升匹配精度
上述过程得到的匹配结果仍有一定误差,本题算分是根据预测位置和实际位置的像素距离计算的,如果只使用相位一致性算法提取的边缘线,在测试集二阶段714组图片中的推算平均误差约为3.8像素,使用深度学习提取的边缘线,可以达到平均误差约3.0像素。我又设计了以下机器学习回归算法对匹配位置附近点位进行“精炼”。
算法的主要考虑是上述模板匹配算法仅仅是根据iou最大一个指标进行的寻优,也许信息并不够丰富。基于这个考虑,我设计了以下机器学习回归算法,误差可以再减少1个像素左右。
step1: 在训练集中,对标签位置的光学图切片(即和SAR图完全对照的光学图512×512部分)进行上下左右各5个像素的逐像素平移,这样共可以得到11×11=121个patch图,计算各自坐标和标签坐标的距离作为机器学习的回归的目标值。特征则是计算各个patch图对应的边缘图和SAR的边缘图之间的多种统计数据,除iou外,还包括mse,mae,acc等。使用lightgbm构建模型进行训练,目的是找到标签位置和多个指标之间的复杂关系。
setp2:对于测试集, 把上述“粗炼”过程得到的结果称为proposal point,在光学边缘图的proposal point周围也选择上下左右各5各像素内的滑窗范围,驻像素滑窗可以得到121个patch,再用刚才训练好的lightgbm模型计算出各个图和真实标签位置的距离,选择距离最小的一个作为真实标签。
使用这种精炼方法,在热身训练数据集1500组图中可以达到1.1像素的平均误差,在初赛训练集850组图中可以达到1.5像素的平均误差。在测试集二阶段的714组图中根据提交分推算大约是2.0像素的平均误差,而初赛第1名的平均误差推算下来大约在1.0像素左右。
四、经验教训总结
本次比赛时间很紧,我还走了好几个弯路。
弯路1,我最初的思路是训练两个深度学习网络,各自损失为loss1 = CE(out1,edge) 和 loss2 = CE(out2,edge),再设计一个loss3 = MSE(out1,out2),然后设计总的loss = loss1+loss2+loss3,把这两个网络联合训练,同步训练两个网络的参数。这么考虑的初衷是为了同时保证两个网络都能够逼近边缘线图edge,同时还保证两个网络的输出具有一致性,一致性的目的是后续滑窗计算iou时更加有效。本以为挺好的思路,但实际实现效果是这个混合起来的Loss非常难训练,神经网络具有喜欢“偷懒”的特点,它为了让loss3小,干脆输出两个几乎全黑图out1,out2,而对于loss1和loss2则置之不理。由于开始没有对结果进行可视化观察,实际上浪费了很多时间后才发现这个问题,后来放弃了这个思路,使用的是两个网络分别训练。
弯路2,在机器学习精炼的时候考虑到相位一致性检测得到的边缘线比较粗,因此我又计算了边缘线的骨架图(中心线图)。但是我在计算121个patch的骨架图时,本意是分别计算每一张的骨架,对于121×512×512的patchs张量,直接使用skimage.morphology.skeletonize(patchs)计算了,但实际上这个操作对于三维张量,它计算的是三维骨架图,同时由于我构建标签的时候每次都是把目标位置图放在121图的正中间,这样这个三维骨架图就把121图信息互串,把标签位置信息带到了特征中,就构成了leak。这个leak会导致我训练集验证时仅有不到0.3像素误差的极好效果,一度让我非常兴奋,然而一提交分数却又奇低。意识到有leak之后,仔细分离特征,才终于发现了这个bug。
这次比赛虽然没有获奖,但是我完全用自己的思路实现的,没有借鉴开源,虽然时间短,也投入了极大的精力、毅力来攻克它,我觉得有很多收获和教训。
1,终日所思不如须臾所学,还是要重视学思关系,今后比赛必须要先充分查阅文献和开源,在充分学习现有技术的基础上再做改进和提高,这是正道。
2,创新来源于对细节的深入观察。我之前一些比赛的创新思路也都在对细节深入观察之后才想到的,而这次比赛中由于匆忙一些细节没有细致观察反而导致一些误导,如弯路1中未对结果图进行可视化观察就导致未能较早发现错误。
3,研究问题的过程往往是创新——验证——再创新的循环过程。这个过程的关键是验证,验证必须要做到准确和高效。今后参加比赛要及早搭建一个系统化、客观准确的验证模块。

你可能感兴趣的:(机器学习,计算机视觉,深度学习,计算机视觉,人工智能)