【計算機視覺】YOLO語義分割

一、語義分割簡介

1. 定義

語義分割(Semantic Segmentation)是計算機視覺中的一項任務,其目標是對圖像中的每一個像素賦予一個類別標簽。與目標檢測只給出目標的邊界框不同,語義分割能夠在像素級別上區分不同類別,從而實現對圖像內容更精細的理解。

2. 原理

  • 像素級分類: 網絡將輸入圖像逐像素進行分類,每個像素根據其所在區域被賦予一個類別標簽。
  • 深度卷積神經網絡: 常用網絡結構包括全卷積網絡(FCN)、U-Net、DeepLab等,這些結構通常由一個特征提取的backbone(例如ResNet、EfficientNet)和一個上采樣(或解碼)部分構成,用以恢復空間分辨率。
  • 損失函數: 常用交叉熵損失、Dice Loss等來平衡各類樣本(尤其當類別分布不均衡時)。

3. 作用與應用

  • 自動駕駛: 對道路、行人、車輛等目標進行像素級分割,輔助場景理解。
  • 醫療影像: 分割器官、病灶區域,輔助臨床診斷。
  • 遙感圖像: 提取地物信息,如建筑、道路、水域等。
  • 場景解析: 用于機器人導航、視頻監控等需要環境理解的場景。

二、基于YOLO進行語義分割訓練

雖然原始的YOLO系列模型主要用于目標檢測,但最新版本(例如YOLOv8)已經擴展了分割能力,實現了檢測與分割任務的聯合訓練。下面介紹具體流程。

1. 數據集標注

  • 標注方式:

    • 對于語義分割,需要為每個圖像提供與之對應的分割掩碼(mask),每個像素的值表示其所屬類別。
    • 常見的標注格式有VOC格式(以PNG圖片保存mask)或COCO格式(包含多邊形或RLE編碼)。
    • 如果是基于YOLOv8的分割任務,則一般需要兩個文件:圖像文件以及對應的mask文件,mask中的不同灰度值代表不同類別。
  • 注意事項:

    • 標注時要確保邊界清晰,避免模糊區域。
    • 類別不平衡問題需提前處理,如進行數據增強或采樣調整。
  • 標注信息

    class_id x1 y1 x2 y2 ... xn yn
    

    各位置的含義說明如下:

    • 第一個數(class_id):
      表示該目標的類別編號(從 0 開始),用于區分不同的語義類別。
    • 后續的數值(x1, y1, x2, y2, …, xn, yn):
      這些數字成對出現,每一對代表多邊形邊界上一個頂點的坐標。
      • x 坐標與 y 坐標:通常是歸一化后的值(相對于圖像寬度和高度),數值范圍通常在 0 到 1 之間。
      • 頂點順序:須按照目標邊緣的順序排列(順時針或逆時針均可,但應保持一致),以確保能夠正確構成目標的閉合區域。

2. 訓練方式與代碼示例

YOLOv8的分割模型在訓練時通常采用端到端方式,同時學習檢測和分割任務。下面提供一個偽代碼/代碼示例,展示如何進行訓練:

# data.yaml —— YOLOv8 語義分割任務數據集配置文件# 數據集根目錄,可以是絕對路徑或相對于當前工作目錄的相對路徑
path: ../datasets/pothole_seg# 訓練、驗證和測試圖像的路徑(相對于 path)
train: images/train   # 存放訓練圖像的文件夾
val: images/val       # 存放驗證圖像的文件夾
test: images/test     # 測試圖像(可選,訓練時可以不配置)# 類別數量
nc: 1# 類別名稱列表,順序要與標注數據中每行第一個數字(類別索引)保持一致
names: ['pothole']

在上述代碼中,YOLOv8的訓練腳本會自動加載數據、應用數據增強、計算目標檢測與分割的聯合損失,最終輸出訓練好的模型。

3. 模型評估

在訓練過程中,YOLOv8 會實時輸出多個指標來幫助您評估模型的性能,主要包括:

  • 訓練損失:記錄總損失以及各個組成部分,如目標框(box)損失、目標置信度(obj)損失、分類(cls)損失以及分割任務中特有的掩碼損失(mask loss 或 segmentation loss)。
  • 驗證指標:在驗證階段,會自動計算并輸出常見指標,如精度(Precision,P)、召回率(Recall,R)、以及平均精度均值(mAP),通常包括 mAP@0.5(即 IoU 閾值為 0.5 時的 mAP)和 mAP@0.5:0.95(不同 IoU 閾值下的綜合 mAP)。
  • 速度指標:訓練日志中還會顯示每個 epoch 的時間消耗、每張圖像的處理速度等,這有助于評估訓練效率。

