yolov8分割任務的推理和后處理解析

在這里插入圖片描述

文章目錄

  • 一、前言
  • 二、分割模型的前向推理
    • 1. 檢測結果:來自Detect類的輸出
    • 2. 分割結果(最終)
    • 3. 與Detect的主要區別
    • 4. 工作流程
  • 三、后處理
    • 1. 非極大值抑制(NMS)過濾檢測框
    • 2. 分割原型(Mask Prototypes)提取
    • 3. 掩碼生成

一、前言

這篇文章主要分享yolov8模型用于圖像分割時,模型輸出和后處理。徹底理了下,可以總結為以下3點:

  1. 分割繼承檢測,前向推理時也會調用檢測的方法把目標框檢測出來;
  2. 但是前向推理分割和檢測是各自進行的,訓練也是分別去計算loss;
  3. 在后處理時為了提精度,在有目標處才去分割,然后為了提速掩膜才去系數和乘以原始掩膜的方法,系數和原始掩膜都是分割模型的前向推理輸出;

yolov8官方代碼路徑:https://github.com/ultralytics/ultralytics

二、分割模型的前向推理

代碼位置:yolo/ultralytics/nn/modules/head.py
在這里插入圖片描述
解釋:

  1. 繼承關系:
  • Segment繼承了Detect的所有基礎功能,包括目標檢測的能力
  • 它擴展了Detect的功能,增加了實例分割的能力
  1. 主要組件:
def __init__(self, nc=80, nm=32, npr=256, ch=()):super().__init__(nc, ch)self.nm = nm  # 掩碼數量self.npr = npr  # 原型數量self.proto = Proto(ch[0], self.npr, self.nm)  # 原型網絡self.detect = Detect.forward  # 保留檢測功能
  1. 推理輸出:
    從forward方法可以看出,Segment模型在推理時返回兩個主要部分:
def forward(self, x):p = self.proto(x[0])  # 生成掩碼原型bs = p.shape[0]  # batch size# 生成掩碼系數mc = torch.cat([self.cv4[i](x[i]).view(bs, self.nm, -1) for i in range(self.nl)], 2)x = self.detect(self, x)  # 調用檢測功能if self.training:return x, mc, preturn (torch.cat([x, mc], 1), p) if self.export else (torch.cat([x[0], mc], 1), (x[1], mc, p))

推理時返回的內容包括:

1. 檢測結果:來自Detect類的輸出


變量解釋:

  • x:分別為3個head輸出的特征圖(大中小)
    shape為:(bs, 4+類別數,特征圖寬,特征圖高)

  • y: 邊界框坐標+類別預測(經過sigmoid)——縱向拼接
    shape為:(bs, 4+類別數,框的個數)

  • 訓練模式,則輸出x;

  • 推理模式:
    export為onnx時則輸出:y
    否則輸出一個元組:(y, x)

2. 分割結果(最終)

變量解釋:

  • 掩碼系數mc(mask coefficients)
    shape為:(bs, 32(系數個數),框的個數)
  • 原型掩碼p(prototype masks)
    shape為:(bs, 32(系數個數),mask圖寬,mask圖高)

訓練模式,輸出三個元素:x(detect的輸出,對應x),mc,p

推理模式:

export為onnx時輸出元組包含2個元素:

  • 第一個元素:縱向(第1維)拼接x(這里對應detect輸出的y)和mc
    shape為:(bs, 4+類別數+32(系數個數),框的個數)
  • 第二個元素:p

