zoukankan      html  css  js  c++  java
  • Holistically-Nested Edge Detection 论文总结

    主要工作

    提出了一种整体嵌套边缘检测网络(Holistically-Nested Edge Detection,HED),用于自然图像的边缘以及物体边界的检测。首先将 VGG 网络的第五层卷积以后的池化层以及所有全连接层全部删除,剩下的部分作为基础网络。然后将五个卷积层输出的特征图分别上采样至输入图像大小,从侧边输出边缘预测图像,与标签图像进行误差计算和反向传播,形成深度监督。再将以上五个输出边缘预测图进行特征融合,得到更精确的边缘预测图像,也进行误差计算和反向传播。最后在 BSD500 以及 NYUD 数据集上进行了测试。结果表明该方法在 BSD500 和 NYUD 上分别取得了 0.782 和 0.746 的 ODS F-score ,性能表现上远超过现有最先进的方法;同时在运行速度上也快其他 CNN 方法几个数量级,平均每幅图预测只需要 0.4s。

    网络结构

    HED 的网络结构设计时,主要考虑了以下几个方面的问题:

    • 根据经验,对于边缘和物体边界检测,通常需要从不同层级、不同尺度进行视觉感知,因此网络设计时需要兼顾这两个关键点;

    • 当网络层数较深时,会给训练带来困难。

    综合以上问题和现有的 VGG 网络以及深度监督方法,作者设计出了 HED 的主体架构。

    • VGG 结构改造。VGG 在图像分类任务上已经被证明了具有强大学习能力,因此在 VGG16 网络上进行改进。对于五个卷积层,分别将 Conv1-2Conv2-2Conv3-3Conv4-3Conv5-3 这五个阶段的特征图通道数压缩到 1 ,并上采样到输入图像尺寸大小,激活后输出边缘预测图。对于 Conv5-3 之后的池化层以及全连接层,将他们全部删除,以减少参数量,加快训练;并且卷积次数太多,导致最终的特征图很小,如果再进行上采样的话,会使得图像的边缘变得十分模糊,所以索性将他们全部删除掉。这样下来,得到了多尺度和多层级的边缘预测图。

    • 深度监督。但是,如何确保侧边输出的预测图一定是我们想要的边缘图像?为了解决这个问题,将标签图分别与各侧边输出图计算误差和反向传播,这样形成一种深度监督。网络只有让侧边输出的图像尽可能的像标签图像,才会逐渐收敛,否则就惩罚它。

    • 特征融合。五个侧边输出图像来自于五个卷积层,这些卷积层是具有层级关系的,层数越深,网络的分类特征越丰富,所以五个输出边缘预测图边缘特征逐渐精细。为了更进一步的充分发挥这五个侧边输出的作用,将他们做一个特征融合,即首先将输出预测图堆叠到一起,做一个卷积,让网络去学习合适的权重,对这几个特征图进行加权融合,从而输出一个更精细的边缘预测图。

    损失函数

    根据前面所设计的网络结构,网络进行了侧边输出以及融合输出,因此对应的损失值计算也来自这两部分。

    对于五个侧边输出,类似于图像分割,因此考虑使用二进制交叉熵(Binary Cross Entropy,BCE)进行计算。但边缘检测的图像与图像分割图像有很大差异,图像中作为边缘的像素数目非常少,而绝大多数的其他像素都是非边缘的,这就存在一个类不平衡问题。不可以直接使用 BCE ,否则网络得不到足够的训练,更倾向于将像素预测为非边缘的,以获得更低的损失值,但这是我们不想要的,我们希望网络对边缘像素预测的更准一点。因此作者引入一个权重 (eta) ,来平衡损失值。分别统计数据集中边缘像素和非边缘像素的总数,对于预测为边缘像素的,其损失值乘以一个非边缘像素占总像素的比值,同理,预测为非边缘像素的,也乘以一个边缘像素占总像素的比值。这样实现类平衡调整。即

    [ell _{{ ext{side}}}^{left( m ight)}left( {{mathbf{W}},{{mathbf{w}}^{left( m ight)}}} ight) = - eta sumlimits_{j in {Y_ + }} {log Pr left( {{y_j} = 1left| {X;{mathbf{W}},{{mathbf{w}}^{left( m ight)}}} ight.} ight)} - left( {1 - eta } ight)sumlimits_{j in {Y_ - }} {log Pr left( {{y_j} = 0left| {X;{mathbf{W}},{{mathbf{w}}^{left( m ight)}}} ight.} ight)} ]

    [eta = left| {{Y_ - }} ight|/left| Y ight| ]

    [1-eta = left| {{Y_ + }} ight|/left| Y ight| ]

    对于融合后的输出,直接使用交叉熵计算损失值。

    [mathcal{L}_{ ext{fuse}}(oldsymbol{ m{W}},oldsymbol{ m{w}},oldsymbol{ m{h}}) = ext{Dist}left(Y,hat Y_{ ext{fuse}} ight) ]

    最后,将五个侧边输出的损失值分别乘以一个权重 (alpha_m=1),和融合后的输出损失值相加,得到最终的损失值。

    [mathcal{L}_{ ext{side}}(oldsymbol{ m{W}},oldsymbol{ m{w}})=sum_{m=1}^{M}alpha_{m}ell_{ ext{side}}^{(m)}(oldsymbol{ m{W}},oldsymbol{ m{w}}^{(m)}) ]

    [(oldsymbol{ m{W}},oldsymbol{ m{w}},oldsymbol{ m{h}}) ^* = ext{argmin}(mathcal{L}_{ ext{side}}(oldsymbol{ m{W}},oldsymbol{ m{w}}) + mathcal{L}_{ ext{fuse}}(oldsymbol{ m{W}},oldsymbol{ m{w}},oldsymbol{ m{h}})) ]

    对上面这个目标损失函数作最小值优化,即可训练得到所需的网络模型。

    数据集

    使用了两个常用的边缘检测数据集进行测试。

    BSD500

    下载地址:https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/resources.html

    训练集 验证集 测试集
    200 100 200

    NYUD

    下载地址:https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html

    训练集 验证集 测试集
    381 414 654

    训练与测试

    训练时,使用 VGG16 预训练权重进行初始化。各超参数选取如下:

    • 优化器:随机梯度下降优化器(SGD)

    • 批大小(batch size):10

    • 学习率(learning rate):1e-6

    • 侧边输出损失值求和时的权重 (alpha_m) :1

    • 动量(momentum):0.9

    • 卷积层权重初始化为0,融合层的卷积权重初始化为1/5

    • 权重衰减系数(weight decay ):0.0002

    • 训练轮数(epoch):10000

    • 学习率更新策略:当迭代轮数达到5000后,学习率除以10

    • 输入图像的大小统一重新调整为 400 × 400 大小,以加快 GPU 处理速度

    对比实验

    体系结构替代

    为了验证所提的网络模型是否具有明显的优势,即该网络结构能否被替换。对比了四种网络: FCN-8S(损失函数改为交叉熵)、FCN-2S(在网络中添加来自 pool1 和 pool2 层的其他链接)、HED在不对侧边层输出进行深度监督情况下的融合层输出(Fusion-output (w/o deep supervision))以及HED在对侧边层输出进行深度监督情况下的融合层输出(Fusion-output (with deep supervision))

    对比结果发现,FCN 效果不如所提出的HED 模型;然后HED加深度监督比不加深监督要好。

    当不加深监督时,预测的边缘更粗糙,加了深监督后,各层的侧边输出具有明显的渐进特点,输出变得越来越粗,越来越全局化,保留了关键的边界信息。

    其他结论

    • 作者对原始数据集进行了扩张,使用16个不同角度旋转+翻转操作,可扩大32倍,这里旋转后需要裁剪最大矩形,去除黑色背景带来的影响。
    • 如果将所有池化层全部换为平均池化,会使性能降低到 ODS = .741
    • 上采样可以使用插值也可以使用转置卷积,但作者发现转置卷积效果并不明显,因此选择了插值方法进行上采样。
    • 网络在 单个 NVIDIA K40 GPU 上训练大概需要 7 个小时。

    BSDS500数据集上的多模型对比实验

    可以看到 HED 效果最好,F = 0.782,最接近人类水平 0.800。

    作者还发现,加权融合的输出能够获得更高的 F-score,而对五个层进行平均则可获得更高的 AP,而将这二者在做一个平均则效果得到进一步提升。

    剩下的就是与其他模型对比了:

    作者还探讨了数据集的容量带来的影响,将测试集中随机采样100张图像扩充到训练集中进行训练,剩下的100张做测试,结果发现ODS 从0.782 提升到了 0.797(±.003),这说明数据集的扩增可以提升模型性能,未来通过更大的数据集可以将模型性能训练到接近人类水平。

    NYUD数据集上的多模型对比实验

    这里的数据集是深度图像,因此与前面的有所区别。

    img

    作者使用三个通道对深度图像进行HHA编码,得到 HHA 特征图像作为输入图像数据,此外还有RGB图像。结果如下:

    论文代码

    作者原始论文的代码是使用 caffe 实现的,项目地址为 https://github.com/s9xie/hed

    基于 Pytorch 实现的 HED 项目如下:

    © 版权声明
    文章版权归作者所有,未经允许请勿转载。
  • 相关阅读:
    Two sum 两个数相加
    [ACM] hdu 1286 找新朋友(欧拉函数)
    环形队中实现队列的基本运算
    队列的顺序存储结构及其基本运算的实现
    栈的链式存储结构及其基本运算实现
    栈的顺序存储结构及其基本运算实现
    [ACM] hdu 1205 吃糖果(鸽巢原理)
    [ACM] poj 3128 Leonardo's Notebook (置换群,循环节)
    hdu acm 1051 Zipper
    [ACM] poj 2369 Permutations (置换群循环节长度)
  • 原文地址:https://www.cnblogs.com/gshang/p/14729738.html
Copyright © 2011-2022 走看看