轮廓检测论文解读 | 整体嵌套边缘检测HED | CVPR | 2015


主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable

贡献主题:https://github.com/xitu/juejin-markdown-themes

theme: juejin
highlight:

0 轮廓检测

轮廓检测,对我这样的初学者而言,与语义分割类似。分割任务是什么我就不再赘述了,轮廓检测则是完成这样的一个任务:

了解传统图像处理或者opencv的朋友应该都不难看出(想到),“Canny”轮廓提取算子,这个算子简单的说就是对图像的像素值的变化(梯度)进行检测,然后梯度变化大的地方认定为轮廓(上图就是用Canny算子提取的效果)。当然,最近也是用深度学习的方法来做这种轮廓提取,本问介绍的HED就是这样的一个深度学习提取边框的办法,下图是HED提取小狗轮廓的结果图。

1 论文概述

  • 相关论文:《Holistically-Nested Edge Detection》
  • 论文链接:https://arxiv.org/abs/1504.06375
  • 论文年份:2015

今天解读一篇论文,网上已经有一些的解读了,不过讲解的并不细致,让我难以理解,直到看了官方代码才理理顺,所以这篇文章部分搬运,再加上个人补充

整体来说,这个HED边缘检测模型,与Unet分割模型类似,再加上年份较老,所以复现价值不大,大家当扩展知识看看就得了。

Unet我们直接已经讲解过了,用简单的文字来简单的回顾一下:字母U的左半边,是不断卷积池化层进行特征抽取,然后得到不同尺度的特征图,然后U的右半边,通过转置卷积进行上采样,然后与下采样过程中的同尺度拼接做特征融合,然后最终模型输出一个与输入图像相同大小的预测结果。

HED,Holistically-Nested Edge Detection这个模型,其中的亮点在我看来,是对Deep supervision的一种应用。Deep supervision这个概念相比读者应该不陌生,在上上上一篇文章《Unet++》那个文章中我已经提到了,简单的说就是一个模型有多个输出的结构。

2 HED结构

来看下论文中给出的HED的结构图:

这个图可能比较抽象,我来大概讲解一下:

  • 可以看到的是整个过程只有一个卷积+池化的过程,Unet还有上采样的过程,这是不同点;
  • 图中的有5个马的图片,从大到小,从浅到深,纹理越来越少,这分别是经过了maxpool和卷积得到的不同尺寸的输出。从图中可以看到,这些输出叫做side-output 1到side-output 5。
  • 图中这五个特征图经过虚线,得到了一个Y,这个Y是经过“weighted-fusion”得到了,简单的说就是,五个图经过一个可以训练的权重参数,融合成了最终的输出

结构不难理解,但是到这里读者肯定心中仍有疑惑,看完下面的损失函数的构成就通透了。

3 损失函数

这个损失函数算是deep supervision比较常见的损失函数了,就是每一个side-output输出都是损失函数的一部分

整体来说,这个损失函数是有两个部分:

  • side-output:这个就是上图中五个不同尺度的预测结果,通过上采样成原图大小,然后和mask做交叉熵。因为有5个图,所以损失是五个的和;
  • fusion:五个图fusion出得Y,这个Y与ground truth的交叉熵;

所以论文中有这样的损失函数:

我也没注意W,w,h的含义,但是看起来确实是side和fusion两部分损失函数。

这里的Dist其实使用的就是交叉熵

这个side中,除去这个 β \beta β不管,剩下的内容就是二值交叉熵,也许和你常见的那种形式不太一样,但是是一样的。给个提示:看这里的 Σ \Sigma Σ的下标

现在我们对损失函数应该有了一个大致的感觉了,但是仍然有两个疑问:

  1. l o s s s i d e loss_{side} lossside中的 β \beta β是什么?怎么算?
  2. l o s s f u s e loss_{fuse} lossfuse中的 Y ^ f u s e \hat{Y}_{fuse} Y^fuse怎么得到,换言之,如何融合5个side-output?

对于第一个问题 β \beta β是一个平衡系数,

β = ∣ Y − ∣ ∣ Y ∣ \beta = \frac{|Y^-|}{|Y|} β=YY

