边缘检测之HED

出自论文,Holistically-Nested Edge Detection ,ICCV2015,Marr奖提名,非常值得看的一篇。

边缘检测的工作分为以下3个研究方向:

(1)传统的检测算子:Sobel ,Canny

(2)基于信息理论设计的手工特征:Statistical Edges ,Pb ,gPb

(3)基于学习方法设计的手工特征:BEL , Multi-scale , Sketch Tokens, Structured Edges

  

从上图中可以看出,canny检测会存在断开线的情况,而HED基本没有这种现象,HED的效果明显优于canny


整体嵌套的边缘检测holistically-nested edge detection (HED) 。

insight 

(1)端到端:image-to-image

(2)基于FCNVGG 改进,同时引出6loss进行优化训练,通过多个side output输出不同scale的边缘,然后通过一个训练的权重融合函数得到最终的边缘输出。可以solve edge 和物体boundariesambiguity

(3)样本不平衡处理方法:class-balanced_sigmoid_cross_entropy



网络整体结构:


作者在conv1_2, conv2_2, conv3_3, conv4_3,conv5_3后面分别引出,然后接入sigmoid_cross_entropy_loss,并且在最后一层,对上面的5层的输出做了concat,同时也接入sigmoid_cross_entropy_loss,这样所有的Loss都等概率的同时训练,从而使得最终得到比较好的模型。

这里一个需要注意的就是,这里6loss是同时训练的,如果只训练最后一个loss,精度会有所下降。

在预测阶段,可以直接取最后一层的输出结果最为最终结果。也可以将所有的层的输出结果都得到,然后求一个平均作为最终结果。这样做的优势就是会使得精度进一步提高,缺点就是加入额外操作,时间会增加。

如下图所示,side-output1-5分别为第1-5个卷积层的输出。Fusion-output为最后一层的输出,Average1-4 为第1-4个卷积的输出求平均,Average1-5Average2-4Average2-5, 依次类推。Merged result为所有层的结果求平均合并后的结果。

可以看出,

(1) 对于每个单独的层,最后一层做过特征融合后的结果是最好的。

(2) 将所有层的结果求平均,对最终准确率会有提升。

训练过程中,由于边缘检测实际是对每个像素进行2分类任务。大部分像素为非边缘,只有少部分像素为边缘,为了进行正负样本的平衡,这里作者引入了class-balanced_sigmoid_cross_entropy

上图为作者论文中的公式,作者这里没有将label的数值y_hat写进去。进行整理如下。

sigmoid_cross_entropy:

-y_hat* log(sigmoid(y)) - (1 - y_hat) * log(1 - sigmoid(y))

Class_balanced_sigmoid_cross_entropy:

-β*y_hat* log(sigmoid(y)) -(1-β) * (1 - y_hat) * log(1 - sigmoid(y))

其中,|Y-|为边缘的label|Y+|为非边缘的label

β = |Y-|/|Y|

1 - β = |Y+|/|Y |

最终,论文实现了BSD500 dataset (ODS F-score of :782),NYU Depth dataset (ODS F-score of :746) gpu:0.4scpu:12sstate-of-the-art结果。

References:

https://github.com/s9xie/hed



猜你喜欢

转载自blog.csdn.net/qq_14845119/article/details/79476537