UNet網絡 圖像分割模型學習

UNet 由Ronneberger等人于2015年提出,專門針對醫學圖像分割任務,解決了早期卷積網絡在小樣本數據下的效率問題和細節丟失難題。

一 核心創新

1.1對稱編碼器-解碼器結構

實現上下文信息高分辨率細節的雙向融合

如圖所示:編碼器進行了4步(紅框)到達了瓶頸層(紫框),每一步包含兩次3x3卷積+ReLU并通過通過2x2最大池化下采樣,到達瓶頸層后,解碼器也進行了4步(綠框),使用了轉置卷積上采樣后與編碼器對應層特征拼接(跳躍連接(灰色箭頭))后再進行兩次卷積。

可以看出解碼器和編碼器非常的對稱,呈現一個U型,所以叫UNet。

其中:
編碼器:通過池化逐漸擴大感受野。

解碼器:逐步恢復空間分辨率,精確定位目標邊界。

跳躍連接:將編碼器特征與解碼器特征拼接,融合多級信息解決深層網絡定位精度下降的問題

1.2跳躍連接(Skip Connections)

解決深層卷積神經網絡中空間信息丟失細節模糊的核心問題。

因為編碼器下采樣會丟失細節,而解碼器上采樣又難以完全恢復位置信息,所以使用跳躍鏈接來補償細節。

1.2.1數學形式表達

