-
前处理(待补充) 端对端的语义分割网络(Semantic net),目前使用的是deeplab v2。
-
后处理 输入为网络的预测结果(Semantic net output),对其进行边缘滤波(用任一边缘检测算子即可,如sobel算子),得到边缘图(Edge map),再通过漫水算法(water filing)分离开每个建筑的轮廓(Separated contour) 。
直接提取神经网络预测语义类间的边界,作为算法初始状态。这一步原本使用的是原图边缘提取(canny)的结果,现更新为语义边缘,主要原因有二:
- 网络边缘连续性好,可以区分开建筑物实例。
- 语义边缘准确率更高,防止噪声的增加。
从边缘图(Edge map)中依次找到每个建筑物的轮廓,进行均匀取点,将每个建筑物的边缘点坐标存储为有序二维点集,作为snake算法的初始多边形坐标。在这一步,对于过小的轮廓应被舍弃。目前设置的是一个建筑物轮廓的总像素点10个像素以内就看作是噪声。八连通方式的像素间隔每隔4个单位距离进行一次采样,将顶点加入有向边缘轮廓集合中,备snake使用。
参数名 | 设置值 |
---|---|
最小轮廓 | 0 |
采样距离 | 4 |
- 前处理(待补充)
端对端的语义轮廓检测网络(Edge net),目前使用的是hed网络。
- 后处理
输入为网络的预测结果(Edge net output),对于其进行融合(fusion)和阈值(thresholding)操作,之后进行非极大抑制处理(nms),以及图像形态学操作(morphing),得到非极大抑制的结果(NMS result)。
参数名 | 设置值 |
---|---|
融合操作 | 目前暂未设置,直接使用hed网络的fusion层结果 |
门限 | 0 |
神经网络预测结果为灰度图, 其灰度代表该点是边缘的概率。 算法目前使用的是神经网络的混合层的结果,没有设置门限(网络共有5个层级的输出,以及1个全连接层混合的输出)。在后续实验中,可将门限设置为128,并采用更合理的方式使用多层级信息(如投票法等),对比统计对实验结果的影响。
参数名 | 设置值 |
---|---|
edge map膨胀系数 | 3 |
形态学操作 | bridge两次 |
神经网络的结果不能直接取门限二值化,需要利用非极大抑制和图像形态学的方法,使结果更贴近真实的边缘。在之前的实验中也看到,nms是准确率(precision)最高的初始结果,因此将其作为snake算法的收敛目标,即外部能量图。 图像形态学方法尝试了开闭运算,效果很不好,因为nms的结果散点太多,不能很好拟合成线,因此与canny算法一样,也对非极大抑制的结果采用了两次连接运算(bridge),作为snake算法的外部能量图。
对于左分支的每个建筑物轮廓进行snake操作,在初始化snake多边形的时候,需要以每个轮廓的重心作为膨胀中心,将坐标点向外扩展10-20%,以保证轮廓全部在能量图的外侧。其外能量图为右分支的输出,迭代得到最终的建筑物轮廓检测结果。
在snake参数调整的过程中发现规律如下:对于一个好的收敛结果,曲线的一阶参数需要尽量小(1-20),二阶参数需要尽量大(50-100),外部力参数保持最大即可(100)。
参数名 | 设置值(当前值) |
---|---|
曲线一阶参数(ialpha) | 1 |
曲线二阶参数(ibeta) | 100 |
外部能量参数(igamma) | 100 |
搜索范围(size.width/size.height) | 21 |
迭代次数(criteria.max_iter) | 500 |
迭代步长(criteria. epsilon) | 0.2 |
将每个建筑物轮廓的snake算法结果合成,在原始图像上可视化。
#3.算法效果
snake算法结果
ground truth