伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

UNet和UNet++:醫學影像經典分割網絡對比

OpenCV學堂 ? 來源:AI公園 ? 作者:AI公園 ? 2022-04-25 10:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導讀

在不同的任務上對比了UNet和UNet++以及使用不同的預訓練編碼器的效果。

介紹

語義分割是計算機視覺的一個問題,我們的任務是使用圖像作為輸入,為圖像中的每個像素分配一個類。在語義分割的情況下,我們不關心是否有同一個類的多個實例(對象),我們只是用它們的類別來標記它們。有多種關于不同計算機視覺問題的介紹課程,但用一張圖片可以總結不同的計算機視覺問題:

5891bd82-c3e2-11ec-bce3-dac502259ad0.png

語義分割在生物醫學圖像分析中有著廣泛的應用:x射線、MRI掃描、數字病理、顯微鏡、內窺鏡等。https://grand-challenge.org/challenges上有許多不同的有趣和重要的問題有待探索。

從技術角度來看,如果我們考慮語義分割問題,對于N×M×3(假設我們有一個RGB圖像)的圖像,我們希望生成對應的映射N×M×k(其中k是類的數量)。有很多架構可以解決這個問題,但在這里我想談談兩個特定的架構,Unet和Unet++。

有許多關于Unet的評論,它如何永遠地改變了這個領域。它是一個統一的非常清晰的架構,由一個編碼器和一個解碼器組成,前者生成圖像的表示,后者使用該表示來構建分割。每個空間分辨率的兩個映射連接在一起(灰色箭頭),因此可以將圖像的兩種不同表示組合在一起。并且它成功了!

58bd8a7a-c3e2-11ec-bce3-dac502259ad0.png

接下來是使用一個訓練好的編碼器。考慮圖像分類的問題,我們試圖建立一個圖像的特征表示,這樣不同的類在該特征空間可以被分開。我們可以(幾乎)使用任何CNN,并將其作為一個編碼器,從編碼器中獲取特征,并將其提供給我們的解碼器。據我所知,Iglovikov & Shvets 使用了VGG11和resnet34分別為Unet解碼器以生成更好的特征和提高其性能。

58dcf5cc-c3e2-11ec-bce3-dac502259ad0.png

TernausNet (VGG11 Unet)

Unet++是最近對Unet體系結構的改進,它有多個跳躍連接。

58f2818a-c3e2-11ec-bce3-dac502259ad0.png

根據論文, Unet++的表現似乎優于原來的Unet。就像在Unet中一樣,這里可以使用多個編碼器(骨干)來為輸入圖像生成強特征。

我應該使用哪個編碼器?

這里我想重點介紹Unet和Unet++,并比較它們使用不同的預訓練編碼器的性能。為此,我選擇使用胸部x光數據集來分割肺部。這是一個二值分割,所以我們應該給每個像素分配一個類為“1”的概率,然后我們可以二值化來制作一個掩碼。首先,讓我們看看數據。

5913b238-c3e2-11ec-bce3-dac502259ad0.png

來自胸片X光數據集的標注數據的例子

這些是非常大的圖像,通常是2000×2000像素,有很大的mask,從視覺上看,找到肺不是問題。使用segmentation_models_pytorch庫,我們為Unet和Unet++使用100+個不同的預訓練編碼器。我們做了一個快速的pipeline來訓練模型,使用Catalyst (pytorch的另一個庫,這可以幫助你訓練模型,而不必編寫很多無聊的代碼)和Albumentations(幫助你應用不同的圖像轉換)。

  1. 定義數據集和增強。我們將調整圖像大小為256×256,并對訓練數據集應用一些大的增強。
importalbumentationsasA
fromtorch.utils.dataimportDataset,DataLoader
fromcollectionsimportOrderedDict

classChestXRayDataset(Dataset):
def__init__(
self,
images,
masks,
transforms):
self.images=images
self.masks=masks
self.transforms=transforms

def__len__(self):
return(len(self.images))

def__getitem__(self,idx):
"""Willloadthemask,getrandomcoordinatesaround/withthemask,
loadtheimagebycoordinates
"""
sample_image=imread(self.images[idx])
iflen(sample_image.shape)==3:
sample_image=sample_image[...,0]
sample_image=np.expand_dims(sample_image,2)/255
sample_mask=imread(self.masks[idx])/255
iflen(sample_mask.shape)==3:
sample_mask=sample_mask[...,0]
augmented=self.transforms(image=sample_image,mask=sample_mask)
sample_image=augmented['image']
sample_mask=augmented['mask']
sample_image=sample_image.transpose(2,0,1)#channelsfirst
sample_mask=np.expand_dims(sample_mask,0)
data={'features':torch.from_numpy(sample_image.copy()).float(),
'mask':torch.from_numpy(sample_mask.copy()).float()}
return(data)

