轮廓检测,对我这样的初学者而言,与语义分割相似。分割任务是什么我就再也不赘述了,轮廓检测则是完成这样的一个任务:
vue
了解传统图像处理或者opencv的朋友应该都不难看出(想到),“Canny”轮廓提取算子,这个算子简单的说就是对图像的像素值的变化(梯度)进行检测,而后梯度变化大的地方认定为轮廓(上图就是用Canny算子提取的效果)。固然,最近也是用深度学习的方法来作这种轮廓提取,本问介绍的HED就是这样的一个深度学习提取边框的办法,下图是HED提取小狗轮廓的结果图。
python
今天解读一篇论文,网上已经有一些的解读了,不过讲解的并不细致,让我难以理解,直到看了官方代码才理理顺,因此这篇文章部分搬运,再加上我的补充。git
总体来讲,这个HED边缘检测模型,与Unet分割模型相似,再加上年份较老,因此复现价值不大,你们当扩展知识看看就得了。github
Unet咱们直接已经讲解过了,用简单的文字来简单的回顾一下:字母U的左半边,是不断卷积池化层进行特征抽取,而后获得不一样尺度的特征图,而后U的右半边,经过转置卷积进行上采样,而后与下采样过程当中的同尺度拼接作特征融合,而后最终模型输出一个与输入图像相同大小的预测结果。markdown
HED,Holistically-Nested Edge Detection这个模型,其中的亮点在我看来,是对Deep supervision的一种应用。Deep supervision这个概念相比读者应该不陌生,在上上上一篇文章《Unet++》那个文章中我已经提到了,简单的说就是一个模型有多个输出的结构。框架
来看下论文中给出的HED的结构图:ide
这个图可能比较抽象,我来大概讲解一下:函数
结构不难理解,可是到这里读者确定心中仍有疑惑,看完下面的损失函数的构成就通透了。学习
这个损失函数算是deep supervision比较常见的损失函数了,就是每个side-output输出都是损失函数的一部分。spa
总体来讲,这个损失函数是有两个部分:
因此论文中有这样的损失函数:
我也没注意W,w,h的含义,可是看起来确实是side和fusion两部分损失函数。
这里的Dist其实使用的就是交叉熵
这个side中,除去这个\(\beta\)无论,剩下的内容就是二值交叉熵,也许和你常见的那种形式不太同样,可是是同样的。给个提示:看这里的\(\Sigma\)的下标
如今咱们对损失函数应该有了一个大体的感受了,可是仍然有两个疑问:
对于第一个问题,\(\beta\)是一个平衡系数,
其中\(|Y|\)表示图像的像素的数量,也就是widthxheight;\(|Y^-|\)表示这个图片中,ground truth的像素的数量,相似与解决预测像素不平衡的一个手段。
假设一张图片中ground truth的像素量少,那么意味着,\(\beta\)的值小,那么公式(2)中的第一项的权重轻,而第一项的sigma的下标是\(Y^+\),说明这个是计算非目标,也就是groud truth=0的损失,也就是背景的损失,数量不少,因此权重轻损失少。 这一点实在很差讲明白,但愿你们没理解的多读两遍。
对于第二个问题,论文中给出了公式:
这个h应该是一个能够训练的参数,而后加和以后用sigma归一化。
如今万事俱备,官方提供了代码,来看一下这个损失函数的TF版本:
def class_balance_sigmoid_cross_entropy(logits,label,name='cross_entropy_loss'): y = tf.cast(label,tf.float32) count_neg = tf.reduce_sum(1.-y) count_pos = tf.reduce_sum(y) beta = count_neg/(count_neg+count_pos) pos_weight = beta/(1-beta) cost = tf.nn.weighted_cross_entropy_with_logits(logits,y,pos_weight) cost = tf.reduce_mean(cost*(1-beta),name=name) return cost cost = class_balanced_sigmoid_cross_entropy(dsn_fuse, annotation_tensor) + \ class_balanced_sigmoid_cross_entropy(dsn1, annotation_tensor) + \ class_balanced_sigmoid_cross_entropy(dsn2, annotation_tensor) + \ class_balanced_sigmoid_cross_entropy(dsn3, annotation_tensor) + \ class_balanced_sigmoid_cross_entropy(dsn4, annotation_tensor) + \ class_balanced_sigmoid_cross_entropy(dsn5, annotation_tensor)
可能有的朋友看不懂TF的写法,不过大概能看懂把,细节不懂可是英文单词老是没问题的,总体来看,跟咱们上面讲解的差很少把。
这里谈一谈我看了这个2015年的老前辈模型的收获把:
参考文章: