边界检测方法总结

2024-03-14 23:40
文章标签 总结 方法 边界检测

本文主要是介绍边界检测方法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1:经典的边界检测方法有sobel,拉普拉斯,canny等。
sobel:

def get_sobel(in_chan, out_chan):filter_x = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1],]).astype(np.float32)filter_y = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1],]).astype(np.float32)filter_x = filter_x.reshape((1, 1, 3, 3))filter_x = np.repeat(filter_x, in_chan, axis=1)filter_x = np.repeat(filter_x, out_chan, axis=0)filter_y = filter_y.reshape((1, 1, 3, 3))filter_y = np.repeat(filter_y, in_chan, axis=1)filter_y = np.repeat(filter_y, out_chan, axis=0)filter_x = torch.from_numpy(filter_x)filter_y = torch.from_numpy(filter_y)filter_x = nn.Parameter(filter_x, requires_grad=False)filter_y = nn.Parameter(filter_y, requires_grad=False)conv_x = nn.Conv2d(in_chan, out_chan, kernel_size=3, stride=1, padding=1, bias=False)conv_x.weight = filter_xconv_y = nn.Conv2d(in_chan, out_chan, kernel_size=3, stride=1, padding=1, bias=False)conv_y.weight = filter_ysobel_x = nn.Sequential(conv_x, nn.BatchNorm2d(out_chan))  # 自定义修改卷积核的权重sobel_y = nn.Sequential(conv_y, nn.BatchNorm2d(out_chan))return sobel_x, sobel_ydef run_sobel(conv_x, conv_y, input):g_x = conv_x(input)  # (1,1,15,20)g_y = conv_y(input)  # (1,1,15,20)g = torch.sqrt(torch.pow(g_x, 2) + torch.pow(g_y, 2) + 1e-6).clone()return g

拉普拉斯:

        self.laplacian_kernel = torch.tensor([-1, -1, -1, -1, 8, -1, -1, -1, -1],dtype=torch.float32).reshape(1, 1, 3, 3).requires_grad_(False).type(torch.cuda.FloatTensor)

在这里插入图片描述
2:《Holistically-nested edge detection》,HED经典的采用CNN进行边缘检测,通过边界损失进行约束。
论文地址
backbone的每一个输出后接一个side_output,输出通道为1,上采样到原图大小,GT进过提取边界后与上采样的side_output进行损失计算。
在这里插入图片描述
3:CASENet:CASENet: Deep Category-Aware Semantic Edge Detection
相比于多标签监督,CASENet采用了多类别即(category-aware)进行监督,考虑的是一个像素点可能同时属于多个类别,因此采用的不是one-hot编码,而是按RGB三通道的bit进行编码,在模型中前几个stage输出通道为1的边缘图,最后一个stage生成通道为num_class的特征图,然后通过slice_concat,将num_class的每一个通道与其他三个通道为1的特征图进行拼接,这样就有4num_class个通道,再经过融合层。
在这里插入图片描述
4:Gated-SCNN:Gated Shape CNNs for Semantic Segmentation
模型分为两条支路,regular stream和shape stream,shape stream只学习图像的shape信息,在shape分支通过edge bce loss进行约束,在regular通过segmentation loss进行约束。将第一个stage的输出,不断的和其他分支进行融合,最后输出通道为1的边界图,计算边界损失。和CASENet不同的是,每个side_output都不断地进行特征的交互。
在这里插入图片描述
5:基于
CASENet*的结构,有很多的应用,比如SwinNet,FusionNet,BES-Net等。
5.1:
在这里插入图片描述
5.2:BES-Net: Boundary Enhancing Semantic Context Network for High-Resolution Image Semantic Segmentation和Pixel Difference Networks for Efficient Edge Detection
在这里插入图片描述
在这里插入图片描述
6基于HED的有Pixel Difference Networks for Efficient Edge Detection,Boundary-Aware CNN for Semantic Segmentation

6.1:Pixel Difference Networks for Efficient Edge Detection:

在这里插入图片描述
6.2:Boundary-Aware CNN for Semantic Segmentation:depth和RGB首先经过一个子网络HED,生成的边界图通过平均池化不断下采样和RGB分支融合,其中还提出了Boundary-Aware卷积,类似于depth-aware卷积
在这里插入图片描述

7:基于Gated-SCNN的有
7.1:Multi-scale spatial context-based semantic edge detection,通过CAM提取,通过LAM融合,其中LAM结构和Gated-SCNN的Gate-layer几乎一样。
在这里插入图片描述
7.2:Brain tumor segmentation based on the fusion of deep semantics and edge information in multimodal MRI:
因为他图片是医学的核磁共振图像,对于图片的性质和特点不太理解。他结合了sobel和卷积进行边缘的提取。
在这里插入图片描述
在这里插入图片描述
7.3:BASeg:也是两条分支,第二条分支开始是对RGB图进行Canny操作,然后和语义分支的每一个stage输出进行融合,最后和语义分支共同输入到CAM中,相当于边缘信息融合到语义信息中,使得最终的分割图可以有一个清晰的边缘。
在这里插入图片描述

这篇关于边界检测方法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810093

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误