defget_valid_transforms(crop_size=256):
returnA.Compose(
[
A.Resize(crop_size,crop_size),
],
p=1.0)

deflight_training_transforms(crop_size=256):
returnA.Compose([
A.RandomResizedCrop(height=crop_size,width=crop_size),
A.OneOf(
[
A.Transpose(),
A.VerticalFlip(),
A.HorizontalFlip(),
A.RandomRotate90(),
A.NoOp()
],p=1.0),
])

defmedium_training_transforms(crop_size=256):
returnA.Compose([
A.RandomResizedCrop(height=crop_size,width=crop_size),
A.OneOf(
[
A.Transpose(),
A.VerticalFlip(),
A.HorizontalFlip(),
A.RandomRotate90(),
A.NoOp()
],p=1.0),
A.OneOf(
[
A.CoarseDropout(max_holes=16,max_height=16,max_width=16),
A.NoOp()
],p=1.0),
])


defheavy_training_transforms(crop_size=256):
returnA.Compose([
A.RandomResizedCrop(height=crop_size,width=crop_size),
A.OneOf(
[
A.Transpose(),
A.VerticalFlip(),
A.HorizontalFlip(),
A.RandomRotate90(),
A.NoOp()
],p=1.0),
A.ShiftScaleRotate(p=0.75),
A.OneOf(
[
A.CoarseDropout(max_holes=16,max_height=16,max_width=16),
A.NoOp()
],p=1.0),
])

defget_training_trasnforms(transforms_type):
iftransforms_type=='light':
return(light_training_transforms())
eliftransforms_type=='medium':
return(medium_training_transforms())
eliftransforms_type=='heavy':
return(heavy_training_transforms())
else:
raiseNotImplementedError("Notimplementedtransformationconfiguration")
  1. 定義模型和損失函數。這里我們使用帶有regnety_004編碼器的Unet++,并使用RAdam + Lookahed優化器使用DICE + BCE損失之和進行訓練。
importtorch
importsegmentation_models_pytorchassmp
importnumpyasnp
importmatplotlib.pyplotasplt
fromcatalystimportdl,metrics,core,contrib,utils
importtorch.nnasnn
fromskimage.ioimportimread
importos
fromsklearn.model_selectionimporttrain_test_split
fromcatalyst.dlimportCriterionCallback,MetricAggregationCallback
encoder='timm-regnety_004'
model=smp.UnetPlusPlus(encoder,classes=1,in_channels=1)
#model.cuda()
learning_rate=5e-3
encoder_learning_rate=5e-3/10
layerwise_params={"encoder*":dict(lr=encoder_learning_rate,weight_decay=0.00003)}
model_params=utils.process_model_params(model,layerwise_params=layerwise_params)
base_optimizer=contrib.nn.RAdam(model_params,lr=learning_rate,weight_decay=0.0003)
optimizer=contrib.nn.Lookahead(base_optimizer)
scheduler=torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,factor=0.25,patience=10)
criterion={
"dice":DiceLoss(mode='binary'),
"bce":nn.BCEWithLogitsLoss()
}
  1. 定義回調函數并訓練!
callbacks=[
#Eachcriterioniscalculatedseparately.
CriterionCallback(
input_key="mask",
prefix="loss_dice",
criterion_key="dice"
),
CriterionCallback(
input_key="mask",
prefix="loss_bce",
criterion_key="bce"
),

#Andonlythenweaggregateeverythingintooneloss.
MetricAggregationCallback(
prefix="loss",
mode="weighted_sum",
metrics={
"loss_dice":1.0,
"loss_bce":0.8
},
),

#metrics
IoUMetricsCallback(
mode='binary',
input_key='mask',
)

]

runner=dl.SupervisedRunner(input_key="features",input_target_key="mask")
runner.train(
model=model,
criterion=criterion,
optimizer=optimizer,
scheduler=scheduler,
loaders=loaders,
callbacks=callbacks,
logdir='../logs/xray_test_log',
num_epochs=100,
main_metric="loss",
minimize_metric=True,
verbose=True,
)

如果我們用不同的編碼器對Unet和Unet++進行驗證,我們可以看到每個訓練模型的驗證質量,并總結如下:

59583070-c3e2-11ec-bce3-dac502259ad0.png

Unet和Unet++驗證集分數

