使用segment-anything將目標檢測label轉換為語義分割label

使用segment-anything將目標檢測label轉換為語義分割label

  • 一、segment-anything簡介
  • 二、segment-anything安裝
    • 2.1安裝方法
    • 2.2預訓練模型下載
  • 三、將目標檢測label轉換為語義分割label
    • 3.1示例代碼
    • 3.2代碼說明

一、segment-anything簡介

segment-anything是facebookresearch團隊開發的一套無須訓練,根據提示對圖像自動分割的工具,提示可以是一個點,也可以是一個矩形框。根據主頁介紹,它是使用1100萬圖片和1.1億mask訓練而成,在各類圖片分割中都有很強的性能。

研究團隊還在此基礎上開發出了Segment-Anything-Model 2,簡稱SAM2,SAM2不僅可以對圖像進行分割,還可以對視頻進行分割。

segment-anything項目Github地址為:https://github.com/facebookresearch/segment-anything,
在線演示地址為:https://segment-anything.com/demo,可以在該網站上傳一張本地圖片,進行試驗:
在這里插入圖片描述

SAM2項目Github地址為:https://github.com/facebookresearch/sam2。

二、segment-anything安裝

2.1安裝方法

segment-anything要求環境:python>=3.8pytorch>=1.7,torchvision>=0.8。
安裝方法有兩種,一種為使用pip命令安裝,安裝命令如下:

pip install git+https://github.com/facebookresearch/segment-anything.git

一種為下載項目源代碼進行本地安裝,如下:

git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .

2.2預訓練模型下載

使用segment-anything需要下載對應的預訓練模型,按照參數量從小到大分為:vit_b、vit_l、vit_h,大小分別為:360M、1.2G,2.5G。
三種模型對顯卡顯存的要求也依次增高,根據實際測試,8G顯存的顯卡可以加載運行vit_b和vit_l,無法加載vit_h模型。

模型下載官方地址如下:
vit_b:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth
vit_l:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
vit_h:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth。

CSDN免費下載地址如下:
vit_b:https://download.csdn.net/download/weixin_46846685/91510193
vit_l:https://download.csdn.net/download/weixin_46846685/91510428,https://download.csdn.net/download/weixin_46846685/91510431(CSDN上傳文件限制,分為兩部分)
vit_h:https://download.csdn.net/download/weixin_46846685/91510458,https://download.csdn.net/download/weixin_46846685/91553916,https://download.csdn.net/download/weixin_46846685/91553931(CSDN上傳文件限制,分為三部分)

三、將目標檢測label轉換為語義分割label

目標檢測任務中的label為目標的矩形框坐標,而語義分割任務中的label為目標的輪廓。如果需要將目標檢測任務轉換為語義分割任務,那么就需要對圖片進行重新標注。

這一過程需要耗費大量時間精力,所以本文給出了使用segment-anything進行自動化轉換的代碼,用于提高工作效率,但需要注意的是,實際分割效果需要根據場景進行測試評估,檢查效果是否滿足預期

3.1示例代碼

以YOLO的標簽格式為例,展示如何根據目標檢測的box坐標,將目標輪廓從圖片中分割出來生成對應的mask
代碼如下:

import torch
import numpy as np
import cv2
from segment_anything import sam_model_registry, SamPredictor, SamAutomaticMaskGenerator
from PIL import Image
import os
import sysdevice = "cuda" if torch.cuda.is_available() else "cpu"
sam_checkpoint = "sam_vit_l_0b3195.pth"
model_type = "vit_l"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device)imagepath = 'image.jpg'
labelpath = 'label.txt'
combine = np.zeros([256, 256])
if os.path.getsize(labelpath) > 0:with open(labelpath, 'r') as f:labels=f.readlines()boxes = []for labeldata in labels:parts = labeldata.strip().split()x_center, y_center, w, h = (float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]))gtx1 = int((x_center - w / 2) * 256)gty1 = int((y_center - h / 2) * 256)gtx2 = int((x_center + w / 2) * 256)gty2 = int((y_center + h / 2) * 256)boxes.append([gtx1, gty1, gtx2, gty2])image = cv2.imread(imagepath)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)predictor = SamPredictor(sam)predictor.set_image(image)for box in boxes:masks, scores, logits = predictor.predict(point_coords=None,point_labels=None,box=np.array(box),multimask_output=True,)mask = masks[scores[0].argmax()]combine[np.where(mask==1)]=1mask_output_path = 'mask.png'
mask_img = Image.fromarray(combine.astype(np.uint8))
mask_img.save(mask_output_path)

