實(shí)現(xiàn)與配置指南)
人工智能計(jì)算機(jī)視覺(jué)預(yù)訓(xùn)練【免費(fèi)下載鏈接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg點(diǎn)擊查看免費(fèi)下載RelaxBoundaryLoss邊界松弛損失是 PaddleSeg 專為 DecoupledSegNet 設(shè)計(jì)的損失函數(shù)通過(guò)主體特征損失 邊緣特征損失 交叉熵?fù)p失的組合形式在邊界松弛約束下最大化邊界像素各候選類別概率之和從而緩解語(yǔ)義分割中邊界像素類別模糊、難以標(biāo)注的問(wèn)題。閱讀本文后你將掌握該損失的數(shù)學(xué)動(dòng)機(jī)、border/calculate_weights/upper_bound/ignore_index四個(gè)核心參數(shù)的語(yǔ)義與默認(rèn)值、其底層 one-hot 松弛與自定義 NLL 的實(shí)現(xiàn)細(xì)節(jié)并能直接在 DecoupledSegNet 訓(xùn)練配置中落地使用。一、設(shè)計(jì)動(dòng)機(jī)為什么需要邊界松弛損失在語(yǔ)義分割任務(wù)中邊界像素往往位于兩個(gè)或多個(gè)類別的交界處其真實(shí)類別本身就存在歧義人工標(biāo)注難以精確到像素級(jí)網(wǎng)絡(luò)預(yù)測(cè)時(shí)邊界區(qū)域的置信度也通常偏低。傳統(tǒng)交叉熵?fù)p失對(duì)每個(gè)像素強(qiáng)制要求一個(gè)唯一正確的類別遇到難以標(biāo)注或無(wú)法標(biāo)注的像素時(shí)會(huì)向梯度傳播引入噪聲。DecoupledSegNet出自論文Improving Semantic Segmentation via Decoupled Body and Edge Supervision在結(jié)構(gòu)上將分割任務(wù)解耦為主體body分割與邊緣edge檢測(cè)兩條監(jiān)督路徑參見(jiàn) paddleseg/models/decoupled_segnet.py 的forward訓(xùn)練時(shí)輸出[seg_logit, body_logit, edge_logit, (seg_logit, edge_logit)]四路結(jié)果。與之配套的 RelaxBoundaryLoss 正是為這種解耦式監(jiān)督設(shè)計(jì)的損失函數(shù)它對(duì)邊界像素不再?gòu)?qiáng)制指定唯一類別而是允許其候選類別集合包含 ≥2 個(gè)類別優(yōu)化目標(biāo)是在邊界松弛約束下最大化單個(gè)像素各候選分類概率之和損失由多部分組成主體特征的損失、邊緣特征的損失以及交叉熵?fù)p失共同作用于 DecoupledSegNet 的多路輸出。二、API 與核心參數(shù)RelaxBoundaryLoss 的完整類簽名如下定義于 paddleseg/models/losses/decoupledsegnet_relax_boundary_loss.pyclass paddleseg.models.losses.RelaxBoundaryLoss( border 1, calculate_weights False, upper_bound 1.0, ignore_index 255 )各參數(shù)含義與默認(rèn)值如下表參數(shù)類型含義默認(rèn)值borderint邊界松弛值決定向四周擴(kuò)展多少個(gè)像素作為候選邊界區(qū)域1calculate_weightsbool是否對(duì)每個(gè)類別計(jì)算權(quán)重類別均衡Falseupper_boundfloat當(dāng)開(kāi)啟類別權(quán)重計(jì)算時(shí)權(quán)重的上限值1.0ignore_indexint64標(biāo)注圖中需要忽略的像素值這些像素不貢獻(xiàn)輸入梯度2552.1 border控制邊界松弛范圍border是松弛的核心載體。在實(shí)現(xiàn)中relax_onehot方法decoupledsegnet_relax_boundary_loss.py它會(huì)對(duì)標(biāo)簽圖執(zhí)行F.pad(label, [self.border] * 4, valuenum_classes)向上下左右各填充border個(gè)像素填充值取num_classes即把 ignore 區(qū)域映射為一個(gè)額外的類別槽位將ignore_index標(biāo)記的像素也改寫為num_classes在[-border, border]的滑動(dòng)窗口內(nèi)逐個(gè)偏移對(duì)每個(gè)偏移位置做F.one_hot(label_, num_classes 1)并累加最終將累加結(jié)果二值化onehot 0得到 (N, C1, H, W) 的松弛 one-hot 標(biāo)簽。可以推斷border1時(shí)每個(gè)像素會(huì)聚合其 3×3 鄰域內(nèi)可能出現(xiàn)的所有類別形成候選類別集合border越大候選集合越寬松對(duì)邊界標(biāo)注誤差的容忍度越高但也會(huì)讓主體區(qū)域更易被邊界語(yǔ)義污染因此通常保持默認(rèn)值 1。2.2 ignore_index屏蔽難標(biāo)注像素ignore_index指定標(biāo)注圖中需要忽略的像素灰度值。當(dāng)標(biāo)注圖中存在無(wú)法標(biāo)注或很難標(biāo)注的像素時(shí)可將其標(biāo)為特定灰度值默認(rèn) 255計(jì)算損失時(shí)這些位置對(duì)應(yīng)的像素不作為損失函數(shù)的自變量不參與梯度回傳。實(shí)現(xiàn)上relax_onehot先把 ignore 像素改寫為num_classes槽位forward中再通過(guò)ignore_mask (weights 0)生成掩碼在custom_nll中以(1. - ignore_mask)相乘將其從損失中剔除decoupledsegnet_relax_boundary_loss.py。2.3 calculate_weights 與 upper_bound類別均衡當(dāng)calculate_weightsTrue時(shí)calculate_weights方法decoupledsegnet_relax_boundary_loss.py會(huì)根據(jù)標(biāo)簽中各類別像素占比hist計(jì)算類別權(quán)重hist paddle.sum(label, axis(1, 2)) * 1.0 / label.sum() hist ((hist ! 0) * self.upper_bound * (1 - hist)) 1可見(jiàn)權(quán)重與該類別像素占比成反比占比越低權(quán)重越大并通過(guò)upper_bound限制權(quán)重的最大值防止少數(shù)類被過(guò)度放大。注意該方法的計(jì)算結(jié)果并沒(méi)有顯式返回函數(shù)體內(nèi)無(wú) return 語(yǔ)句從源碼結(jié)構(gòu)看這是一個(gè)待完善的接口占位因此在實(shí)際使用時(shí)建議保持calculate_weightsFalse默認(rèn)值類別均衡可交給OhemCrossEntropyLoss等其他損失承擔(dān)。三、底層實(shí)現(xiàn)松弛 one-hot 與自定義 NLLRelaxBoundaryLoss 的forwarddecoupledsegnet_relax_boundary_loss.py按以下步驟計(jì)算損失調(diào)用relax_onehot(label, c)得到松弛后的 one-hot 標(biāo)簽label形狀為 (N, C1, H, W)其中前 C 個(gè)通道表示候選類別最后一個(gè)通道為 ignore/填充槽位由weights label[:, :-1, :, :].sum(1)統(tǒng)計(jì)每個(gè)像素的候選類別數(shù)ignore_mask (weights 0)標(biāo)記無(wú)有效候選的像素border_weights weights ignore_mask作為歸一化分母——邊界像素候選類別多、權(quán)重更大非邊界像素權(quán)重為 1實(shí)現(xiàn)邊界損失均攤逐樣本調(diào)用custom_nlldecoupledsegnet_relax_boundary_loss.py計(jì)算損失。custom_nll是核心其關(guān)鍵邏輯為soft F.softmax(logit, axis1) # 將邊界像素在候選類別上的 softmax 概率聚合到對(duì)應(yīng)位置 soft_label ((soft * label[:, :-1, :, :].astype(float32)).sum( 1, keepdimTrue)) * (label[:, :-1, :, :].astype(float32)) soft soft * (1 - label[:, :-1, :, :]).astype(float32) soft_label logsoft paddle.log(soft) ... # border loss is divided equally logsoft -1 / border_weights * logsoft * (1. - ignore_mask) logsoft logsoft.sum() / (n * h * w - ignore_mask.sum() 1)結(jié)合源碼可以解讀其設(shè)計(jì)意圖候選類別概率聚合對(duì)于屬于候選集合的像素其損失不再只取單一類別的 log-softmax而是把該像素在所有候選類別上的 softmax 概率求和后再取對(duì)數(shù)——這正是文檔所述在邊界松弛約束下使單個(gè)像素各分類的概率之和最大化的直接數(shù)學(xué)形式邊界均攤-1 / border_weights使候選類別越多的邊界像素單項(xiàng)貢獻(xiàn)越小避免多候選像素的損失被重復(fù)累加而失衡歸一化分母用n * h * w - ignore_mask.sum() 1即僅統(tǒng)計(jì)有效像素?cái)?shù)1 防止除零與ignore_index語(yǔ)義一致。四、在 DecoupledSegNet 中的組合使用在官方配置 configs/decoupled_segnet/decoupledsegnet_resnet50_os8_cityscapes_1024x512_80k.yml 中RelaxBoundaryLoss 并非單獨(dú)使用而是與多個(gè)損失組合成多路監(jiān)督loss: types: - type: OhemCrossEntropyLoss - type: RelaxBoundaryLoss - type: BCELoss weight: dynamic edge_label: True - type: OhemEdgeAttentionLoss coef: [1,1,25,1] train_dataset: edge: True這種組合正好對(duì)應(yīng) DecoupledSegNet 的多路輸出decoupled_segnet.pyOhemCrossEntropyLosscoef1監(jiān)督主體分割輸出seg_logitRelaxBoundaryLosscoef1監(jiān)督(seg_logit, edge_logit)組合輸出為邊界像素提供松弛監(jiān)督BCELosscoef25權(quán)重最高配合train_dataset.edge: True生成的真值邊緣圖監(jiān)督edge_logit邊緣分支OhemEdgeAttentionLosscoef1進(jìn)一步對(duì)邊緣注意力進(jìn)行難例挖掘。值得注意的是train_dataset.edge: True是配套前提該配置要求數(shù)據(jù)集在預(yù)處理時(shí)額外生成邊緣標(biāo)簽RelaxBoundaryLoss 與 BCELoss 才能正確對(duì)齊輸入。另一份同系列配置 configs/decoupled_segnet/decoupledsegnet_resnet50_os8_cityscapes_832x832_80k.yml 使用了完全相同的損失組合僅分辨率不同可作為遷移到其他尺寸/數(shù)據(jù)集的參考模板。在實(shí)際使用中你可以通過(guò) YAML 為 RelaxBoundaryLoss 傳入?yún)?shù)例如loss: types: - type: RelaxBoundaryLoss border: 1 calculate_weights: False upper_bound: 1.0 ignore_index: 255 coef: [1]五、源碼組織與擴(kuò)展入口損失實(shí)現(xiàn)paddleseg/models/losses/decoupledsegnet_relax_boundary_loss.py ——RelaxBoundaryLoss類通過(guò)manager.LOSSES.add_component注冊(cè)因此可直接以字符串type: RelaxBoundaryLoss在配置中引用注冊(cè)匯總paddleseg/models/losses/init.py —— 將RelaxBoundaryLoss導(dǎo)入并納入損失組件命名空間模型配套paddleseg/models/decoupled_segnet.py ——DecoupledSegNet與其SqueezeBodyEdge解耦頭訓(xùn)練時(shí)輸出主體/邊緣/組合三路 logit 與 RelaxBoundaryLoss 對(duì)接損失組合機(jī)制paddleseg/models/losses/mixed_loss.py ——MixedLoss按coef加權(quán)累加多個(gè)損失是上述配置中多損失組合的運(yùn)行時(shí)載體。完整的損失函數(shù)清單與索引可參見(jiàn) docs/module/loss/losses_en.md。六、小結(jié)RelaxBoundaryLoss 是 PaddleSeg 中與 DecoupledSegNet 強(qiáng)綁定的邊界感知損失它以border控制邊界松弛范圍用候選類別概率求和替代單類別強(qiáng)制約束配合ignore_index屏蔽難標(biāo)注像素再通過(guò)邊界權(quán)重均攤實(shí)現(xiàn)穩(wěn)定訓(xùn)練。在官方 Cityscapes 配置中它與 OhemCrossEntropyLoss、BCELoss、OhemEdgeAttentionLoss 以coef: [1,1,25,1]組合成完整的解耦監(jiān)督體系。理解其 one-hot 松弛與自定義 NLL 的實(shí)現(xiàn)細(xì)節(jié)將幫助你在自定義邊界敏感的數(shù)據(jù)集上更精準(zhǔn)地調(diào)節(jié)參數(shù)、復(fù)現(xiàn)或改進(jìn) DecoupledSegNet 的訓(xùn)練效果。贊分享人工智能計(jì)算機(jī)視覺(jué)預(yù)訓(xùn)練【免費(fèi)下載鏈接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg點(diǎn)擊查看免費(fèi)下載相關(guān)推薦PaddleSeg RelaxBoundaryLoss 深度解析面向 DecoupleSegNet 的邊界松弛損失實(shí)戰(zhàn)指南PaddleSeg RelaxBoundaryLoss 深度解析面向 DecoupleSegNet 的邊界松弛損失實(shí)戰(zhàn)指南 導(dǎo)讀 RelaxBoundaryL人工智能計(jì)算機(jī)視覺(jué)預(yù)訓(xùn)練StarRocks Toolchains 開(kāi)發(fā)環(huán)境基礎(chǔ)鏡像構(gòu)建指南CentOS 7 / Ubuntu / Rocky Linux 9 全平臺(tái)實(shí)踐StarRocks Toolchains 開(kāi)發(fā)環(huán)境基礎(chǔ)鏡像構(gòu)建指南CentOS 7 / Ubuntu / Rocky Linux 9 全平臺(tái)實(shí)踐 本篇技術(shù)指南人工智能計(jì)算機(jī)視覺(jué)預(yù)訓(xùn)練PaddleSeg 中 L1Loss 損失函數(shù)詳解從數(shù)學(xué)原理到源碼實(shí)現(xiàn)與訓(xùn)練配置PaddleSeg 中 L1Loss 損失函數(shù)詳解從數(shù)學(xué)原理到源碼實(shí)現(xiàn)與訓(xùn)練配置 L1LossL1 范數(shù)損失又稱最小絕對(duì)值偏差損失是圖像分割任務(wù)中最基礎(chǔ)人工智能計(jì)算機(jī)視覺(jué)預(yù)訓(xùn)練上一篇vue-pure-admin 完整實(shí)戰(zhàn)三步跑通 Vue3 中后臺(tái)管理系統(tǒng)下一篇5步輕松掌握Windows風(fēng)扇控制FanControl中文完整方案創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考