操指南:5 行代碼拿到第一張掩碼)
Segment Anything 零樣本圖像分割實(shí)操指南5 行代碼拿到第一張掩碼【免費(fèi)下載鏈接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/segment-anything給一批電商商品圖摳背景最省事的做法是逐張標(biāo)框一天也標(biāo)不完幾百張。而 Segment Anything ModelSAM是 Meta 開源的零樣本圖像分割模型你點(diǎn)一個(gè)點(diǎn)或畫一個(gè)框它直接吐出對(duì)應(yīng)的物體掩碼不想逐個(gè)人工提示時(shí)它還能自動(dòng)鋪滿整張圖生成所有候選分割。這篇文章帶你從裝環(huán)境到跑通批處理一條路走完。按下面的步驟做完你能得到三樣?xùn)|西一個(gè)能按點(diǎn)提示輸出掩碼的推理腳本、一個(gè)按框提示的單掩碼調(diào)用以及一份對(duì)整圖自動(dòng)生成的掩碼清單。適合有基本 Python 經(jīng)驗(yàn)、想在自己的業(yè)務(wù)數(shù)據(jù)上驗(yàn)證 SAM 分割效果的開發(fā)者。圖SAM 對(duì)整張街景圖自動(dòng)生成的掩碼覆蓋效果來自倉庫 自動(dòng)掩碼生成示例。一次拍照片之后隨便點(diǎn)把 SAM 想成一個(gè)廚藝極穩(wěn)的廚房圖像編碼器先花幾十秒把整道菜完整看一遍之后你再指哪道菜、哪個(gè)盤子提示編碼器只負(fù)責(zé)把你的指認(rèn)翻譯成模型能懂的信號(hào)出菜速度取決于解碼器而解碼器非常輕。對(duì)應(yīng)到代碼里set_image算一次圖像編碼并緩存之后每次predict只跑輕量的掩碼解碼所以在同一張圖上反復(fù)點(diǎn)不同提示幾乎不額外花時(shí)間。? 1. 最小可運(yùn)行環(huán)境怎么搭克隆倉庫與安裝在倉庫根目錄本地安裝 SAM 包。倉庫只讀不要往里加文件版本前提Python ≥ 3.8、PyTorch ≥ 1.7。git clone https://gitcode.com/GitHub_Trending/se/segment-anything cd segment-anything pip install -e . # 以可編輯模式安裝裝好 torch/torchvision 即可 pip install opencv-python matplotlib # 示例 notebook 與可視化需要你會(huì)看到什么pip結(jié)束后打印Successfully installed segment_anything-1.0。驗(yàn)證一下import segment_anything # 無 ImportError 即安裝成功 print(segment_anything.__all__)卡住了怎么辦報(bào)setuptools或wheel相關(guān)錯(cuò)誤先pip install -U pip setuptools wheel再重試torch 沒裝 CUDA 版本也能跑只是慢一個(gè)量級(jí)后面第 5 步會(huì)量化。環(huán)境只是殼模型權(quán)重不在倉庫里下一步把它接上。2. 加載 SAM checkpoint 并實(shí)例化預(yù)測(cè)器下面這段代碼負(fù)責(zé)把權(quán)重掛到 ViT-B 骨干上并包裝成可反復(fù)調(diào)用的預(yù)測(cè)器checkpoint 文件名為 SAM 官方發(fā)布的sam_vit_b_01ec64.pth請(qǐng)先從項(xiàng)目官方發(fā)布頁下載并放到倉庫根目錄三個(gè)版本里 ViT-B 最小約 380MBCPU 或 4GB 顯存就能跑適合先驗(yàn)證流程。import torch from segment_anything import sam_model_registry, SamPredictor checkpoint sam_vit_b_01ec64.pth # 先下載到倉庫根目錄 model_type vit_b # vit_b / vit_l / vit_h越大越準(zhǔn)也越吃顯存 device cuda if torch.cuda.is_available() else cpu sam sam_model_registrymodel_type # 加載權(quán)重并進(jìn)入 eval sam.to(devicedevice) predictor SamPredictor(sam) # 之后所有預(yù)測(cè)都通過它發(fā)起你會(huì)看到什么加載完成時(shí)沒有任何額外打印進(jìn)程內(nèi)存增加約 400~600MB權(quán)重本身 運(yùn)行時(shí)開銷即可認(rèn)為成功。卡住了怎么辦FileNotFoundError就是權(quán)重路徑?jīng)]對(duì)上確認(rèn) checkpoint 與腳本的工作目錄一致KeyError: model_type說明寫成了vit-b之外的名字注冊(cè)表里只有default、vit_h、vit_l、vit_b四個(gè)鍵定義在 核心源碼。權(quán)重就位后還得告訴模型分割哪張圖這一步同時(shí)是最容易出細(xì)節(jié)問題的地方。3. 準(zhǔn)備輸入圖像尺寸、通道與坐標(biāo)系的坑set_image會(huì)把圖像按長(zhǎng)邊 1024 縮放、緩存圖像編碼并把后續(xù)所有提示坐標(biāo)換算回原圖坐標(biāo)系——所以你必須按原圖像素給點(diǎn)。注意它的image_format默認(rèn)是RGB而 OpenCV 讀出來是 BGR這里顯式聲明否則掩碼會(huì)整體偏色錯(cuò)位。import cv2 image cv2.imread(notebooks/images/truck.jpg) # HWC uint8BGR predictor.set_image(image, image_formatBGR) # 內(nèi)部換算通道并縮放一次即可 print(predictor.original_size, predictor.input_size) # (1200, 1800) (1024, 1536)你會(huì)看到什么最后一行打印原圖尺寸(1200, 1800)與送入模型的尺寸(1024, 1536)長(zhǎng)邊 1024、寬高比保持不變??ㄗ×嗽趺崔k如果后面predict報(bào)An image must be set with .set_image(...)說明兩次調(diào)用之間又構(gòu)造了新的 predictor緩存存在實(shí)例里同一張圖只調(diào)一次set_image換圖才重新調(diào)用。圖像緩存好了現(xiàn)在用第一個(gè)提示驗(yàn)證整條鏈路。4. 用點(diǎn)提示跑第一次分割點(diǎn)提示約定point_coords是 (x, y) 的 Nx2 數(shù)組point_labels里 1 表示點(diǎn)在目標(biāo)內(nèi)、0 表示點(diǎn)在背景里。下面對(duì)卡車車輪打一個(gè)前景點(diǎn)import numpy as np point_coords np.array([[500, 375]]) # 原圖坐標(biāo)系下的 (x, y) point_labels np.array([1]) # 1前景 masks, scores, low_res predictor.predict( point_coordspoint_coords, point_labelspoint_labels, multimask_outputTrue, # 歧義提示單點(diǎn)建議開多掩碼 ) print(masks.shape, np.round(scores, 3))你會(huì)看到什么輸出(3, 1200, 1800) (0.98x 0.96x 0.8x)一類的形狀——三個(gè)二值掩碼已縮放回原圖尺寸scores是模型對(duì)每個(gè)掩碼的質(zhì)量自評(píng)0~1按分?jǐn)?shù)從高到低排序masks[0]通常最準(zhǔn)??ㄗ×嗽趺崔kValueError且涉及 shape九成是把point_coords傳成了 (x, y) 而不是 Nx2 的二維數(shù)組想加背景點(diǎn)排除雜色時(shí)追加一行坐標(biāo)并把 label 設(shè)為 0 即可。點(diǎn)提示之外框提示同樣走predict的box參數(shù)XYXY 格式對(duì)輪廓清晰的目標(biāo)更穩(wěn)。單目標(biāo)驗(yàn)證通過剩下的問題就變成整張圖一次性全部分出來。5. 整圖自動(dòng)分割批處理生成全部掩碼AMG 內(nèi)部會(huì)按網(wǎng)格撒點(diǎn)默認(rèn)每邊 32 個(gè)點(diǎn)共 1024 個(gè)提示、分批推理再經(jīng)質(zhì)量過濾、NMS 去重、小區(qū)域清理最后輸出去重后的掩碼清單from segment_anything import SamAutomaticMaskGenerator generator SamAutomaticMaskGenerator( sam, points_per_side32, # 提示密度越大越細(xì)也越慢 points_per_batch64, # 每批點(diǎn)數(shù)顯存吃緊就調(diào)小 min_mask_region_area500, # 丟棄面積小于 500 像素的碎塊 output_modebinary_mask, ) all_masks generator.generate(image) # image 為 BGR ndarray 也行內(nèi)部按 RGB 處理 print(len(all_masks)) # 掩碼數(shù)量街景圖常見 10~60 個(gè) print(all_masks[0].keys()) # segmentation / bbox / area / stability_score 等你會(huì)看到什么all_masks是一個(gè)列表每個(gè)元素含segmentation與原圖等大的二值數(shù)組、bboxXYWH、area、stability_score等字段。倉庫的 批處理腳本 就是這套邏輯的命令行版本支持整個(gè)文件夾輸入可以直接復(fù)用??ㄗ×嗽趺崔k整圖生成慢是正常的——ViT-B 在 GPU 上一般 10~30 秒出結(jié)果CPU 上以分鐘計(jì)耐心等完一批掩碼數(shù)量偏少時(shí)把points_per_side提到 64或把pred_iou_thresh從默認(rèn) 0.88 放寬到 0.8。跑通批處理后最后一步是學(xué)會(huì)判斷結(jié)果到底靠不靠譜。怎么判斷結(jié)果好不好三個(gè)信號(hào)加一張對(duì)照表第一個(gè)信號(hào)是scores單掩碼或每條記錄的stability_scoreAMG0.9 以上基本可放心直接用0.85~0.9 建議人工抽查低于 0.8 大概率要補(bǔ)提示。第二個(gè)信號(hào)是掩碼形狀本身邊界是否貼著目標(biāo)輪廓、有沒有明顯出血到背景或漏掉目標(biāo)一角——把掩碼以 0.5 透明度疊回原圖看一眼幾秒就能發(fā)現(xiàn)問題。第三個(gè)信號(hào)是bbox與area掩碼應(yīng)落在包圍盒內(nèi)area與 bbox 面積的比值若極端偏小或偏大說明切到了不該切的東西。調(diào)用方式返回掩碼數(shù)質(zhì)量分適合場(chǎng)景點(diǎn)提示 multimask_outputTrue3 個(gè)候選有scores單擊、目標(biāo)有歧義點(diǎn)提示 multimask_outputFalse1 個(gè)有scores提示已足夠明確框提示 multimask_outputFalse1 個(gè)有scores輪廓清晰的目標(biāo)AMG 自動(dòng)模式每圖若干stability_score無人值守批量生產(chǎn)multimask_outputFalse時(shí)模型不再返回 3 個(gè)候選predictor.predict的文檔注釋明確建議提示不歧義時(shí)關(guān)閉多掩碼效果更好。分?jǐn)?shù)和形狀都看過了剩下的就是把調(diào)參和報(bào)錯(cuò)集中到一張表里。?? 調(diào)優(yōu)與排坑一張表覆蓋常見現(xiàn)象先說一句AMG 的pred_iou_thresh0.88、stability_score_thresh0.95是按 ViT-H 校準(zhǔn)的默認(rèn)值換到 ViT-B 上分?jǐn)?shù)分布略保守想多留掩碼就各放寬 0.02~0.05?,F(xiàn)象原因處理RuntimeError: An image must be set未調(diào)set_image或 predictor 被重新構(gòu)造每次換圖前調(diào)用一次set_image別中途重建實(shí)例掩碼整體錯(cuò)位、顏色發(fā)灰OpenCV 讀圖是 BGR沒聲明通道set_image(image, image_formatBGR)點(diǎn)提示掩碼飄到別處坐標(biāo)用了縮放后尺寸或?qū)懗闪?(y, x)按原圖像素給 (x, y)見第 3 步CUDA out of memoryViT-H 權(quán)重 AMG 批量過大換vit_bpoints_per_batch降到 32CPU 上單圖推理要 30 秒以上ViT-B 在 CPU 上編碼本身就慢上 GPU或只導(dǎo)出輕量解碼器做 ONNX見 ONNX 腳本AMG 掩碼太少默認(rèn)閾值對(duì) ViT-B 偏嚴(yán)pred_iou_thresh降到 0.8points_per_side提至 64從裝環(huán)境、接權(quán)重到點(diǎn)/框提示和整圖批處理整條鏈路你已經(jīng)完整走過一遍。下一步建議把min_mask_region_area接到你的業(yè)務(wù)規(guī)則上先在自己的數(shù)據(jù)上統(tǒng)計(jì)stability_score分布再定屬于你自己的過濾閾值——比直接沿用 0.88 更靠譜?!久赓M(fèi)下載鏈接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/segment-anything創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考