3.2代碼說明

代碼整體邏輯為:

  1. 首先判斷label文件是否為空,如果為空說明圖片不包含目標,則生成一個全0的mask
  2. 如果不為空,則讀取label的box信息,以box為提示,調用segment-anything對圖片進行分割,上述代碼假設目標只有1類,所以將目標區域填充為1,此處可根據需要進行修改;
  3. 最后生成的mask,背景區域灰度值為0,目標區域灰度值為1,所以直接打開mask圖片無法看到分割出的目標,如需可視化需要另做一些簡單的圖像處理

調用segment-anything的注意事項:

  1. segment-anything不支持直接輸入box的列表,所以上述代碼做了一個循環,循環輸入box;
  2. predictor.predict_torch方法據說可以接受多個box,但是經過實際測試,發現分割出的目標位置有所偏離,目前不知是什么原因。

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

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

相關文章

【unitrix數間混合計算】3.3 無符號整數標記trait(bin_unsigned.rs)

一、源碼 這段代碼是用 Rust 語言實現的一個類型級無符號二進制整數系統,通過類型系統在編譯時表示和操作二進制數字。這是一種典型的"類型級編程"(type-level programming)技術。 use crate::number::{U0, Bin, Bit, BinInt};/// …

Python基本語法總結

1.類(Class)在Python中類(Class)是面向對象編程(OOP)的核心概念。1.1.類的基本定義最簡單的類class Cat:"""這是一個最簡單的類"""pass #創建實例 obj Cat()包含方法的類cl…

數據結構05(Java)-- ( 歸并排序實質,歸并排序擴展問題:小和問題)