設編碼器第?$l$ 層輸出為?$E_l \in \mathbb{R}^{H_l \times W_l \times C_l}$?,?解碼器第?$l$?層輸入為?$D_l \in \mathbb{R}^{H_l \times W_l \times C_{l}'}$,?則跳躍連接操作:

$ D_l' = \text{Concat}(E_l, \text{UpSample}(D_{l+1})) $

Concat?: 沿通道維度拼接(Channel-wise Concatenation)

UpSample:? 轉置卷積/雙線性插值將解碼器輸出的分辨率提升至與編碼器相同

1.2.2特征融合方法

編碼器每層的輸出須與解碼器對應層上采樣后的尺寸匹配,拼接后總通道數為兩者之和。

(黑色圓圈)

# PyTorch代碼示例:拼接編碼器和解碼器特征
def forward(self, decoder_feat, encoder_feat):# decoder_feat: [B, C1, H, W] # encoder_feat: [B, C2, H, W]merged = torch.cat([decoder_feat, encoder_feat], dim=1)  # 沿通道拼接return merged  # 結果維度:[B, C1+C2, H, W]

?1.3端到端精細分割(End-to-End Fine Segmentation)

在少量標注數據下仍能輸出像素級預測

直接從原始輸入圖像生成像素級預測的模型設計范式,無需手動設計特征提取器或多階段后處理。

1.3.1核心

全流程自動映射:輸入 → 特征學習 → 高精度分割結果,中間過程由網絡自動優化

細節敏感機制:通過多層次特征融合、邊界增強模塊等手段保證細粒度分割

無后處理輸出:輸出可直接使用,無需形態學后處理

1.3.2技術實現

編碼器:通過卷積與池化逐層提取高層語義(形狀、位置)

# 編碼器層示例:每次下采樣通道數翻倍
class Encoder(nn.Module):def __init__(self, in_ch, out_ch):super().__init__()self.block = nn.Sequential(nn.Conv2d(in_ch, out_ch, 3, padding=1),#卷積nn.BatchNorm2d(out_ch),#標準化(歸一+線性變換)nn.ReLU(),#非線性激活nn.Conv2d(out_ch, out_ch, 3, padding=1),nn.BatchNorm2d(out_ch),nn.ReLU(),nn.MaxPool2d(2)#最大值池化)def forward(self, x):return self.block(x)

解碼器:上采樣恢復分辨率 + 跳躍連接補充細節

# 解碼器層示例:特征拼接后卷積
class Decoder(nn.Module):def __init__(self, in_ch, out_ch):super().__init__()self.up = nn.ConvTranspose2d(in_ch, out_ch, 2, stride=2)self.conv = nn.Sequential(nn.Conv2d(out_ch*2, out_ch, 3, padding=1), # 拼接后通道數翻倍nn.BatchNorm2d(out_ch),nn.ReLU())def forward(self, x, skip):x = self.up(x)x = torch.cat([x, skip], dim=1)  # 與編碼器特征拼接return self.conv(x)

改良1: 注意力引導跳躍連接:通過空間注意力強化邊緣區域(在跳躍連接前應用空間注意力,突出邊緣信息)

class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super().__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2)self.sigmoid = nn.Sigmoid()def forward(self, x):avg = torch.mean(x, dim=1, keepdim=True)max_pool, _ = torch.max(x, dim=1, keepdim=True)concat = torch.cat([avg, max_pool], dim=1)  # 沿通道維度拼接均值和最大值mask = self.sigmoid(self.conv(concat))      # 生成空間注意力掩碼return x * mask                             # 加權增強關鍵區域

改良2: 多尺度損失監督:在不同解碼層注入輔助損失。

class MultiScaleLoss(nn.Module):def __init__(self, losses):super().__init__()self.losses = losses  # 各層對應的損失函數列表def forward(self, preds, target):total_loss = 0for pred, loss_fn in zip(preds, self.losses):# 將目標下采樣至與當前預測同尺寸_, _, H, W = pred.shaperesized_target = F.interpolate(target, size=(H,W), mode='nearest')total_loss += loss_fn(pred, resized_target)return total_loss

適用性擴展:該范式可遷移至其他密集預測任務,如衛星影像分析、自動駕駛場景理解等。

二 與傳統分割模型對比

模型優勢局限性
FCN全卷積保留空間信息輸出分辨率粗糙,跳躍連接簡單
SegNet使用池化索引提升精度特征復用效率低
DeepLab空洞卷積擴大感受野小目標分割邊緣模糊
UNet對稱結構+密集跳躍連接,細節恢復原版對大尺度變化敏感

三 UNet的改良方法?

3.1跨尺度空洞卷積替換編碼器的普通卷積層

在底層使用擴張率=1捕捉細節,高層使用d=3或5擴大感受野。

# 原編碼器卷積塊
self.encoder_conv = nn.Sequential(nn.Conv2d(in_ch, out_ch, 3, padding=1),nn.ReLU(),nn.Conv2d(out_ch, out_ch, 3, padding=1),nn.ReLU()
)# 改進:跨尺度空洞卷積模塊
self.encoder_conv = CrossScaleDilatedConv(in_ch, out_ch)

3.2融入密集塊融合增強跳躍連接的特征傳遞

在編碼器和解碼器拼接前加入密集塊

class ImprovedSkipConnection(nn.Module):def __init__(self, in_ch):super().__init__()self.dense_block = DenseBlock(num_layers=4, in_channels=in_ch)def forward(self, enc_feat, dec_feat):enc_processed = self.dense_block(enc_feat)  # 特征增強merged = torch.cat([enc_processed, dec_feat], dim=1)return merged# 在UNet解碼器中應用
def forward(self, x):# ... 編碼過程d4 = self.upconv4(d5)d4 = self.skip_conn4(e4, d4)  # 使用改進的跳躍連接d4 = self.decoder_conv4(d4)# ...

四 核心代碼(未改良)

class UNet(nn.Module):def __init__(self, n_class=1):super().__init__()# 編碼器self.enc1 = EncoderBlock(3, 64)self.enc2 = EncoderBlock(64, 128)self.enc3 = EncoderBlock(128, 256)self.enc4 = EncoderBlock(256, 512)self.bottleneck = EncoderBlock(512, 1024)# 解碼器self.upconv4 = UpConv(1024, 512)self.dec4 = DecoderBlock(1024, 512)  # 輸入1024因拼接self.upconv3 = UpConv(512, 256)self.dec3 = DecoderBlock(512, 256)self.upconv2 = UpConv(256, 128)self.dec2 = DecoderBlock(256, 128)self.upconv1 = UpConv(128, 64)self.dec1 = DecoderBlock(128, 64)self.final = nn.Conv2d(64, n_class, kernel_size=1)def forward(self, x):# 編碼e1 = self.enc1(x)e2 = self.enc2(F.max_pool2d(e1, 2))e3 = self.enc3(F.max_pool2d(e2, 2))e4 = self.enc4(F.max_pool2d(e3, 2))bn = self.bottleneck(F.max_pool2d(e4, 2))# 解碼d4 = self.dec4(self.upconv4(bn), e4)d3 = self.dec3(self.upconv3(d4), e3)d2 = self.dec2(self.upconv2(d3), e2)d1 = self.dec1(self.upconv1(d2), e1)return torch.sigmoid(self.final(d1))class EncoderBlock(nn.Module):def __init__(self, in_ch, out_ch):super().__init__()self.conv = nn.Sequential(nn.Conv2d(in_ch, out_ch, 3, padding=1),nn.BatchNorm2d(out_ch),nn.ReLU(),nn.Conv2d(out_ch, out_ch, 3, padding=1),nn.BatchNorm2d(out_ch),nn.ReLU())def forward(self, x):return self.conv(x)class UpConv(nn.Module):def __init__(self, in_ch, out_ch):super().__init__()self.up = nn.ConvTranspose2d(in_ch, out_ch, 2, stride=2)def forward(self, x):return self.up(x)class DecoderBlock(nn.Module):def __init__(self, in_ch, out_ch):super().__init__()self.conv = EncoderBlock(in_ch, out_ch)def forward(self, x, skip):x = torch.cat([x, skip], dim=1)  # 通道拼接return self.conv(x)

UNet憑借其優雅的對稱結構和密集跳躍連接,成為醫學圖像分割的基準模型。通過集成跨尺度空洞卷積密集塊融合等模塊,可顯著提升其對多尺度目標的適應性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905074.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【造包工具】【Xcap】精講Xcap構造分片包(IPv4、ipv6、4G\5G等pcap均可),圖解超贊超詳細!!!

1. 歡迎大家訂閱和關注:精講網絡通信協議(OSI、TCP、IP、UDP、ARP、ICMP、DHCP、HTTP、MQTT、SSL等)知識點,專欄會持續更新中.....敬請期待! 目錄 前言 1. XCap工具概念介紹 2. Xcap環境說明 2.1 新建報文組 2.2 導入數據包 2.3 查看報文組 2.4 復制刪除報文組 3.…

Qt 界面優化(繪圖)

目錄 1. 繪圖基本概念2. 繪制各種形狀2.1 繪制線段2.2 繪制矩形2.3 繪制圓形2.4 繪制文本2.5 設置畫筆2.6 設置畫刷 3. 繪制圖片3.1 繪制簡單圖片3.2 平移圖片3.3 縮放圖片3.4 旋轉圖片 4. 其他設置4.1 移動畫家位置4.2 保存/加載畫家的狀態 5. 特殊的繪圖設備5.1 QPixmap5.2 Q…

【計算機視覺】優化MVSNet可微分代價體以提高深度估計精度的關鍵技術

優化MVSNet可微分代價體以提高深度估計精度的關鍵技術 1. 代價體基礎理論與分析1.1 標準代價體構建1.2 關鍵問題診斷 2. 特征表示優化2.1 多尺度特征融合2.2 注意力增強匹配 3. 代價體構建優化3.1 自適應深度假設采樣3.2 可微分聚合操作改進 4. 正則化與優化策略4.1 多尺度代價…

Python中,async和with結合使用,有什么好處?

在Python的異步編程中,async和with的結合使用(即async with)為開發者提供了一種優雅且高效的資源管理模式。這種組合不僅簡化了異步代碼的編寫,還顯著提升了程序的健壯性和可維護性。以下是其核心優勢及典型應用場景的分析&#x…

【金倉數據庫征文】金倉數據庫:創新驅動,引領數據庫行業新未來

一、引言 在數字化轉型的時代洪流中,數據已躍升為企業的核心資產,宛如企業運營與發展的 “數字命脈”。從企業日常運營的精細化管理,到戰略決策的高瞻遠矚制定;從客戶關系管理的深度耕耘,到供應鏈優化的全面協同&…

Python學習之路(玖)-圖像識別的實現

在 Python 中,圖像識別對比通常涉及 圖像相似度計算 或 目標檢測與匹配。-淺看一下就行,具體功能代碼,后期會逐步上傳資源。 一、技術方案 1. 圖像相似度計算 目標:計算兩幅圖像的相似度。工具: OpenCV:圖…

【C語言文件操作詳解】fopen 函數全解析 —— 模式參數、使用技巧與重定向的區別

在 C 語言中,文件的讀寫是一個非常常見的需求。fopen 是標準庫中提供的函數,用來打開文件,返回一個文件指針供后續操作使用。本篇博客將詳細介紹 fopen 的使用方法、每個參數的含義,以及它與 Shell 中 >、>> 重定向符的聯…

青少年編程與數學 02-019 Rust 編程基礎 02課題、開始編程

青少年編程與數學 02-019 Rust 編程基礎 02課題、開始編程 一、游戲規則二、實現步驟1. 創建項目2. 編寫代碼3. 添加依賴4. 運行程序 三、代碼解析四、println! 的用法基本用法使用占位符示例控制輸出寬度和精度示例 輸出多個變量示例 注意事項小結 五、管理多個項目1. 創建 Wo…

拒絕flash插件打劫!如何在vscode上玩4399小游戲

現在電腦上玩4399都需要flash插件了 這也導致了很多人無法玩到小時候的游戲 今天介紹一款插件 功能強大 即安即玩 首先打開vscode 點開小方框(拓展)搜索4399 認準4399 on vscode點擊安裝 安裝完畢后 按下 Ctrl Shift P , 輸入 4399 on VSCode 或…

RHCSA Linux系統 Web頁面 論壇 網盤的搭建

Web 服務搭建 [rootlocalhost ~]#yum install httpd -y [rootlocalhost ~]#cd /var/www/htm1/ [rootalocalhost html]#echo 江停嚴峫 >index.html [rootlocalhost html]#setenforce 0 #將 SELinux 模式設置為寬容模式,不強制執行安全策略 [rootlocalhost h…

力扣刷題——二分查找總結

我們可以總結出二分查找的通用做法和常見變種。二分查找是一種在有序數組中高效查找元素的算法,時間復雜度為 O (log n)。 二分查找的通用模板 二分查找的核心思想是將搜索范圍不斷縮小一半,直到找到目標元素或確定其不存在。以下是通用模板&#xff1…

開源數字人框架 AWESOME-DIGITAL-HUMAN 技術解析與應用指南

一、項目概述 AWESOME-DIGITAL-HUMAN 是一個基于 Live2D 技術的開源數字人框架,它集成了語音識別(ASR)、大語言模型(LLM)、語音合成(TTS)和 Agent 模塊化擴展能力,支持快速部署和自…

互聯網大廠Java求職面試:基于RAG的智能問答系統設計與實現-2

互聯網大廠Java求職面試:基于RAG的智能問答系統設計與實現-2 面試背景 鄭薪苦是一名Java開發者,擁有豐富的項目經驗,但在面試中總喜歡用奇葩比喻解釋技術問題。今天他面對的是某大廠技術總監張總,面試主題為“基于RAG的智能問答…

(二)Linux下基本指令 2

【知識預告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ?r 指令 27. 重要的?個熱鍵 28. 關機 16 date 指令 指定格式顯?時間:date %Y-…

命令行解釋器中shell、bash和zsh的區別

命令行解釋器(Command Line Interpreter)是一個程序,它的主要作用是接收用戶輸入的命令,并執行相應的操作。它充當了用戶與操作系統內核之間的橋梁。 一、什么是 Shell? Shell 是一個通用術語,指的是 命令…

二、transformers基礎組件之Tokenizer

在使用神經網絡處理自然語言處理任務時,我們首先需要對數據進行預處理,將數據從字符串轉換為神經網絡可以接受的格式,一般會分為如下幾步: - Step1 分詞:使用分詞器對文本數據進行分詞(字、字詞);- Step2 構建詞典:根據數據集分詞的結果,構建…

鏡像和容器的管理

一、鏡像的管理 獲取鏡像并生成相關容器 # 拉取鏡像 docker pull alpine # 默認是latest,也就是最新版本,也可指定版本(在鏡像名后邊加“:版本號”) # 或者 # 從主機中導入鏡像到docker中 docker image load -i /test#生成容器 …

設計模式簡述(十九)橋梁模式

橋梁模式 描述基本組件使用 描述 橋梁模式是一種相對簡單的模式,通常以組合替代繼承的方式實現。 從設計原則來講,可以說是單一職責的一種體現。 將原本在一個類中的功能,按更細的粒度拆分到不同的類中,然后各自獨立發展。 基本…

ImportError: DLL load failed: 找不到指定的程序。

查看其他博客說是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下載放到博客說的目錄下 沒有用 解決不了一點 OpenSSL for Windows 64位 完整安裝包 在這里 項目地址: https://gitcode.com/open-source-toolkit/eb627 注意事項 此安裝包僅適用于64位Windows系…

電池單元和電極性能

電芯設計中的挑戰 對于電池制造商來說,提高電池能量和功率密度至關重要。在高功率密度和長循環壽命之間取得平衡是電池設計中的關鍵挑戰,通常需要仔細優化材料、電極結構和熱管理系統。另一個關鍵挑戰是通過優化重量體積比來降低電池單元的總體成本。 工…