4. 模型使用

from ultralytics import YOLO# 加載訓練好的語義分割模型權重
model = YOLO("runs/segment/train/weights/best.pt")# 對單張圖像進行推理
results = model.predict(source="path/to/image.jpg", imgsz=640)# 查看并保存推理結果(通常在runs/segment/predict目錄中保存預測圖片和對應的txt文件)
results.show()    # 彈窗顯示預測結果
results.save()    # 將預測結果保存到磁盤
  • 分割掩碼:每個檢測到的對象會輸出一個精確的分割掩碼,可用于后續的目標區域分析。
  • 置信度:顯示每個預測的置信度分數,幫助您判斷模型輸出的可靠性。
  • 后處理:根據需要,您可以對輸出的結果進行進一步的后處理,例如與原圖疊加顯示、導出為JSON格式等。

三、語義分割訓練技巧與注意點

數據與標注

  • 標注質量:語義分割要求精細的多邊形標注,每個目標區域的頂點必須準確無誤。確保標注數據的一致性和準確性,否則容易影響模型分割效果。
  • 數據預處理:圖像和標注文件需要歸一化處理,保證坐標值在 [0, 1] 范圍內。同時建議對數據進行合理劃分(訓練/驗證/測試),保證數據分布均衡。

數據增強

  • 多樣化增強:使用隨機翻轉、旋轉、縮放、透視變換以及馬賽克(Mosaic)等數據增強策略,可以顯著提升模型對各種場景的泛化能力。
  • 注意增強策略與任務匹配:對于語義分割任務,增強方法需要同時作用于圖像和對應的掩碼。確保增強過程中保持目標區域的連貫性。

模型與超參數設置

  • 預訓練權重:使用預訓練模型(如 yolov8n-seg.pt)作為初始化,可以加速收斂并提高精度,尤其在數據量較小時效果更明顯。
  • 訓練損失監控:關注總損失及各部分損失(如 box、obj、cls、mask 損失),根據損失變化及時調整學習率和其他超參。
  • 超參數調節:調節 batch size、學習率(lr0 與 lrf)、動量、權重衰減等,特別注意 mask_ratio 和 overlap_mask 參數,這兩個參數對語義分割模型中掩碼預測的效果有較大影響。
  • 多尺度訓練:可嘗試使用多尺度訓練以適應不同尺寸目標,提高模型的魯棒性。

訓練過程監控與調試

  • 實時監控:利用 TensorBoard 或 Ultralytics 提供的日志工具實時查看訓練過程中的損失曲線、驗證指標(如 mAP@0.5 和 mAP@0.5:0.95)、精度和召回率等。
  • 早停機制:使用早停(early stopping)策略,在驗證指標長時間不提升時停止訓練,避免過擬合。
  • 硬件與內存:根據 GPU 內存適當設置 batch size,同時注意使用 AMP(自動混合精度)訓練,既能提高訓練速度也能降低內存占用。

后處理與結果可視化

  • 分割掩碼處理:訓練完成后,通過可視化工具檢查預測的分割掩碼效果,驗證模型是否能準確還原目標區域。
  • 定制后處理:根據任務需求可以對分割結果進行后處理,例如平滑邊界、提取 ROI 區域等。

在這里插入圖片描述

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

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

相關文章

MATLAB之數據分析圖系列:從二維到三維(直接套用)

MATLAB以其強大的矩陣運算和可視化功能,成為科研、工程領域的標配工具。本文提供從基礎二維圖形到復雜三維模型的即用代碼塊,涵蓋數據標注、多圖排版、動態演示等核心技巧 所有代碼均經過MATLAB 2023a實測,替換數據即可生成專業級圖表。” …

HTTP響應數據包全面解析:結構、原理與最佳實踐

目錄 HTTP響應概述 HTTP響應數據包結構 2.1 狀態行 2.2 響應頭 2.3 空行 2.4 響應體 HTTP狀態碼詳解 3.1 1xx信息響應 3.2 2xx成功響應 3.3 3xx重定向 3.4 4xx客戶端錯誤 3.5 5xx服務器錯誤 常見HTTP響應頭字段 響應體內容類型 緩存控制機制 實際HTTP響應示例分…

H.264編碼解析與C++實現詳解

一、H.264編碼核心概念 1.1 分層編碼結構 H.264采用分層設計,包含視頻編碼層(VCL)和網絡抽象層(NAL)。VCL處理核心編碼任務,NAL負責封裝網絡傳輸數據。 1.2 NALU單元結構 // NAL單元頭部結構示例 struc…

快速入手-基于Django-rest-framework的自身組件權限認證(九)