其中 ∣ Y ∣ |Y| Y表示图像的像素的数量,也就是widthxheight; ∣ Y − ∣ |Y^-| Y表示这个图片中,ground truth的像素的数量,类似与解决预测像素不平衡的一个手段。

假设一张图片中ground truth的像素量少,那么意味着, β \beta β的值小,那么公式(2)中的第一项的权重轻,而第一项的sigma的下标是 Y + Y^+ Y+,说明这个是计算非目标,也就是groud truth=0的损失,也就是背景的损失,数量很多,所以权重轻损失少。 这一点实在不好讲明白,希望大家没理解的多读两遍。

对于第二个问题,论文中给出了公式:

这个h应该是一个可以训练的参数,然后加和之后用sigma归一化。

4 损失函数 TF

现在万事俱备,官方提供了代码,来看一下这个损失函数的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的写法,不过大概能看懂把,细节不懂但是英文单词总是没问题的,整体来看,跟我们上面讲解的差不多把。

5 总结

这里谈一谈我看了这个2015年的老前辈模型的收获把:

  1. HED是一个边缘检测模型,但是使用的和Unet的框架有些类似。HED使用了deep supervision的方法,而Unet并没有,这里我突然想到Unet++ 的结构,Unet++的思想完全可以沿着Unet+HED这条线路诞生。
  2. 我们学到了一个deep supervision的损失函数的写法;
  3. 我们学到了一个单词Holistically-nested。holistically 整体地,nest 嵌套

参考文章:

  1. https://zhuanlan.zhihu.com/p/35694372
  2. https://zhuanlan.zhihu.com/p/36660932
  3. https://www.zhihu.com/question/31864895
  4. https://arxiv.org/abs/1504.06375
  5. https://blog.csdn.net/u014779538/article/details/92765963

http://www.niftyadmin.cn/n/1358335.html

相关文章

轮廓检测论文解读 | Richer Convolutional Features for Edge Detection | CVPR | 2017

有什么问题可以加作者微信讨论,cyx645016617 上千人的粉丝群已经成立,氛围超好。为大家提供一个遇到问题有可能得到答案的平台。 0 概述 论文名称:“Richer Convolutional Features for Edge Detection”论文链接:https://opena…

学习笔记2.1

Step1:库函数导入 ## 基础函数库 import numpy as np ## 导入画图库 import matplotlib.pyplot as plt import seaborn as sns## 导入逻辑回归模型函数 from sklearn.linear_model import LogisticRegressionStep2:模型训练 ##Demo演示LogisticRegression分类## 构造数据集 …

图像处理论文详解 | Deformable Convolutional Networks | CVPR | 2017

文章转自同一作者的微信公众号:【机器学习炼丹术】 论文名称:“Deformable Convolutional Networks”论文链接:https://arxiv.org/abs/1703.06211 0 前言 首先理解: deformable Convolution可变卷积针对的对象是卷积本身&…

pytorch实现 | Deformable Convolutional Networks | CVPR | 2017

文章转载自微信公众号:【机器学习炼丹术】,请支持原创。 这一篇文章,来讲解一下可变卷积的代码实现逻辑和可视化效果。全部基于python,没有C。大部分代码来自:https://github.com/oeway/pytorch-deform-conv 但是我研…

卷积涨点论文 | Asymmetric Conv ACNet | ICCV | 2019

文章原创来自作者的微信公众号:【机器学习炼丹术】。交流群氛围超好,我希望可以建议一个:当一个人遇到问题的时候,有这样一个平台可以快速讨论并解答,目前已经1群已经满员啦,2群欢迎你的到来哦。加入群唯一…

卷积网络可解释性复现 | Grad-CAM | ICCV | 2017

觉得本文不错的可以点个赞。有问题联系作者微信cyx645016617,之后主要转战公众号,不在博客园和CSDN更新。 论文名称:“Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization”论文地址:https://op…

注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现

文章转自微信公众号:【机器学习炼丹术】 参考目录: 文章目录0 概述1 主要内容1.1 Non local的优势1.2 pytorch复现1.3 代码解读1.4 论文解读2 总结论文名称:“Non-local Neural Networks”论文地址:https://arxiv.org/abs/1711.07…

图像质量评估论文 | Deep-IQA | IEEETIP2018

主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green, qklhk-chocolate 贡献主题:https://github.…