前言 本文為本小白🤯學習數據結構的筆記,將以算法題為導向,向大家更清晰的介紹數據結構相關知識(算法題都出自🙌B站馬士兵教育——左老師的課程,講的很好,對于想入門刷題的人很有幫助&#x1f4…

稅務專業人員能力構建與發展路徑指南

CDA數據分析師證書含金量高,適應了未來數字化經濟和AI發展趨勢,難度不高,行業認可度高,對于找工作很有幫助。一、稅務專業人員的核心能力框架能力維度關鍵技能要素專業工具與方法論實踐輸出成果稅務法規應用稅種政策解讀、法規更新…

Linux中rsync使用與inotify實時同步配置指南

Linux中rsync使用與inotify實時同步配置指南 一、rsync 簡介 rsync(Remote Sync)是 Linux 系統下的一款高效數據鏡像和備份工具,用于在本地或遠程同步文件和目錄。 支持本地復制、基于 SSH 的遠程同步,以及使用自有 rsync 協議的同…

Unicode 字符串轉 UTF-8 編碼算法剖析

📊 Unicode 字符串轉 UTF-8 編碼算法剖析 ——從 C# char 到 C wchar_t 的編碼轉換原理 引用:UTF-8 編解碼可視化分析 🔍 1. 算法功能概述 該函數將 Unicode 字符串(C# string)轉換為 UTF-8 編碼的字節數組&#xf…

php的安全性到底怎么樣

PHP作為一種流行的服務器端腳本語言,被廣泛應用于Web開發。然而,由于PHP是一種較為靈活的語言,其安全性議題一直備受爭議。在這篇文章中,我將從多個方面來討論PHP的安全性,包括常見的安全漏洞、防范措施以及最佳實踐。…

mapbox高階,結合threejs(threebox)添加建筑glb模型,添加陰影效果,設置陰影顏色和透明度

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言 1.1 ??mapboxgl.Map 地圖對象 1.2 ??mapboxgl.Map style屬性 1.3 ??threebox loadObj加載模型 二、??…

SSM從入門到實戰:1.6 Spring數據訪問與JDBC模板

👋 大家好,我是 阿問學長!專注于分享優質開源項目解析、畢業設計項目指導支持、幼小初高的教輔資料推薦等,歡迎關注交流!🚀 06-Spring數據訪問與JDBC模板 📖 本文概述 本文是SSM框架系列Spri…

下一代IT服務管理:ITIL5會是什么樣?

ITIL4發布到現在也就5年多時間,按照以往的更新節奏,ITIL5最早也得2027年之后。但現在IT發展的速度,跟以前完全不是一個量級。AI都快把我們的飯碗搶了(開個玩笑),ITIL要是還按部就班,估計真要被時…

最新研究進展:2023-2025年神經機器翻譯突破性成果

文章目錄 一、模型架構創新 1.1 混合架構的崛起 1.2 多模態翻譯的突破 1.3 大語言模型與NMT的深度融合(2023-2024) 1.4 非自回歸翻譯(NAT)的效率革命(2024) 二、數據與訓練策略優化 2.1 低資源語言翻譯的飛躍 2.2 動態數據增強技術 三、效率與部署 3.1 模型壓縮與加速 3.…

OpenTelemetry WebSocket 監控終極方案:打通最后一公里

概述 OpenTelemetry,以下簡稱 OTEL,是由 CNCF 托管的“一站式可觀測性標準”,把指標、鏈路、日志三大信號統一為單一 SDK/API,零侵入地采集從瀏覽器、移動端到后端、容器、云服務的全棧遙測數據,并支持 40 后端一鍵導…

VS Code 出現的 Web 視圖加載錯誤和服務工作者注冊失敗問題解決方案

針對 VS Code 或 Cursor (vscode系)中出現的 Web 視圖加載錯誤和服務工作者注冊失敗問題,以下是永久性解決方案的完整操作指南:解決方案步驟打開命令面板 使用快捷鍵 CtrlShiftP(Windows/Linux)或 CmdShift…

【qml-4】qml與c++交互(類型多例)

背景: 【qml-1】qml與c交互第一次嘗試(實例注入) 【qml-2】嘗試一個有模式的qml彈窗 【qml-3】qml與c交互第二次嘗試(類型注冊) 【qml-4】qml與c交互(類型多例) 【qml-5】qml與c交互&#…

圖數據庫如何構筑 Web3 風控防線 聚焦批量注冊與鏈上盜轉 悅數圖數據庫

隨著 Web3 生態的不斷演進,鏈上風險呈現出團伙化、隱蔽化和動態化的趨勢,傳統的單點風控手段已難以應對復雜多變的攻擊模式。尤其在批量注冊薅羊毛與鏈上交易盜轉洗錢等高頻風險場景中,攻擊者往往通過偽造身份、跨鏈操作、多層嵌套轉賬等方式…

恒流源電路學習

恒流源的設計原理: 如圖所示你可以看到右邊的的推到公式得到紅點處的電壓是一個和左邊相關的定值,所以呢右邊的電流就是電壓除以那個4Ω,所以得到右邊的電路的電流大體是一個定值,不管你再加什么東西都可以保持這個電流&#xff…

基于生成對抗網絡的模糊圖像恢復原理與技術實現

1. 引言圖像模糊是數字圖像處理中的常見問題,其成因包括相機抖動、物體運動、聚焦不良等。傳統方法如維納濾波、Lucy-Richardson 算法等依賴于模糊核估計和逆濾波,在復雜場景下性能有限。生成對抗網絡(Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 變更修復

FE 恢復 異常日志 查看 fe.out 會有以下報錯,此時 fe 進程是無法啟動的,操作前注意備份所有 fe 的元數據并停止上游讀寫動作! java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系統應用收不到開機廣播

安卓14系統應用收不到開機廣播 - Wesley’s Blog 前段時間有測試反饋在安卓14 上面某系統應用恢復出廠設置后沒有自啟動,究竟是什么原因呢? 回顧 Android 從3.1開始,會將新安裝并且從未被啟動的應用置為“STOPPED”狀態,或者被…

C# Attribute 方法擴展

場景 剛寫完一個干凈利落的方法,比如保存數據到數據庫,邏輯清晰、結構優雅, 第二天,“嘿,保存完數據,記得給客戶發個郵件哦~” 第三天,“能不能再發個消息通知其他系統?” 第四天&am…