我們注意到的第一件事是,在所有編碼器中,Unet++的性能似乎都比Unet好。當然,有時這種差異并不是很大,我們不能說它們在統計上是否完全不同 —— 我們需要在多個folds上訓練,看看分數分布,單點不能證明任何事情。第二,resnest200e顯示了最高的質量,同時仍然有合理的參數數量。有趣的是,如果我們看看https://paperswithcode.com/task/semantic-segmentation,我們會發現resnest200在一些基準測試中也是SOTA。

好的,但是讓我們用Unet++和Unet使用resnest200e編碼器來比較不同的預測。

597a5e7a-c3e2-11ec-bce3-dac502259ad0.png

Unet和Unet++使用resnest200e編碼器的預測。左圖顯示了兩種模型的預測差異

在某些個別情況下,Unet++實際上比Unet更糟糕。但總的來說似乎更好一些。

一般來說,對于分割網絡來說,這個數據集看起來是一個容易的任務。讓我們在一個更難的任務上測試Unet++。為此,我使用PanNuke數據集,這是一個帶標注的組織學數據集(205,343個標記核,19種不同的組織類型,5個核類)。數據已經被分割成3個folds。

59e83314-c3e2-11ec-bce3-dac502259ad0.png

PanNuke樣本的例子

我們可以使用類似的代碼在這個數據集上訓練Unet++模型,如下所示:

5a230200-c3e2-11ec-bce3-dac502259ad0.png

驗證集上的Unet++得分

我們在這里看到了相同的模式 - resnest200e編碼器似乎比其他的性能更好。我們可以用兩個不同的模型(最好的是resnest200e編碼器,最差的是regnety_002)來可視化一些例子。

5a37ee2c-c3e2-11ec-bce3-dac502259ad0.png

resnest200e和regnety_002的預測

我們可以肯定地說,這個數據集是一項更難的任務 —— 不僅mask不夠精確,而且個別的核被分配到錯誤的類別。然而,使用resnest200e編碼器的Unet++仍然表現很好。

總結

這不是一個全面語義分割的指導,這更多的是一個想法,使用什么來獲得一個堅實的基線。有很多模型、FPN,DeepLabV3, Linknet與Unet有很大的不同,有許多Unet-like架構,例如,使用雙編碼器的Unet,MAnet,PraNet,U2-net — 有很多的型號供你選擇,其中一些可能在你的任務上表現的比較好,但是,一個堅實的基線可以幫助你從正確的方向上開始。

審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    4002

    瀏覽量

    143209
  • 醫學影像
    +關注

    關注

    1

    文章

    112

    瀏覽量

    17791

