【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection-程序员宅基地

技术标签: edge  边缘检测  深度学习  


参考文献: Su, Z., Liu, W., Yu, Z., Hu, D., Liao, Q., Tian, Q., ... & Liu, L. (2021). Pixel Difference Networks for Efficient Edge Detection. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 5117-5127).

文章链接:
https://openaccess.thecvf.com/content/ICCV2021/papers/Su_Pixel_Difference_Networks_for_Efficient_Edge_Detection_ICCV_2021_paper.pdf

摘要

motivations:
基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。
contributions:
提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。
experiments:
在BSDS500、NYUD和Multicue上进行了大量的实验,以证明其有效性、高训练和推理效率。当仅使用BSDS500和VOC数据集从头开始训练时,PiDiNet可以超过BSDS500数据集上记录的人类感知结果(在ODS F-measure中为0.807 vs 0.803),速度为100 FPS,参数小于1M。参数小于0.1M的更快版本的PiDiNet仍然可以以200 FPS的速度实现相当的性能。NYUD和Multicue数据集的结果显示了类似的观察结果。

1. Introduction

直观地说,边缘表现出不同的特定模式,如直线、拐角和“X”连接。一方面,传统的边缘算子受到这些直觉的启发(下图)。基于梯度计算通过显式计算像素差来编码用于边缘检测的重要梯度信息。然而,这些手工制作的边缘算子或基于学习的边缘检测算法由于其浅层结构通常不够强大。
另一方面,CNN可以学习丰富的分层图像表示,其中普通CNN内核用作探测局部图像模式。然而,CNN核是从随机初始化的,它没有对梯度信息进行显式编码,这使得它们很难聚焦于边缘相关的特征。
在这里插入图片描述
基于CNN的实现边缘检测的缺点还包括:
模型尺寸大、内存消耗大、计算成本高、运行效率低、吞吐量低、标签效率低,需要对大规模数据集进行模型预训练。

设计了一种新的卷积运算,以满足以下需要。首先,它可以很容易地捕获图像梯度信息,便于边缘检测,并且CNN模型可以更专注于处理大量不相关的图像特征。其次,深层CNN强大的学习能力仍然可以保留,以提取语义上有意义的表示,从而实现鲁棒和准确的边缘检测。在本文中,我们提出了像素差卷积(PDC),首先计算图像中的像素差,然后与核权重卷积以生成输出特征(见图3)。PDC效果如下图所示:
在这里插入图片描述

2. Pixel Difference Convolution(PDC)

像素差分卷积与普通的vanilla卷积的区别仅在于前者对像素对的差值做卷积,而后者对单个像素值做卷积。公式如下所示:
在这里插入图片描述
在具体解释PDC之前,需要扯一嘴LBP是什么东西。

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出(注意与本文所属一所大学),用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;
计算方法:
原始的LBP算子定义为在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:
在这里插入图片描述

LBP的相关扩展:将上述LBP的计算范围扩展以解决3×3邻域模板过小,无法捕获大尺度纹理结构的缺点,即下图所示:
①Circle LBP在这里插入图片描述
LBPROT:在Circle LBP的基础上,解决模板具有旋转不变性的问题。

PDC是将上述LBP算法与CNN进行结合,定义了三种PDC的计算方式:central PDC (CPDC), angular PDC(APDC) and radial PDC (RPDC)。如下图所示:
在这里插入图片描述

  • APDC计算示意图与证明:
    在这里插入图片描述
    在这里插入图片描述
  • CPDC计算示意图与证明:
    在这里插入图片描述
    在这里插入图片描述
  • RPDC计算示意图与证明:
    在这里插入图片描述

在这里插入图片描述
需要注意的是,基于以上公式,一旦模型训练好了,就可以先计算模板权重的差值,再基于权重与像素点进行卷积运算,从而加快推理速度。
这也是这个论文比较大的创新点所在:

在训练阶段运用两倍的算力训练差分卷积的效果,而推理阶段的速度与普通卷积神经网络一致。

3. PiDiNet

网络是作者自己设计的轻量型网络,大量用了可分离卷积,通道注意力结构和并联膨胀卷积提取特征。从头开始训练,没有调用预训练模型。
以及作者后续做了很多消融实验调整模型参数。
在这里插入图片描述
值得提一句这里的损失函数,用的是 annotator-robust loss function,
在这里插入图片描述

where y i is the ground truth edge probability, η is a predefined threshold, meaning that a pixel is discarded and not considered to be a sample when calculating the loss if it is marked as positive by fewer than η of annotators to avoid confusing, β is the percentage of negative pixel samples and α = λ · (1 − β).

最终损失函数如下:
在这里插入图片描述

4. 结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 差分卷积代码实现

5.1 CPDC

基于第三节的公式(3),CPDC差分卷积将转为普通卷积相减:

def func(x, weights, bias=None, stride=1, padding=0, dilation=1, groups=1):
    assert dilation in [1, 2], 'dilation for cd_conv should be in 1 or 2'
    assert weights.size(2) == 3 and weights.size(3) == 3, 'kernel size for cd_conv should be 3x3'
    assert padding == dilation, 'padding for cd_conv set wrong'

    weights_c = weights.sum(dim=[2, 3], keepdim=True) #B,C,3,3 -> B,C,1,1
    yc = F.conv2d(x, weights_c, stride=stride, padding=0, groups=groups)
    y = F.conv2d(x, weights, bias, stride=stride, padding=padding, dilation=dilation, groups=groups)
    return y - yc

5.2 APDC

基于第三节的公式(7),APDC差分卷积将转为普通卷积相减:

def func(x, weights, bias=None, stride=1, padding=0, dilation=1, groups=1):
    assert dilation in [1, 2], 'dilation for ad_conv should be in 1 or 2'
    assert weights.size(2) == 3 and weights.size(3) == 3, 'kernel size for ad_conv should be 3x3'
    assert padding == dilation, 'padding for ad_conv set wrong'

    shape = weights.shape
    weights = weights.view(shape[0], shape[1], -1) #B,C,3,3 -> B,C,9
    weights_conv = (weights - weights[:, :, [3, 0, 1, 6, 4, 2, 7, 8, 5]]).view(shape) # clock-wise
    y = F.conv2d(x, weights_conv, bias, stride=stride, padding=padding, dilation=dilation, groups=groups)
    return y

5.3 RPDC

基于第三节的公式(9),APDC差分卷积将转为普通卷积相减:

def func(x, weights, bias=None, stride=1, padding=0, dilation=1, groups=1):
    assert dilation in [1, 2], 'dilation for rd_conv should be in 1 or 2'
    assert weights.size(2) == 3 and weights.size(3) == 3, 'kernel size for rd_conv should be 3x3'
    padding = 2 * dilation

    shape = weights.shape
    if weights.is_cuda:
        buffer = torch.cuda.FloatTensor(shape[0], shape[1], 5 * 5).fill_(0)
    else:
        buffer = torch.zeros(shape[0], shape[1], 5 * 5)
    weights = weights.view(shape[0], shape[1], -1) #B,C,5,5 -> B,C,25
    buffer[:, :, [0, 2, 4, 10, 14, 20, 22, 24]] = weights[:, :, 1:]
    buffer[:, :, [6, 7, 8, 11, 13, 16, 17, 18]] = -weights[:, :, 1:]
    buffer[:, :, 12] = 0
    buffer = buffer.view(shape[0], shape[1], 5, 5)
    y = F.conv2d(x, buffer, bias, stride=stride, padding=padding, dilation=dilation, groups=groups)
    return y
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43019433/article/details/121374060

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法