Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代碼來源

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月:是…