1、在對應的視圖函數里增加認證(局部起作用,不全局生效) 導入類: from rest_framework.authentication import ( BasicAuthentication, SessionAuthentication, ) from rest_framework.permissions import IsAuthentica…

受控組件和非受控組件的區別

在 React 中,?受控組件(Controlled Components)? 和 ?非受控組件(Uncontrolled Components)? 是處理表單元素的兩種不同方式,它們的核心區別在于 ?數據管理的方式 和 ?與 React 的交互模式。 受控組件…

邁向云原生:理想汽車 OLAP 引擎變革之路

在如今數據驅動的時代,高效的分析引擎對企業至關重要。理想汽車作為智能電動汽車的領軍企業,面臨著海量數據分析的挑戰。本文將展開介紹理想汽車 OLAP 引擎從存算一體向云原生架構演進的變革歷程,以及在此過程中面臨的挑戰,以及是…

ZLMediaKit 源碼分析——[3] ZLToolKit 中EventPoller之網絡事件處理

系列文章目錄 第一篇 基于SRS 的 WebRTC 環境搭建 第二篇 基于SRS 實現RTSP接入與WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 環境搭建 第四篇 WebRTC學習一:獲取音頻和視頻設備 第五篇 WebRTC學習二:WebRTC音視頻數據采集 第六篇 WebRTC學習三…

【分布式】分布式限流方案解析

文章目錄 固定窗口限流方案?實現方式?優點?缺點? 滑動窗口限流方案?實現方式?優點?缺點? 令牌桶限流方案?實現方式?優點?缺點? 漏斗限流方案?實現方式?優點?缺點? 在分布式系統蓬勃發展的當下,系統面臨的流量挑戰日益復雜。為確保系統在高并發場景下…

WPS JS宏編程教程(從基礎到進階)-- 第三部分:JS宏編程語言開發基礎

第三部分:JS宏編程語言開發基礎 @[TOC](第三部分:JS宏編程語言開發基礎)**第三部分:JS宏編程語言開發基礎**1. 變量與數據類型**變量聲明:三種方式****示例代碼****數據類型判斷****實戰:動態處理單元格類型**2. 運算符全解析**算術運算符****易錯點:字符串拼接 vs 數值相…

Python - 爬蟲-網頁抓取數據-庫urllib

urllib庫是Python內置的HTTP請求庫。無需額外安裝,可以直接使用。urllib庫包含以下四個模塊。 urllib.request - 打開和讀取 URL。urllib.error - 包含 urllib.request 拋出的異常。urllib.parse - 解析 URL。urllib.robotparser - 解析 robots.txt 文件。 1、reque…

C++進階知識復習 1~15

C 進階總復習 (1~15) 目的1. 介紹下程序從編寫到可執行的整個過程2. C中的auto和decltype的區別3. 介紹下多態的實現原理4. C中的new[] 和delete[] 為什么一定要配對使用?5. C中malloc申請的內存 可以使用delete釋放嘛6. 什么情況下會出現內存…

輸電線路航空標志球:低空飛行的安全路標 / 恒峰智慧科技

在現代社會,隨著航空業的快速發展,低空飛行活動日益頻繁。為了確保飛行安全,避免飛機與高壓電線等障礙物發生碰撞,輸電線路航空標志球應運而生。這種裝置被廣泛應用于高壓輸電線路上,尤其是超高壓和跨江輸電線&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件詳解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件詳解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件詳解 在 Debian/Ubuntu 系統中,/etc/network/interfaces 是傳統網絡接口配置文件,用于定義網絡接口的靜態/動態配置。以下是逐項解…

OpenCV 圖形API(或稱G-API)(1)

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 引言 OpenCV 圖形API(或稱G-API)是一個新的OpenCV模塊,旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路2. 代碼實現 題目鏈接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路 這一題大的思路上不難想到就是一個動態規劃的思路。我們分別…

win10之mysql server 8.0.41安裝

一 mysql server 下載 官網下載地址頁面 https://dev.mysql.com/downloads/mysql/二 免裝版使用步驟 1 解壓 下載完成后,解壓文件夾,如下所示: 2 執行安裝命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二屆藍橋杯省賽軟件類(cc++組)

第一題&#xff08;空間&#xff09; 解題思路 答案 #include <stdio.h>int main() {// 計算256MB對應的字節數&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每個32位二進制整數占4個字節&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移動語義

文章目錄 一、移動語義1、為什么需要移動語義&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何實現移動語義&#xff1f;——移動構造函數/賦值4、什么時候觸發移動&#xff1f;5、移動 vs 拷貝 一、移動語義 1、為什么需要移動語…

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…