否則也是輸出元組包含2個元素:

  • 第一個元素只有1個元素:縱向拼接x0和mc
    可以理解為:目標檢測的結果+掩碼系數
    shape為 (bs, 4+類別數+32,mask(或框)的個數)
    –>(4后處理的輸入[0]
  • 第二個元素是個元組有3個元素:(x1, mc, p)
    可以理解為:目標檢測的head特征,掩碼系數,原型掩碼
    –>(4后處理的輸入[1]

3. 與Detect的主要區別

  • Detect只輸出檢測結果(邊界框和類別)
  • Segment在Detect的基礎上增加了分割能力,可以輸出實例掩碼
  • Segment使用原型網絡(Proto)來生成掩碼,這是分割特有的組件

4. 工作流程

  • 首先通過原型網絡生成基礎掩碼
  • 同時進行目標檢測
  • 將檢測結果和掩碼系數結合,生成最終的實例分割結果
    這種設計使得Segment模型能夠同時完成目標檢測和實例分割任務,是一個多任務的模型架構。

三、后處理

代碼位置:yolo/ultralytics/yolo/v8/segment/predict.py
在這里插入圖片描述
其中:
pred[0]實際上就是:縱向拼接x0和mc
pred[1]實際上就是:(x1, mc, p)
在這里插入圖片描述

1. 非極大值抑制(NMS)過濾檢測框

  • 功能:
    • 過濾掉低置信度(< conf)的檢測框。
    • 合并IoU超過閾值(iou)的重疊框。
    • 若啟用agnostic_nms,不同類別的框也會被合并(適用于類別無關任務)。
    • 輸出p為一個列表,每個元素對應一張圖像的檢測結果(形狀:(num_boxes, 6 + num_masks),其中num_boxes為保留的檢測框數,6包含x1,y1,x2,y2,conf,cls,mask1系數,mask2系數,…32個系數)。
  • 注意:
    • preds[0]形狀為(batch_size, 4 + num_classes + num_masks, num_boxes)
    • num_masks 為 mask系數數量,通常是32個
    • mask_coeffs用于和原型掩碼線性組合生成實例分割
    • 原型掩碼是由模型預測出來的,對應output1

2. 分割原型(Mask Prototypes)提取

  • 背景:
    • preds[1]是分割頭的輸出,包含掩碼原型。
    • 若模型為PyTorch格式(未導出),preds[1]可能有3個元素(如不同尺度的原型),需取最后一個(最高分辨率)。
    • 若模型已導出(如ONNX),preds[1]直接為原型張量。
  • 形狀:
    • proto的典型形狀為[batch, K, H, W],其中:
      • K:原型數量(如32)。
      • H, W:原型的分辨率(如輸入圖像的1/4大小)

3. 掩碼生成

在這里插入圖片描述
注意:每一個框對應一組掩碼系數。

分為兩個模式:
有四個尺寸:特征圖尺寸(框對應);input尺寸;mask尺寸;原圖尺寸

(1) 視網膜掩碼:(標藍是一個過程)
精度更高

放大box坐標到原圖->生成mask(小圖)->裁剪mask圖(因為輸入的時候為了保持圖像不變形,會在兩側添加填充)->resize mask到原圖->裁切mask對齊框(保留檢測框內的區域,框外區域置為0)

(2) 普通掩碼:(標藍是一個過程)-- 推理默認
性能更好

生成mask(小圖)->把坐標縮放到mask->裁切mask對齊框(保留檢測框內的區域,框外區域置為0)->resize mask到input尺寸->把坐標放大到原圖
注意:這個時候resize mask跟box坐標不在同一個尺寸標準下,畫圖的時候會把mask縮放到原圖大小。

代碼位置:yolo/ultralytics/yolo/utils/plotting.py
在這里插入圖片描述

(3) 這兩個模式都包括了兩個操作:

(a) 縮放坐標

  1. 將檢測框坐標從模型輸入尺寸(img.shape[2:])縮放到原始圖像尺寸(orig_img.shape),處理填充(padding)和縮放比例,確保框位置正確映射。
  2. 拆切超出圖像邊緣部分的框。

(b) 生成掩碼
代碼位置:yolo/ultralytics/yolo/utils/ops.py

如果是視網膜掩碼,則使用process_mask_native

  1. 輸入參數:
def process_mask_native(protos, masks_in, bboxes, shape):"""protos: 原型掩碼 [mask_dim, mask_h, mask_w]masks_in: 預測的掩碼系數 [n, mask_dim]bboxes: 檢測框 [n, 4]shape: 原始圖像尺寸 (h,w)"""
  1. 掩碼生成:
c, mh, mw = protos.shape  # 獲取原型掩碼的維度
# 將掩碼系數與原型掩碼相乘,得到最終掩碼
masks = (masks_in @ protos.float().view(c, -1)).sigmoid().view(-1, mh, mw)
  • 將原型掩碼展平為2D矩陣
  • 與掩碼系數進行矩陣乘法
  • 應用sigmoid激活函數
  • 重塑為3D張量
  1. 計算縮放和填充:
# 計算縮放比例
gain = min(mh / shape[0], mw / shape[1])  # gain = 舊尺寸/新尺寸# 計算填充值
pad = (mw - shape[1] * gain) / 2, (mh - shape[0] * gain) / 2  # wh padding
top, left = int(pad[1]), int(pad[0])  # y, x
bottom, right = int(mh - pad[1]), int(mw - pad[0])
  • 計算保持寬高比的縮放比例
  • 計算圖像兩側的填充值
  • 確定裁剪區域
  1. 裁剪掩碼:
# 裁剪掉填充區域
masks = masks[:, top:bottom, left:right]
  • 移除填充區域
  • 保持有效區域
  1. 調整大小:
# 將掩碼調整到原始圖像大小
masks = F.interpolate(masks[None], shape, mode='bilinear', align_corners=False)[0]
  • 使用雙線性插值
  • 調整到原始圖像尺寸
  • 保持掩碼質量
  1. 根據檢測框裁剪(保留檢測框內的區域,框外區域置為0):
# 根據檢測框裁剪掩碼
masks = crop_mask(masks, bboxes)
  • 將掩碼裁剪到檢測框區域
  • 確保掩碼與檢測框對齊
  1. 二值化處理:
# 將掩碼二值化
return masks.gt_(0.5)
  • 使用0.5作為閾值
  • 將掩碼轉換為二值圖像

如果是普通掩碼,則使用process_mask

  1. 生成mask
  2. 將檢測框坐標從圖像尺寸縮放到掩碼尺寸
  3. 使用縮放后的檢測框裁剪掩碼,確保掩碼與檢測框對齊
  4. mask上采樣要原圖

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

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

相關文章

4.1.1 Spark SQL概述

Spark SQL是Apache Spark的一個模塊&#xff0c;專門用于處理結構化數據。它引入了DataFrame這一編程抽象&#xff0c;DataFrame是帶有Schema信息的分布式數據集合&#xff0c;類似于關系型數據庫中的表。用戶可以通過SQL、DataFrames API和Datasets API三種方式操作結構化數據…

華為OD機試真題——書籍疊放(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

尚硅谷redis7 63-69 redis哨兵監控之理論簡介

63 redis哨兵監控之理論簡介 什么是哨兵 master掛了如何辦?從機原地待命。此時數據只能讀取不能更新。因此需要&#xff1a; 吹哨人巡查監控后臺master主機是否故障,如果故障了根據投票數自動將某一個從庫轉換為新主庫, 哨兵的作用 1、監控redis運行狀態,包括master和slave…

word文檔格式規范(論文格式規范、word格式、論文格式、文章格式、格式prompt)

文章目錄 prompt prompt [格式要求] - 字體&#xff1a;中文宋體小四&#xff1b;英文Times New Roman 12pt&#xff1b;標題黑體 - 行距&#xff1a;1.5倍&#xff08;段前段后0行&#xff09; - 邊距&#xff1a;A4默認&#xff08;上下2.54cm&#xff0c;左右3.17cm&…

SpringBoot+tabula+pdfbox解析pdf中的段落和表格數據

一、前言 在日常業務需求中&#xff0c;往往會遇到解析pdf文件中的段落或者表格數據的需求。 常見的做法是使用 pdfbox 來做&#xff0c;但是它只能提取文本數據&#xff0c;沒有我們在文件頁面上面的那種結構化組織&#xff0c;文本通常是散亂的包含各種換行回車空格等格式&a…

【Elasticsearch】stored_fields

在 Elasticsearch 中&#xff0c;stored_fields 是一個非常重要的概念&#xff0c;主要用于控制文檔存儲和檢索時的行為。以下是對 stored_fields 的詳細解釋&#xff1a; 1\. stored_fields 的作用 stored_fields 用于指定在檢索文檔時需要返回的字段。默認情況下&#xff0c;…

計算機網絡 | 1.1 計算機網絡概述思維導圖

附大綱&#xff1a; 計算機網絡的概念 一個通過通信設備與線路把不同計算機系統連接起來&#xff0c;實現資源共享和信息傳遞的系統 計算機網絡的組成 從組成成分上 硬件&#xff1a;主機、通信鏈路、交換設備、通信處理機軟件&#xff1a;網絡操作系統、聊天軟件等協議&…

HOW - 簡歷和求職面試寶典(三)

文章目錄 1. 面試邀約2. 開始面試和自我介紹第一、面試前的準備工作第二、如何全面地介紹自己1. 面試邀約 第一、先認識日常HR 的工作流程 首先,電話溝通是 HR 核心工作內容的一部分。電話溝通分為兩種:一種是電話預約;另外一種是電話確認。 電話預約很清晰,就是確認面試…

Java基礎 Day24

一、進程和線程 1、進程 &#xff08;1&#xff09;概念 進程 (Process) 是計算機中的程序關于某數據集合上的一次運行活動 是系統進行資源分配的基本單位 簡單理解&#xff1a;程序的執行過程&#xff08;正在運行的應用程序&#xff09; &#xff08;2&#xff09;特性…

C#學習:基于LLM的簡歷評估程序

前言 在pocketflow的例子中看到了一個基于LLM的簡歷評估程序的例子&#xff0c;感覺還挺好玩的&#xff0c;為了練習一下C#&#xff0c;我最近使用C#重寫了一個。 準備不同的簡歷&#xff1a; 查看效果&#xff1a; 不足之處是現實的簡歷應該是pdf格式的&#xff0c;后面可以…

git怎么合并兩個分支

git怎么合并分支代碼 注意: 第一步你得把當前分支合到遠程分支去才能有下面的操作 另外我是將develop分支代碼合并到release分支去 git 命令 查看本地所有分支 git branch切換分支 例如切換到release分支 git checkout release拉取代碼 git pull up release 合并分支 …

Android-kotlin協程學習總結

Kotlin協程實戰對話? ?真題1&#xff1a;協程與線程的本質區別是什么&#xff1f;為什么說協程是輕量級的&#xff1f;?? ?面試官?&#xff1a; “我看你項目中用協程替代了線程池&#xff0c;能說說協程和線程的核心區別嗎&#xff1f;為什么協程更適合高并發&#xf…

uni-app學習筆記十四-vue3中emit的使用

在組件傳值中&#xff0c;無論是props還是slot都是單向數據流&#xff0c;父組件向子組件傳值&#xff0c;子組件不能直接對父組件傳過來的值進行重新賦值。 下面學習子組件向父組件傳值的工具--emit。 在子組件emit設置傳遞的函數名和值 <template><view>子組件…

Java設計模式從基礎到實際運用

第一部分&#xff1a;設計模式基礎 1. 設計模式概述 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的代碼設計經驗的總結&#xff0c;它描述了在軟件設計過程中一些不斷重復出現的問題以及該問題的解決方案。設計模式是在特定環境下解決軟件設計問題…

鴻蒙OSUniApp 制作自定義的進度條組件#三方框架 #Uniapp

使用 UniApp 制作自定義的進度條組件 在移動應用開發中&#xff0c;進度條是非常常見的 UI 組件&#xff0c;無論是文件上傳、下載、任務進度還是表單填寫反饋&#xff0c;進度條都能為用戶提供直觀的進度提示。雖然 UniApp 提供了一些基礎的進度條能力&#xff0c;但在實際項…

Python爬蟲實戰:研究Beautiful Soup框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的數據量呈爆炸式增長。如何從海量的網頁數據中高效提取有價值的信息,成為信息科學領域的重要研究課題。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照預設規則遍歷互聯網并采集數據,為信息檢索、輿情分析、商…

【Tips】關于PCI和PCIe的配置空間差異和io/memory io讀寫

最近在看同事2023年講的PCI基礎課&#xff0c;感覺確實是豁然開朗了&#xff0c;贊美同事。 PCIe實際上是PCI的擴展&#xff08;extended&#xff09;&#xff0c;PCIe設備相當于是迭代升級產品。 而PCIe的配置空間基于PCI原有的0xFF&#xff08;256字節&#xff09;配置空間…

桂花網體育運動監測方案:開啟幼兒園運動健康管理新篇章

在幼兒教育領域&#xff0c;運動能力的培養與健康監測始終是備受關注的核心環節。隨著科技的飛速發展&#xff0c;如何科學、有效地監測幼兒的運動狀態&#xff0c;成為了幼兒園教育者面臨的一大挑戰。桂花網體育運動監測方案憑借其高效、精準、智能化的特性&#xff0c;為幼兒…

Perforce P4產品簡介:無限擴展+全球協作+安全管控+工具集成(附下載)

本產品簡介由Perforce中國授權合作伙伴——龍智編輯整理&#xff0c;旨在帶您快速了解Perforce P4版本控制系統的強大之處。 世界級無限可擴展的版本控制系統 Perforce P4&#xff08;原Helix Core&#xff09;是業界領先的版本控制平臺&#xff0c;備受19家全球Top20 AAA級游…

pikachu靶場通關筆記08 XSS關卡04-DOM型XSS

目錄 一、XSS原理 二、DOM型XSS 三、源碼分析 1、進入靶場 2、XSS探測 3、源碼分析 四、滲透實戰 1、Payload1 2、Payload2 3、Payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#xff0c;通過對XSS關卡源碼的代碼審計找到XSS風…