出自论文,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)基于FCN和VGG 改进,同时引出6个loss进行优化训练,通过多个side output输出不同scale的边缘,然后通过一个训练的权重融合函数得到最终的边缘输出。可以solve edge 和物体boundaries的ambiguity

(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都等概率的同时训练,从而使得最终得到比较好的模型。

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

 

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

如下图所示,side-output1-5分别为第1-5个卷积层的输出。Fusion-output为最后一层的输出,Average1-4 为第1-4个卷积的输出求平均,Average1-5,Average2-4,Average2-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.4s,cpu:12s的state-of-the-art结果。

 

 

 

References:

https://github.com/s9xie/hed