代码来源

https://github.com/ZhengPeng7/BiRefNet

模块作用

DIS 是一种旨在对高分辨率图像中的目标物体进行精确分割的技术,尤其适用于具有复杂细微结构的物体,例如细长的边缘或微小细节。传统方法在处理这类任务时往往难以捕捉细微特征或恢复高分辨率细节,因此论文提出了一种新颖的网络架构BiRefNet以解决这些挑战。

模块结构

定位模块(LM)
  • 输入高分辨率图像至视觉变换器骨干网络。
  • 提取多尺度的层次特征,捕捉全局语义信息。
  • 通过特征融合和压缩,生成低分辨率的粗略预测图。
  • 原理:利用变换器的全局建模能力,在低分辨率下快速定位目标物体,避免直接处理高分辨率带来的计算负担。
重建模块(RM)
  • 接收定位模块输出的低分辨率粗略预测图。
  • 在解码器的多个阶段,逐步上采样并结合双边参考信息。
  • 输出高分辨率的精细分割图。
  • 原理:通过将原始图像的分块输入解码器,提供高分辨率的细节参考,确保重建过程中细节不丢失。通过梯度图的监督,引导模型聚焦于边缘和细微结构,避免模糊或遗漏关键区域。从低分辨率到高分辨率的分阶段上采样,确保全局一致性和局部精确性的平衡。

代码

class BiRefNet(nn.Module,PyTorchModelHubMixin,library_name="birefnet",repo_url="https://github.com/ZhengPeng7/BiRefNet",tags=['Image Segmentation', 'Background Removal', 'Mask Generation', 'Dichotomous Image Segmentation', 'Camouflaged Object Detection', 'Salient Object Detection']
):def __init__(self, bb_pretrained=True):super(BiRefNet, self).__init__()self.config = Config()self.epoch = 1self.bb = build_backbone(self.config.bb, pretrained=bb_pretrained)channels = self.config.lateral_channels_in_collectionif self.config.auxiliary_classification:self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.cls_head = nn.Sequential(nn.Linear(channels[0], len(class_labels_TR_sorted)))if self.config.squeeze_block:self.squeeze_module = nn.Sequential(*[eval(self.config.squeeze_block.split('_x')[0])(channels[0]+sum(self.config.cxt), channels[0])for _ in range(eval(self.config.squeeze_block.split('_x')[1]))])self.decoder = Decoder(channels)if self.config.ender:self.dec_end = nn.Sequential(nn.Conv2d(1, 16, 3, 1, 1),nn.Conv2d(16, 1, 3, 1, 1),nn.ReLU(inplace=True),)# refine patch-level segmentationif self.config.refine:if self.config.refine == 'itself':self.stem_layer = StemLayer(in_channels=3+1, inter_channels=48, out_channels=3, norm_layer='BN' if self.config.batch_size > 1 else 'LN')else:self.refiner = eval('{}({})'.format(self.config.refine, 'in_channels=3+1'))if self.config.freeze_bb:# Freeze the backbone...print(self.named_parameters())for key, value in self.named_parameters():if 'bb.' in key and 'refiner.' not in key:value.requires_grad = Falsedef forward_enc(self, x):if self.config.bb in ['vgg16', 'vgg16bn', 'resnet50']:x1 = self.bb.conv1(x); x2 = self.bb.conv2(x1); x3 = self.bb.conv3(x2); x4 = self.bb.conv4(x3)else:x1, x2, x3, x4 = self.bb(x)if self.config.mul_scl_ipt:B, C, H, W = x.shapex_pyramid = F.interpolate(x, size=(H//2, W//2), mode='bilinear', align_corners=True)if self.config.mul_scl_ipt == 'cat':if self.config.bb in ['vgg16', 'vgg16bn', 'resnet50']:x1_ = self.bb.conv1(x_pyramid); x2_ = self.bb.conv2(x1_); x3_ = self.bb.conv3(x2_); x4_ = self.bb.conv4(x3_)else:x1_, x2_, x3_, x4_ = self.bb(x_pyramid)x1 = torch.cat([x1, F.interpolate(x1_, size=x1.shape[2:], mode='bilinear', align_corners=True)], dim=1)x2 = torch.cat([x2, F.interpolate(x2_, size=x2.shape[2:], mode='bilinear', align_corners=True)], dim=1)x3 = torch.cat([x3, F.interpolate(x3_, size=x3.shape[2:], mode='bilinear', align_corners=True)], dim=1)x4 = torch.cat([x4, F.interpolate(x4_, size=x4.shape[2:], mode='bilinear', align_corners=True)], dim=1)elif self.config.mul_scl_ipt == 'add':x1_, x2_, x3_, x4_ = self.bb(x_pyramid)x1 = x1 + F.interpolate(x1_, size=x1.shape[2:], mode='bilinear', align_corners=True)x2 = x2 + F.interpolate(x2_, size=x2.shape[2:], mode='bilinear', align_corners=True)x3 = x3 + F.interpolate(x3_, size=x3.shape[2:], mode='bilinear', align_corners=True)x4 = x4 + F.interpolate(x4_, size=x4.shape[2:], mode='bilinear', align_corners=True)class_preds = self.cls_head(self.avgpool(x4).view(x4.shape[0], -1)) if self.training and self.config.auxiliary_classification else Noneif self.config.cxt:x4 = torch.cat((*[F.interpolate(x1, size=x4.shape[2:], mode='bilinear', align_corners=True),F.interpolate(x2, size=x4.shape[2:], mode='bilinear', align_corners=True),F.interpolate(x3, size=x4.shape[2:], mode='bilinear', align_corners=True),][-len(self.config.cxt):],x4),dim=1)return (x1, x2, x3, x4), class_predsdef forward_ori(self, x):########## Encoder ##########(x1, x2, x3, x4), class_preds = self.forward_enc(x)if self.config.squeeze_block:x4 = self.squeeze_module(x4)########## Decoder ##########features = [x, x1, x2, x3, x4]if self.training and self.config.out_ref:features.append(laplacian(torch.mean(x, dim=1).unsqueeze(1), kernel_size=5))scaled_preds = self.decoder(features)return scaled_preds, class_predsdef forward(self, x):scaled_preds, class_preds = self.forward_ori(x)class_preds_lst = [class_preds]return [scaled_preds, class_preds_lst] if self.training else scaled_preds