原文標題:UNet 和 UNet++:醫學影像經典分割網絡對比

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    兆芯近期適配重點產品推薦

    近期,兆芯繼續攜手多家生態伙伴推進ZX86自主生態建設,圍繞開勝KH-50000、開先KX-7000等處理器平臺,完成了包括SSD、內存、IP廣播系統服務器、智慧工廠軟件、醫學影像存儲與傳輸軟件等產品的兼容適配認證,進一步為行業創新發展與數智轉型升級提供更可靠的基礎支撐。
    的頭像 發表于 01-12 17:18 ?1201次閱讀

    GlobTek 醫療級電纜組件:標準與可靠性

    在醫療電子系統中,線束與電纜組件通常被視為基礎部件,但在工程實踐中,它們往往直接影響整機的安全性、穩定性以及合規可行性。從生命體征監護、醫學影像診斷,到治療與康復類設備,電源與信號連接的可靠程度,決定了系統在長期運行狀態下的風險邊界。
    的頭像 發表于 12-23 16:37 ?312次閱讀
    GlobTek 醫療級電纜組件:標準與可靠性

    影像儀AI自動尋邊技術精準捕捉邊界測量,檢測效率翻倍!

    【智能制造測量】影像測量儀的AI自動尋邊技術是通過深度學習模型,實現對工件特征的自主識別與邊緣精準提取。能解決質檢環節中多重邊界提偏、刀紋干擾、對比度低等測量痛點。
    發表于 11-18 10:16

    4K影像賦能精準醫療:索尼FCB-CS8230與SDI編碼板的協同創新之路

    在醫療技術向精準化、智能化邁進的今天,影像系統已成為疾病診斷、手術治療與醫學教研的核心支撐。清晰的微觀成像、實時的信號傳輸、穩定的環境適配,關系到診療決策的準確性與醫療操作的安全性。索尼4K模組
    的頭像 發表于 10-28 14:29 ?451次閱讀

    手機板 layout 走線跨分割問題

    初學習layout時,都在說信號線不可跨分割,但是在工作中為了成本不能跨分割似乎也非絕對。 在后續工作中,跨分割的基礎都是相鄰層有一面完整的GND參考,跨分割發生在相鄰的另外一層。 但
    發表于 09-16 14:56

    圖像采集卡:連接現實與數字世界的關鍵橋梁

    當您點開一個高清直播畫面、見證工廠精密零件被自動化檢測、或是看到醫院里清晰的醫學影像時,您可曾想過這些動態圖像如何從攝像機實時躍入電腦屏幕?圖像采集卡正是驅動這一切的核心技術。作為專業視頻采集領域
    的頭像 發表于 09-05 14:30 ?778次閱讀
    圖像采集卡:連接現實與數字世界的關鍵橋梁

    RK3576 yolo11-seg訓練部署教程

    結構和分割頭設計,實現了像素級的精確目標檢測與分割,適用于自動駕駛、醫學影像、工業檢測等對精度和速度要求苛刻的場景。本教程針對目標分割算法yolov11seg的訓練和部
    的頭像 發表于 07-25 15:21 ?2003次閱讀
    RK3576 yolo11-seg訓練部署教程

    芯盾時代如何打造下一代醫療的可信訪問體系

    近年來,我國醫療行業掀起了“智慧醫院”建設高潮,醫院信息系統(HIS)、實驗室信息系統(LIS)、電子病歷系統(EMR)、醫學影像存檔與通信系統(PACS)等業務應用極大提升了診療效率,讓醫生工作更輕松,讓群眾看病更方便。
    的頭像 發表于 07-21 14:30 ?854次閱讀

    全球首個胃癌影像篩查AI模型發布

    浙江省腫瘤醫院聯合阿里巴巴達摩院,發布了全球首個胃癌影像篩查AI模型DAMO GRAPE,首次利用平掃CT影像識別早期胃癌病灶,并聯合全國20家醫院,在近10萬人的大規模臨床研究中大幅提升胃癌檢出率。 相關論文在24日登上了國際頂級期刊《自然·
    的頭像 發表于 06-30 14:37 ?3950次閱讀

    【正點原子STM32MP257開發板試用】基于 DeepLab 模型的圖像分割

    :https://arxiv.org/pdf/1706.05587 應用場景 自動駕駛:用于道路、車輛、行人等目標的精確分割醫學影像分析:用于腫瘤、器官等區域的分割。 衛星圖像分析:用于土地覆蓋、建筑物
    發表于 06-21 21:11

    華為發布HUAWEI Pura 80系列,讓影像遠超想象

    [中國,上海,2025年6月11日] 華為正式推出影像旗艦手機——HUAWEI Pura 80系列,憑借極致的影像技術和創新能力,再次引領移動影像未來。 HUAWEI Pura 80 Pro+
    發表于 06-12 15:10 ?3253次閱讀
    華為發布HUAWEI Pura 80系列,讓<b class='flag-5'>影像</b>遠超想象

    深度揭秘,MXM顯卡竟然是醫療設備的“隱形剛需”!

    在醫療設備領域,隨著醫學影像技術的不斷發展,超聲、內窺鏡等醫療設備對于圖像處理、數據運算等方面的要求也在日益提高,而GPU(圖形處理器)顯卡憑借其強大的并行計算能力和高內存帶寬等優勢,逐漸成為醫療
    的頭像 發表于 06-04 15:54 ?1479次閱讀
    深度揭秘,MXM顯卡竟然是醫療設備的“隱形剛需”!

    東軟集團入選國家數據局數據標注優秀案例

    近日,東軟飛標醫學影像標注平臺在國家數據局發布數據標注優秀案例集名單中排名第一(案例名稱“多模態醫學影像智能數據標注平臺”)。評選專家認為東軟案例取得了顯著成效,一方面,搶占了自主可控的數據標注技術
    的頭像 發表于 05-09 14:37 ?1377次閱讀

    新唐科技M55M1 MCU在藥品識別上的應用

    在AI時代,物體識別和圖像顯示的重要性日益凸顯。圖像識別作為人工智能的重要分支,能模擬人類視覺系統以理解、識別并解釋圖像或視頻信息。該技術已廣泛應用于家電智能化、物體分類、工業自動化、機器視覺、智能監控、醫學影像診斷等領域。
    的頭像 發表于 05-08 11:33 ?1259次閱讀
    新唐科技M55M1 MCU在藥品識別上的應用

    RK3576 yolov11-seg訓練部署教程

    級的精確目標檢測與分割,適用于自動駕駛、醫學影像、工業檢測等對精度和速度要求苛刻的場景。 ? ? ? ?本教程針對目標分割算法yolov11 seg的訓練和部署到EASY-EAI-Orin-nano(RK3576)進行說明,而
    的頭像 發表于 04-16 09:43 ?2519次閱讀
    RK3576 yolov11-seg訓練部署教程