小程序開發(fā)費(fèi)用一般多少錢汕頭seo外包公司
一、前言
如何快速搭建圖像分割網(wǎng)絡(luò)? 要手寫把backbone ,手寫decoder 嗎? 介紹一個(gè)分割神器,分分鐘搭建一個(gè)分割網(wǎng)絡(luò)。
倉(cāng)庫(kù)的地址:
https://github.com/qubvel/segmentation_models.pytorch
該庫(kù)的主要特點(diǎn)是:
- 高級(jí) API(只需兩行即可創(chuàng)建神經(jīng)網(wǎng)絡(luò))
- 用于二元和多類分割的 9 種模型架構(gòu)(包括傳奇的 Unet) 124 個(gè)可用編碼器(以及 timm 的 500 多個(gè)編碼器)
- 所有編碼器都有預(yù)先訓(xùn)練的權(quán)重,以實(shí)現(xiàn)更快更好的收斂
- 訓(xùn)練例程的流行指標(biāo)和損失
二、快速引入—使用 SMP 創(chuàng)建您的第一個(gè)分割模型
分割模型只是一個(gè) PyTorch nn.Module,創(chuàng)建起來很簡(jiǎn)單:
import segmentation_models_pytorch as smpmodel = smp.Unet(encoder_name="resnet34", # choose encoder, e.g. mobilenet_v2 or efficientnet-b7encoder_weights="imagenet", # use `imagenet` pre-trained weights for encoder initializationin_channels=1, # model input channels (1 for gray-scale images, 3 for RGB, etc.)classes=3, # model output channels (number of classes in your dataset)
)
三、Architectures
我們可以用到的 model 有:
- Unet
- Unet++
- MAnet
- Linknet
- FPN
- PSPNet
- PAN
- DeepLabV3
- DeepLabV3+
3.1 UNet
UNet是一種常用于圖像分割任務(wù)的深度學(xué)習(xí)架構(gòu)。它由Olaf Ronneberger、Philipp Fischer和Thomas Brox于2015年在他們的論文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中提出。
UNet的名字來自其U形的網(wǎng)絡(luò)結(jié)構(gòu)。它的設(shè)計(jì)目標(biāo)是從輸入圖像中捕獲低層次和高層次特征,然后利用這些信息生成像素級(jí)別的分割掩碼。UNet在醫(yī)學(xué)圖像分析中特別受歡迎,因?yàn)樗鼘?duì)于分割器官、腫瘤和其他感興趣的結(jié)構(gòu)非常有效。
UNet架構(gòu)主要由兩個(gè)部分組成:
-
收縮路徑:該部分類似于典型的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),包含多個(gè)卷積和池化層。它被稱為"收縮路徑",因?yàn)槊總€(gè)卷積層減小空間維度,同時(shí)增加特征通道數(shù)量。
-
擴(kuò)展路徑:該部分涉及將特征映射進(jìn)行上采樣,恢復(fù)原始空間維度。它被稱為"擴(kuò)展路徑",因?yàn)樗黾涌臻g維度,同時(shí)減少特征通道數(shù)量。
在U形架構(gòu)的中心,有一個(gè)瓶頸層,它保留了局部和全局的上下文信息。
收縮路徑和擴(kuò)展路徑是對(duì)稱的,并通過跳躍連接相連接。這些跳躍連接有助于在上采樣過程中保留細(xì)粒度的空間信息,使UNet特別適合圖像分割任務(wù)。
在原始的UNet論文中,作者將該架構(gòu)應(yīng)用于生物醫(yī)學(xué)圖像分割任務(wù),例如在電子顯微鏡數(shù)據(jù)中分割神經(jīng)結(jié)構(gòu)。然而,自那時(shí)以來,UNet架構(gòu)已廣泛應(yīng)用于其他領(lǐng)域的圖像分割任務(wù),如自然圖像、衛(wèi)星圖像等。
由于其有效性,UNet已成為各種擴(kuò)展和改進(jìn)的基礎(chǔ),并且在深度學(xué)習(xí)領(lǐng)域仍然是圖像分割任務(wù)的熱門選擇。
3.2 UNet++
Unet++是對(duì)UNet進(jìn)行改進(jìn)和擴(kuò)展的深度學(xué)習(xí)架構(gòu)。它是由Zhou et al.于2018年在論文《UNet++: A Nested U-Net Architecture for Medical Image Segmentation》中提出的。
Unet++在原始UNet的基礎(chǔ)上增加了一些重要的結(jié)構(gòu)來提高圖像分割的性能。主要的改進(jìn)是引入了多層級(jí)的嵌套結(jié)構(gòu),使得模型能夠更好地捕獲不同尺度下的特征信息。以下是Unet++的主要特點(diǎn):
-
多層級(jí)嵌套:Unet++采用了一種層級(jí)嵌套的結(jié)構(gòu),將UNet的每個(gè)階段進(jìn)行進(jìn)一步細(xì)分。這樣可以在不同的階段獲取更多的細(xì)節(jié)和語(yǔ)義信息,從而提高了分割的準(zhǔn)確性。
-
密集跳躍連接:Unet++引入了密集的跳躍連接,將不同層級(jí)的特征圖進(jìn)行融合。這樣可以使低層級(jí)的特征圖能夠直接參與到高層級(jí)的特征表示中,有助于更好地整合多尺度的信息。
-
自適應(yīng)選擇性上采樣:在Unet++的解碼器部分,采用了自適應(yīng)選擇性上采樣技術(shù),根據(jù)不同特征圖的重要性進(jìn)行選擇性地上采樣。這樣可以減少計(jì)算量,并且避免了不必要的信息傳遞。
通過這些改進(jìn),Unet++在醫(yī)學(xué)圖像分割等任務(wù)中取得了較好的性能,相對(duì)于原始UNet,它能夠更準(zhǔn)確地定位和分割感興趣的目標(biāo)結(jié)構(gòu)。
需要注意的是,自從Unet++的提出以來,還可能有其他進(jìn)一步的改進(jìn)和擴(kuò)展,因?yàn)樯疃葘W(xué)習(xí)領(lǐng)域一直在不斷發(fā)展和演進(jìn)。
3.3 FPN
**FPN是"Feature Pyramid Network" 的縮寫,是一種用于目標(biāo)檢測(cè)和語(yǔ)義分割任務(wù)的深度學(xué)習(xí)架構(gòu)。它由Tsung-Yi Lin、Piotr Dollár、Ross Girshick和Kaiming He于2017年在論文《Feature Pyramid Networks for Object Detection》中提出。
FPN的目標(biāo)是解決多尺度信息的問題。在許多計(jì)算機(jī)視覺任務(wù)中,目標(biāo)可能在圖像的不同尺度下出現(xiàn),而且較小的目標(biāo)可能在較低層級(jí)的特征圖中丟失細(xì)節(jié)。FPN通過構(gòu)建特征金字塔來解決這個(gè)問題。
FPN的主要思想是將不同層級(jí)的特征圖進(jìn)行融合,以提取多尺度的特征信息。它包含以下主要組件:
- 底層特征:從卷積神經(jīng)網(wǎng)絡(luò)的底層獲得的特征圖。這些特征圖具有高分辨率但缺乏語(yǔ)義信息。
- 頂層特征:從網(wǎng)絡(luò)的頂層獲得的特征圖。這些特征圖具有較低的分辨率但包含豐富的語(yǔ)義信息。
FPN的構(gòu)建過程如下:
-
首先,通過一個(gè)卷積層,將頂層特征圖的通道數(shù)降低,使其與底層特征圖的通道數(shù)相同。
-
然后,將降低通道數(shù)的頂層特征圖與底層特征圖相加,產(chǎn)生一組新的特征圖,這些特征圖在不同的層級(jí)上融合了多尺度的信息。
-
接下來,將融合后的特征圖通過上采樣操作(通常使用插值方法)增加分辨率,得到高分辨率的多尺度特征金字塔。
FPN的特征金字塔允許目標(biāo)檢測(cè)器或分割器在不同尺度下檢測(cè)或分割目標(biāo),從而顯著提高了算法的性能。由于其有效性和簡(jiǎn)單性,FPN已成為許多目標(biāo)檢測(cè)和語(yǔ)義分割任務(wù)的常用組件,并被廣泛應(yīng)用于許多深度學(xué)習(xí)模型中。
3.4 DeepLabV3
DeepLabV3是用于圖像語(yǔ)義分割的深度學(xué)習(xí)模型,由Google于2018年推出。它是DeepLab系列模型的第三個(gè)版本,是對(duì)前兩個(gè)版本的改進(jìn)和擴(kuò)展。
DeepLabV3的目標(biāo)是對(duì)輸入圖像的每個(gè)像素進(jìn)行分類,將每個(gè)像素標(biāo)記為屬于不同類別的某個(gè)目標(biāo)或背景。該模型在圖像分割任務(wù)中取得了很好的性能,尤其在細(xì)粒度的分割和邊界細(xì)化方面表現(xiàn)出色。
主要的改進(jìn)點(diǎn)包括:
-
空洞卷積(Atrous Convolution):DeepLabV3引入了空洞卷積來增大感受野,允許模型在保持計(jì)算效率的同時(shí),獲取更大范圍的上下文信息。這有助于識(shí)別更大和更細(xì)微的目標(biāo)。
-
多尺度信息融合:為了解決多尺度信息的問題,DeepLabV3使用了多尺度空洞卷積,將不同尺度的信息進(jìn)行融合,從而提高了模型的語(yǔ)義分割性能。
-
引入特征金字塔池化(ASPP):ASPP模塊進(jìn)一步增加了感受野,幫助模型更好地理解圖像中的上下文信息。ASPP模塊由一組并行的空洞卷積層組成,每個(gè)卷積層的空洞率不同,從而捕獲不同尺度的信息。
-
使用深度可分離卷積:為了減少模型的參數(shù)量和計(jì)算量,DeepLabV3采用了深度可分離卷積,這是一種將標(biāo)準(zhǔn)卷積分解為深度卷積和逐點(diǎn)卷積的方法。
DeepLabV3模型在PASCAL VOC 2012和Cityscapes等圖像分割數(shù)據(jù)集上取得了顯著的性能提升,成為當(dāng)時(shí)圖像語(yǔ)義分割領(lǐng)域的先進(jìn)模型。其優(yōu)秀的性能使得DeepLabV3被廣泛應(yīng)用于許多圖像分割任務(wù),特別是在需要準(zhǔn)確分割細(xì)節(jié)的場(chǎng)景中。
四、Encoders
以下是 SMP 中支持的編碼器列表。 選擇適當(dāng)?shù)木幋a器系列,然后單擊展開表格并選擇特定的編碼器及其預(yù)訓(xùn)練權(quán)重(encoder_name 和encoder_weights 參數(shù))。
- ResNet
- ResNeXt
- ResNeSt
- Res2Ne(X)t
- RegNet(x/y)
- GERNet
- SE-Net
- SK-ResNe(X)t
- DenseNet
- Inception
- EfficientNet
- MobileNet
- DPN
- VGG
- Mix Vision Transformer
- MobileOne
我這里只展示其中一個(gè),以 ResNet 為例:
更多權(quán)重詳見我的kaggle數(shù)據(jù)集:
https://www.kaggle.com/datasets/holmes0610/pretrained-resnet-resnext
https://www.kaggle.com/datasets/holmes0610/timm-pretrained
Pytorch 圖像模型(又名 timm)有很多預(yù)訓(xùn)練模型和接口,允許使用這些模型作為 smp 中的編碼器,但是,并非所有模型都受支持。
- 并非所有 Transformer 模型都實(shí)現(xiàn)了編碼器所需的 features_only 功能
- 一些模型的步幅不合適
支持的編碼器總數(shù):549
https://smp.readthedocs.io/en/latest/encoders_timm.html
這個(gè)網(wǎng)址里面總結(jié)了所有可用的 Encoders。
五、Models API
- model.encoder:預(yù)訓(xùn)練主干提取不同空間分辨率的特征
- model.decoder:取決于模型架構(gòu)(Unet / Linknet / PSPNet / FPN)
- model.segmentation_head:最后一個(gè)塊產(chǎn)生所需數(shù)量的掩模通道(還包括可選的上采樣和激活)
- model.classification_head:在編碼器頂部創(chuàng)建分類頭的可選塊
- model.forward(x):按順序?qū)?x 通過模型的編碼器、解碼器和分段頭(以及分類頭,如果指定)
六、安裝
PyPI version:
pip install segmentation-models-pytorch
Latest version from source:
pip install git+https://github.com/qubvel/segmentation_models.pytorch