总结

本文提出了一个配备双边参考的 BiRefNet 框架,该框架可在同一框架内执行二分图像分割、高分辨率显著目标检测和隐藏目标检测。通过全面的实验,研究者发现未缩放的源图像和对信息丰富区域的关注对于生成 HR 图像中精细且细节丰富的区域至关重要。为此,研究者提出了双边参考来填充精细部分中缺失的信息(内向参考),并引导模型更加关注细节更丰富的区域(外向参考)。这显著提升了模型捕捉微小像素特征的能力。为了降低 HR 数据训练的高昂训练成本,本文还提供了各种实用技巧,以实现更高质量的预测和更快的收敛速度。在 13 个基准测试中取得的优异结果证明了BiRefNet 的卓越性能和强大的泛化能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91919.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91919.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research:Agent 时代的核心能力2025 年被称为 Agent 落地元年,在解锁的各类场景中,最有代表性之一,就是 Deep Research 或者以它为基座的各类应用。为什么这么讲? 因为通过 Agentic RAG 及其配套的反思机制&#…

CMakeLists.txt学习

一:#是行注释 ,[[ 块注释 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定义工程名称并可以指定工程的版本,工程描述,web主页地址,支持的语言(默认情况支持所有语言)2.…

Pytorch-04 搭建神经网络架构工作流

搭建神经网络架构 在pytorch中,神经网络被抽象成由一系列对数据执行特定操作的层或者模块组成,比如下面的Attention实现,每个块都是一个模块或者层。 如果你想快速搭建网络架构,torch.nn这个命名空间提供了所有很多开箱即用的层…

从“碎片化”到“完美重组”:IP报文的分片艺术

前言 在网络通信中,当IP层需要传输的数据包大小超过数据链路层的MTU限制时,就必须进行分片处理。本文将完整解析IP分片的工作机制,包括分片字段的作用、如何减少分片,以及分片报文的组装原理。 IP报头解析请参考&#xff…

[GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!

本文为2023年6月GESP C四级的上机题目的详细题解!觉得写的不错或者有帮助可以点个赞啦! (第一次讲解视频,有问题可以指出,不足之处也可以指出) 目录 题目一讲解视频: 题目二讲解视频: 题目一: 幸运数 题目大意: …

内网穿透 FRP 配置指南

关键词:内网穿透、FRP配置、frps、frpc、远程访问、自建服务器、反向代理、TCP转发、HTTP转发 在开发或部署项目时,我们经常遇到内网设备无法被公网访问的问题,例如你想从外网访问你家里的 NAS、远程调试开发板,或是访问本地测试环…

SpringBoot 信用卡检测、OpenAI gym、OCR结合、DICOM图形处理、知识图谱、农业害虫识别实战

信用卡欺诈检测通常使用公开数据集 数据准备与预处理 信用卡欺诈检测通常使用公开数据集如Kaggle的信用卡交易数据集。数据预处理包括处理缺失值、标准化数值特征、处理类别特征。在Spring Boot中,可以使用pandas或sklearn进行数据预处理。 // 示例:使用Spring Boot读取CS…

使用 Docker 部署 Golang 程序

Docker 是部署 Golang 应用程序的绝佳方式,它可以确保环境一致性并简化部署流程。以下是完整的指南: 1. 准备 Golang 应用程序 首先确保你的 Go 应用程序可以正常构建和运行。一个简单的示例 main.go: package mainimport ("fmt""net/http" )func ha…

从零开始的CAD|CAE开发: LBM源码实现分享

起因:上期我们写了流体仿真的经典案例: 通过LBM,模拟计算涡流的形成,当时承诺: 只要验证通过,就把代码开源出来;ok.验证通过了,那么我也就将代码全都贴出来代码开源并贴出:public class LidDrivenCavityFlow : IDisposable{public LidDrivenCavityFlow(int width 200, int hei…

仓库管理系统-17-前端之物品类型管理

文章目录 1 表设计(goodstype) 2 后端代码 2.1 Goodstype.java 2.2 GoodstypeMapper.java 2.3 GoodstypeService.java 2.4 GoodstypeServiceImpl.java 2.5 GoodstypeController.java 3 前端代码 3.1 goodstype/GoodstypeManage.vue 3.2 添加菜单 3.3 页面显示 1、goodstype表设…

共识算法深度解析:PoS/DPoS/PBFT对比与Python实现

目录 共识算法深度解析:PoS/DPoS/PBFT对比与Python实现 1. 引言:区块链共识的核心挑战 2. 共识算法基础 2.1 核心设计维度 2.2 关键评估指标 3. PoS(权益证明)原理与实现 3.1 核心机制 3.2 Python实现 4. DPoS(委托权益证明)原理与实现 4.1 核心机制 4.2 Python实现 5. P…

3.JVM,JRE和JDK的关系是什么

3.JVM,JRE和JDK的关系是什么 1.JDK(Java Development Kit),是功能齐全的Java SDK,包含JRE和一些开发工具(比如java.exe,运行工具javac.exe编译工具,生成.class文件,javaw.exe,大多用…

深度学习技术发展思考笔记 || 一项新技术的出现,往往是为了解决先前范式中所暴露出的特定局限

深度学习领域的技术演进,遵循着一个以问题为导向的迭代规律。一项新技术的出现,往往是为了解决先前范式中所暴露出的特定局限。若将这些新技术看作是针对某个问题的“解决方案”,便能勾勒出一条清晰的技术发展脉络。 例如,传统的前…

Promise的reject处理: then的第二个回调 与 catch回调 笔记250804

Promise的reject处理: then的第二个回调 与 catch回调 笔记250804 Promise 错误处理深度解析:then 的第二个回调 vs catch 在 JavaScript 的 Promise 链式调用中,错误处理有两种主要方式:.then() 的第二个回调函数和 .catch() 方法。这两种方…

Maven模块化开发与设计笔记

1. 模块化开发模块化开发是将大型应用程序拆分成多个小模块的过程,每个模块负责不同的功能。这有助于降低系统复杂性,提高代码的可维护性和可扩展性。2. 聚合模块聚合模块(父模块)用于组织和管理多个子模块。它定义了项目的全局配…

sqli-labs:Less-21关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT * FROM users WHERE username($cookee) LIMIT 0,1";注入类型:字符串型(单引号、括号包裹)、GET操作提示:参数需以)闭合关键参数:cookee p…

大模型+垂直场景:技术纵深、场景适配与合规治理全景图

大模型垂直场景:技术纵深、场景适配与合规治理全景图​​核心结论​:2025年大模型落地已进入“深水区”,技术价值需通过 ​领域纵深(Domain-Deep)​、数据闭环(Data-Driven)​、部署友好&#x…

Kotlin Daemon 简介

Kotlin Daemon 是 Kotlin 编译器的一个后台进程,旨在提高编译性能。它通过保持编译环境的状态来减少每次编译所需的启动时间,从而加快增量编译的速度。 Kotlin Daemon 的主要功能增量编译: 只编译自上次编译以来发生更改的文件,节…

鸿蒙南向开发 编写一个简单子系统

文章目录 前言给设备,编写一个简单子系统总结 一、前言 对于应用层的开发,搞了十几年,其实已经有点开发腻的感觉了,翻来覆去,就是调用api,页面实现,最多就再加个性能优化,但对底层…

超详细:2026年博士申请时间线

博士申请是一场持久战,需要提前规划。那么,如何科学安排2026年博士申请时间线?SCI论文发表的最佳时间节点是什么?今天给所有打算申博的同学们,详细解析下,每个时间节点的重点内容。2025年4月:是…