这是一篇边缘检测的文章,边缘检测跟semantic segmentation有点类似,边缘检测就是把边缘设置为1,其他的为0;而semantic segmentation只是把边缘内部为1,而外部为0。如果我们把边缘检测出来,只要把内部设置为1,外面设置为0就可以得到semantic segmentation的结果。因而,了解边缘检测对语义分割还是有所帮助的。并且,这两个任务存在一定程度的不同之处,那么可以使用一个任务进行预训练模型,再用预训练好的模型去训练另外一个模型,或者将把另外一个任务作为侧监督,上述两种方法在某些医疗图像中已经验证了具有一定的效果。
1. Holistically-Nested Edge Detection
作者的贡献点集中在两个方面:(1)采用deep supervision指导后半部分的层,(2)将后半部分的不同层的结果(shape不一样)分别进行上采样,并将各个层的结果进行融合(一种方法是将各个层的上采样输出值求average,另外一个将各个层上采样的输出值concatenate在一起然后再经过卷积得到最后的输出)
1.1 Existing multi-scale and multi-level NN
(a)将同一个输入进过不同个数的卷积层,然后将输出合并再经过一个卷积得到最后的输出。
(b)将一个输入经过多个卷积核,并将每个卷积核的输出结果concatenate在一起,在经过一个卷积得到输出。(a)和(b)差别在于(a)是横向的,而(b)是纵向的。
(c)将输入先resize成不同大小的shape然后再放进去卷积层。
(d)将一个输入经过多个不同个数的卷积,然后将对结果进行ensemble。
(e)作者提出来的方法,对于一个输入,经过连续的卷积层,将每一层的结果保存下来进行ensemble得到第一个输出,同时将每一层的结果concatenate在一起再过一个卷积核得到第二个输出,最后将两个输出在ensemble在一起得到最后的结果。
ps:这里的ensemble用的都是average。
1.2formulation
考虑到边缘的pixel个数很少,所以数据的类别不平衡十分严重,作者采用了加权的cross-entropy作为损失函数。
这里beta作为损失函数的权重,其利用正负样本在总样本的权重来作为损失函数的权重。optimize过程为:
这里W代表主干网络的参数,w则是将不同层的结果进行upsample对应的网络参数,b则是将不同层的结果concatenate在一起然后经过一个卷积得到最后的输出时候的卷积网络的参数。
2.实验
可以看出将不同层的结果进行融合可以取得明显的提升,同时对于不同层的输出结果加上侧监督也有帮助。
从上表可以看出,虽然第一层输出结果与Groud Truth差别很大,但是在求avg的时候,如果仅仅统计中间三层的output,会比统计所有输出层的结果更差,这一点值得我们警惕。