 實(shí)戰(zhàn)指南:在 AI-Research-SKILLs 中用點(diǎn)、框與掩碼提示實(shí)現(xiàn)零樣本圖像分割)
AI 技能人工智能大模型深度學(xué)習(xí)【免費(fèi)下載鏈接】AI-Research-SKILLsComprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full horsepower. Maintained by Orchestra Research.項(xiàng)目地址https://gitcode.com/gh_mirrors/ai/AI-Research-SKILLs點(diǎn)擊查看免費(fèi)下載本指南以 AI-Research-SKILLs 倉庫中的 Segment Anything 技能文檔SKILL.md為核心系統(tǒng)講解 Meta AI Segment Anything ModelSAM的零樣本圖像分割能力無需任務(wù)定制訓(xùn)練即可用點(diǎn)、邊界框或掩碼提示分割任意圖像中的任意物體。讀完本文你將掌握 SAM 的安裝與模型加載、SamPredictor交互式分割、SamAutomaticMaskGenerator全自動掩碼生成、ONNX 部署以及常見實(shí)戰(zhàn)工作流并能結(jié)合倉庫中的 高級用法 與 故障排查 兩篇參考文檔完成端到端落地。在 AI-Research-SKILLs 的技能體系中本技能歸屬于18-multimodal/segment-anything/目錄是 技能路由地圖 中多模態(tài)板塊的重要成員。當(dāng)自動研究編排器autoresearch在圖像理解、數(shù)據(jù)標(biāo)注、醫(yī)學(xué)影像處理等研究任務(wù)中需要分割任意物體時就會路由到本技能執(zhí)行倉庫根 README.md 也將它列為 Metas SAM for zero-shot image segmentation with points/boxes 的標(biāo)準(zhǔn)能力入口。何時使用 SAM適用場景使用 SAM 的場景需要在無需任務(wù)定制訓(xùn)練的情況下分割圖像中的任意物體構(gòu)建基于點(diǎn) / 框提示的交互式標(biāo)注工具為其他視覺模型生成訓(xùn)練數(shù)據(jù)數(shù)據(jù)飛輪需要向新的圖像域進(jìn)行零樣本遷移構(gòu)建物體檢測 / 分割流水線處理醫(yī)學(xué)、衛(wèi)星或領(lǐng)域特定圖像關(guān)鍵特性零樣本分割無需微調(diào)即可在任何圖像域上工作靈活提示支持點(diǎn)Points、邊界框Bounding Boxes或先前掩碼Previous Masks自動分割自動生成圖像中所有物體的掩碼高質(zhì)量官方在 1100 萬張圖像上使用 11 億掩碼進(jìn)行訓(xùn)練論文公開數(shù)據(jù)多種模型尺寸ViT-B最快、ViT-L、ViT-H最準(zhǔn)確ONNX 導(dǎo)出可部署到瀏覽器與邊緣設(shè)備替代方案對比考慮使用替代方案YOLO / Detectron2用于帶類別的實(shí)時物體檢測Mask2Former用于帶類別的語義 / 全景分割GroundingDINO SAM用于文本提示分割組合管線見 高級用法SAM 2用于視頻分割任務(wù)快速開始安裝SAM 官方提供 pip 安裝入口推薦安裝segment-anything主包并視需要安裝opencv-python、pycocotools、matplotlib等可選依賴# 從 GitHub 安裝 pip install githttps://github.com/facebookresearch/segment-anything.git # 可選依賴 pip install opencv-python pycocotools matplotlib # 或使用 HuggingFace transformers pip install transformers安裝完成后可執(zhí)行快速驗(yàn)證python -c from segment_anything import sam_model_registry; print(OK)下載 Checkpoint官方發(fā)布的三個模型 checkpoint 分別對應(yīng)三種主干規(guī)模體積與精度依次遞增# ViT-H最大、最準(zhǔn)確 - 2.4GB wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth # ViT-L中等 - 1.2GB wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth # ViT-B最小、最快 - 375MB wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth注意checkpoint 文件名中的_h_4b8939、_l_0b3195、_b_01ec64等后綴是官方校驗(yàn)標(biāo)識下載后建議用md5sum校驗(yàn)文件完整性如sam_vit_h_4b8939.pth的預(yù)期校驗(yàn)值為a7bf3b02f3ebf1267aba913ff637d9a2并使用與模型類型完全匹配的 checkpoint否則加載時會報unexpected key in state_dict。使用 SamPredictor 的基礎(chǔ)用法SamPredictor是官方交互式推理的核心 API。其工作流是加載模型 → 設(shè)置圖像一次性計(jì)算圖像嵌入→ 提供提示預(yù)測掩碼import numpy as np from segment_anything import sam_model_registry, SamPredictor # 加載模型 sam sam_model_registryvit_h sam.to(devicecuda) # 創(chuàng)建 predictor predictor SamPredictor(sam) # 設(shè)置圖像一次性計(jì)算嵌入 image cv2.imread(image.jpg) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image) # 用點(diǎn)提示進(jìn)行預(yù)測 input_point np.array([[500, 375]]) # (x, y) 坐標(biāo) input_label np.array([1]) # 1 前景, 0 背景 masks, scores, logits predictor.predict( point_coordsinput_point, point_labelsinput_label, multimask_outputTrue # 返回 3 個候選掩碼 ) # 選擇最佳掩碼 best_mask masks[np.argmax(scores)]predict返回三元組masks掩碼數(shù)組形狀與multimask_output相關(guān)、scores每個掩碼的預(yù)測 IoU 置信度、logits低分辨率掩碼 logits可回傳用于迭代細(xì)化。multimask_outputTrue時返回 3 個候選掩碼供選擇當(dāng)提示足夠明確如單個清晰目標(biāo)時可用False直接返回單一掩碼。HuggingFace Transformers 集成除官方實(shí)現(xiàn)外也可通過 HuggingFace 生態(tài)加載模型與處理器適合與現(xiàn)有 Transformers 管線整合import torch from PIL import Image from transformers import SamModel, SamProcessor # 加載模型與處理器 model SamModel.from_pretrained(facebook/sam-vit-huge) processor SamProcessor.from_pretrained(facebook/sam-vit-huge) model.to(cuda) # 用點(diǎn)提示處理圖像 image Image.open(image.jpg) input_points [[[450, 600]]] # 點(diǎn)需嵌套列表以包含 batch 維度 inputs processor(image, input_pointsinput_points, return_tensorspt) inputs {k: v.to(cuda) for k, v in inputs.items()} # 生成掩碼 with torch.no_grad(): outputs model(**inputs) # 后處理將掩碼恢復(fù)到原始尺寸 masks processor.image_processor.post_process_masks( outputs.pred_masks.cpu(), inputs[original_sizes].cpu(), inputs[reshaped_input_sizes].cpu() )需要注意SamProcessor返回的pred_masks是在模型輸入分辨率下的低分辨率掩碼必須通過post_process_masks結(jié)合original_sizes原始尺寸與reshaped_input_sizes重采樣尺寸恢復(fù)到原圖大小否則無法直接疊加到原圖上。核心概念模型架構(gòu)SAM 由三個可組合的模塊構(gòu)成圖像編碼器Image Encoder與提示編碼器Prompt Encoder將輸入映射為嵌入掩碼解碼器Mask Decoder基于兩者預(yù)測掩碼與 IoU 分?jǐn)?shù)SAM Architecture: ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Image Encoder │────?│ Prompt Encoder │────?│ Mask Decoder │ │ (ViT) │ │ (Points/Boxes) │ │ (Transformer) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ Image Embeddings Prompt Embeddings Masks IoU (computed once) (per prompt) predictions理解這一架構(gòu)對性能優(yōu)化至關(guān)重要圖像嵌入只計(jì)算一次可被多個提示反復(fù)復(fù)用——這正是一張圖、多個提示批量推理的高效基礎(chǔ)提示編碼與掩碼解碼相對輕量單次預(yù)測開銷遠(yuǎn)小于圖像編碼。模型變體模型Checkpoint 注冊名大小速度精度ViT-Hvit_h2.4 GB最慢最佳ViT-Lvit_l1.2 GB中等良好ViT-Bvit_b375 MB最快良好提示類型提示描述使用場景點(diǎn)前景點(diǎn)擊物體內(nèi)部單個物體選擇點(diǎn)背景點(diǎn)擊物體外部排除區(qū)域邊界框物體外接矩形較大物體先前掩碼低分辨率掩碼輸入迭代細(xì)化交互式分割點(diǎn)提示單個前景點(diǎn)即可觸發(fā)分割多個點(diǎn)含背景點(diǎn)可進(jìn)一步提高精度# 單個前景點(diǎn) input_point np.array([[500, 375]]) input_label np.array([1]) masks, scores, logits predictor.predict( point_coordsinput_point, point_labelsinput_label, multimask_outputTrue ) # 多個點(diǎn)前景 背景 input_points np.array([[500, 375], [600, 400], [450, 300]]) input_labels np.array([1, 1, 0]) # 2 個前景, 1 個背景 masks, scores, logits predictor.predict( point_coordsinput_points, point_labelsinput_labels, multimask_outputFalse # 提示清晰時返回單一掩碼 )坐標(biāo)約定點(diǎn)坐標(biāo)必須是(x, y)格式——x是列索引、y是行索引且需落在圖像邊界內(nèi)0 x w且0 y h否則會出現(xiàn)index out of bounds或掩碼位置錯誤??蛱崾具吔缈蚋袷綖閇x1, y1, x2, y2]左上 右下適合框選較大物體# 邊界框 [x1, y1, x2, y2] input_box np.array([425, 600, 700, 875]) masks, scores, logits predictor.predict( boxinput_box, multimask_outputFalse )注意x1 x2且y1 y2是合法框的前提否則會報invalid box coordinates。組合提示框與點(diǎn)可同時使用兼顧整體范圍與局部精確控制# 框 點(diǎn)實(shí)現(xiàn)精確控制 masks, scores, logits predictor.predict( point_coordsnp.array([[500, 375]]), point_labelsnp.array([1]), boxnp.array([400, 300, 700, 600]), multimask_outputFalse )迭代細(xì)化SAM 支持把上一次預(yù)測的 logits 作為mask_input回傳在交互標(biāo)注中實(shí)現(xiàn)點(diǎn)一點(diǎn)、改一處的連續(xù)細(xì)化# 初始預(yù)測 masks, scores, logits predictor.predict( point_coordsnp.array([[500, 375]]), point_labelsnp.array([1]), multimask_outputTrue ) # 用先前掩碼 額外點(diǎn)細(xì)化 masks, scores, logits predictor.predict( point_coordsnp.array([[500, 375], [550, 400]]), point_labelsnp.array([1, 0]), # 添加背景點(diǎn) mask_inputlogits[np.argmax(scores)][None, :, :], # 使用最佳掩碼 multimask_outputFalse )自動掩碼生成基礎(chǔ)自動分割SamAutomaticMaskGenerator在圖像上鋪設(shè)規(guī)則點(diǎn)網(wǎng)格自動分割出全部物體掩碼無需任何人工提示from segment_anything import SamAutomaticMaskGenerator # 創(chuàng)建生成器 mask_generator SamAutomaticMaskGenerator(sam) # 生成全部掩碼 masks mask_generator.generate(image) # 每個掩碼包含: # - segmentation: 二值掩碼 # - bbox: [x, y, w, h] # - area: 像素數(shù)量 # - predicted_iou: 質(zhì)量分?jǐn)?shù) # - stability_score: 穩(wěn)定性分?jǐn)?shù) # - point_coords: 生成點(diǎn)自定義生成參數(shù)核心可調(diào)參數(shù)包括網(wǎng)格密度points_per_side、質(zhì)量閾值pred_iou_thresh、穩(wěn)定性閾值stability_score_thresh、多尺度裁剪crop_n_layers以及最小掩碼面積min_mask_region_areamask_generator SamAutomaticMaskGenerator( modelsam, points_per_side32, # 網(wǎng)格密度越大掩碼越多 pred_iou_thresh0.88, # 質(zhì)量閾值 stability_score_thresh0.95, # 穩(wěn)定性閾值 crop_n_layers1, # 多尺度裁剪層數(shù) crop_n_points_downscale_factor2, min_mask_region_area100, # 移除過小掩碼 ) masks mask_generator.generate(image)參數(shù)調(diào)節(jié)的經(jīng)驗(yàn)方向掩碼過多時降低points_per_side、提高pred_iou_thresh/stability_score_thresh、增大min_mask_region_area并可引入box_nms_thresh做更激進(jìn)的 NMS掩碼過少或漏檢小物體時提高points_per_side、降低閾值、增加crop_n_layers多尺度裁剪詳見 故障排查。過濾掩碼生成結(jié)果可按面積、IoU 分?jǐn)?shù)與穩(wěn)定性分?jǐn)?shù)做二次篩選# 按面積排序大的在前 masks sorted(masks, keylambda x: x[area], reverseTrue) # 按預(yù)測 IoU 過濾 high_quality [m for m in masks if m[predicted_iou] 0.9] # 按穩(wěn)定性分?jǐn)?shù)過濾 stable_masks [m for m in masks if m[stability_score] 0.95]批量推理多圖像處理對多張圖像循環(huán)調(diào)用注意每張圖像需重新set_image重新計(jì)算嵌入# 高效處理多張圖像 images [cv2.imread(fimage_{i}.jpg) for i in range(10)] all_masks [] for image in images: predictor.set_image(image) masks, _, _ predictor.predict( point_coordsnp.array([[500, 375]]), point_labelsnp.array([1]), multimask_outputTrue ) all_masks.append(masks)單圖像多提示得益于嵌入只算一次的架構(gòu)同一圖像上的多個提示可以共享一次圖像編碼批量預(yù)測非常高效# 高效處理多個提示一次圖像編碼 predictor.set_image(image) # 批量點(diǎn)提示 points [ np.array([[100, 100]]), np.array([[200, 200]]), np.array([[300, 300]]) ] all_masks [] for point in points: masks, scores, _ predictor.predict( point_coordspoint, point_labelsnp.array([1]), multimask_outputTrue ) all_masks.append(masks[np.argmax(scores)])ONNX 部署導(dǎo)出模型官方提供scripts/export_onnx_model.py導(dǎo)出腳本可導(dǎo)出用于瀏覽器與邊緣設(shè)備部署的 ONNX 模型python scripts/export_onnx_model.py \ --checkpoint sam_vit_h_4b8939.pth \ --model-type vit_h \ --output sam_onnx.onnx \ --return-single-mask--return-single-mask選項(xiàng)讓解碼器只輸出單個掩碼推理更快對多候選交互場景可去掉該參數(shù)導(dǎo)出失敗時可顯式指定--opset 17并固定onnx1.14.0、onnxruntime1.15.0等版本組合詳見 故障排查。使用 ONNX 模型推理ONNX 模型僅包含提示編碼器 掩碼解碼器圖像嵌入需在 PyTorch 側(cè)預(yù)先計(jì)算后作為輸入傳入import onnxruntime # 加載 ONNX 模型 ort_session onnxruntime.InferenceSession(sam_onnx.onnx) # 運(yùn)行推理圖像嵌入需單獨(dú)計(jì)算 masks ort_session.run( None, { image_embeddings: image_embeddings, point_coords: point_coords, point_labels: point_labels, mask_input: np.zeros((1, 1, 256, 256), dtypenp.float32), has_mask_input: np.array([0], dtypenp.float32), orig_im_size: np.array([h, w], dtypenp.float32) } )若 GPU 上 ONNX Runtime 報錯可用onnxruntime.get_available_providers()查看可用 Provider并顯式指定providers[CPUExecutionProvider]回退到 CPU。常見工作流工作流 1交互式標(biāo)注工具用 OpenCV 鼠標(biāo)回調(diào)實(shí)現(xiàn)點(diǎn)擊即分割的標(biāo)注體驗(yàn)import cv2 # 加載模型 predictor SamPredictor(sam) predictor.set_image(image) def on_click(event, x, y, flags, param): if event cv2.EVENT_LBUTTONDOWN: # 前景點(diǎn) masks, scores, _ predictor.predict( point_coordsnp.array([[x, y]]), point_labelsnp.array([1]), multimask_outputTrue ) # 顯示最佳掩碼 display_mask(masks[np.argmax(scores)])工作流 2物體提取點(diǎn)擊物體內(nèi)部即可輸出帶透明背景的 RGBA 摳圖def extract_object(image, point): 提取點(diǎn)擊點(diǎn)處的物體輸出透明背景 RGBA。 predictor.set_image(image) masks, scores, _ predictor.predict( point_coordsnp.array([point]), point_labelsnp.array([1]), multimask_outputTrue ) best_mask masks[np.argmax(scores)] # 創(chuàng)建 RGBA 輸出 rgba np.zeros((image.shape[0], image.shape[1], 4), dtypenp.uint8) rgba[:, :, :3] image rgba[:, :, 3] best_mask * 255 return rgba工作流 3醫(yī)學(xué)圖像分割醫(yī)學(xué)影像通常為灰度圖需先轉(zhuǎn)成 RGB 三通道再送入模型用 ROI 框提示分割感興趣區(qū)域# 處理醫(yī)學(xué)圖像灰度轉(zhuǎn) RGB medical_image cv2.imread(scan.png, cv2.IMREAD_GRAYSCALE) rgb_image cv2.cvtColor(medical_image, cv2.COLOR_GRAY2RGB) predictor.set_image(rgb_image) # 分割感興趣區(qū)域 masks, scores, _ predictor.predict( boxnp.array([x1, y1, x2, y2]), # ROI 邊界框 multimask_outputTrue )輸出格式掩碼數(shù)據(jù)結(jié)構(gòu)SamAutomaticMaskGenerator生成的每個掩碼字典包含{ segmentation: np.ndarray, # H×W 二值掩碼 bbox: [x, y, w, h], # 邊界框 area: int, # 像素數(shù)量 predicted_iou: float, # 0-1 質(zhì)量分?jǐn)?shù) stability_score: float, # 0-1 穩(wěn)定性分?jǐn)?shù) crop_box: [x, y, w, h], # 生成裁剪區(qū)域 point_coords: [[x, y]], # 輸入點(diǎn) }其中predicted_iou是模型對自身掩碼質(zhì)量的估計(jì)stability_score衡量掩碼對點(diǎn)擾動的魯棒性兩者是自動化數(shù)據(jù)標(biāo)注中的關(guān)鍵篩選依據(jù)。COCO RLE 格式與 COCO 數(shù)據(jù)集生態(tài)互通時可將掩碼編碼為 RLE 格式存儲from pycocotools import mask as mask_utils # 掩碼編碼為 RLE rle mask_utils.encode(np.asfortranarray(mask.astype(np.uint8))) rle[counts] rle[counts].decode(utf-8) # RLE 解碼為掩碼 decoded_mask mask_utils.decode(rle)性能優(yōu)化GPU 內(nèi)存顯存受限時改用 ViT-B 小模型大批量處理之間調(diào)用torch.cuda.empty_cache()清理緩存超大圖像先等比縮放到最長邊 1024 以內(nèi)再送入模型# 顯存有限時使用小模型 sam sam_model_registryvit_b # 分批量處理圖像清理 CUDA 緩存 torch.cuda.empty_cache()速度優(yōu)化# 使用半精度 sam sam.half() # 減少自動生成的網(wǎng)格點(diǎn)數(shù) mask_generator SamAutomaticMaskGenerator( modelsam, points_per_side16, # 默認(rèn)是 32 ) # 部署用 ONNX # 導(dǎo)出時加 --return-single-mask 加快推理常見問題速查問題解決方案內(nèi)存不足使用 ViT-B 模型縮小圖像尺寸推理緩慢使用 ViT-B減少 points_per_side掩碼質(zhì)量差嘗試不同提示使用框 點(diǎn)組合邊緣偽影使用 stability_score 過濾小物體漏檢增大 points_per_side進(jìn)階主題生產(chǎn)級集成與微調(diào)以下內(nèi)容來自 高級用法指南適合把 SAM 接入真實(shí)系統(tǒng)。SAM 2 視頻分割SAM 2 通過流式記憶streaming memory架構(gòu)把 SAM 擴(kuò)展到視頻域使用sam2包提供視頻預(yù)測器from sam2.build_sam import build_sam2_video_predictor predictor build_sam2_video_predictor(sam2_hiera_l.yaml, sam2_hiera_large.pt) # 用視頻初始化 predictor.init_state(video_pathvideo.mp4) # 在首幀添加提示 predictor.add_new_points( frame_idx0, obj_id1, points[[100, 200]], labels[1] ) # 在視頻中傳播 for frame_idx, masks in predictor.propagate_in_video(): # masks 包含所有跟蹤物體的分割 process_frame(frame_idx, masks)SAM 與 SAM 2 的關(guān)鍵差異SAM 僅支持圖像輸入ViT Decoder無跨幀記憶與跟蹤能力SAM 2 支持圖像 視頻Hiera Memory 架構(gòu)通過流式記憶庫實(shí)現(xiàn)跨幀物體跟蹤模型系列為 Hiera-T/S/B/L。Grounded SAM文本提示分割組合 GroundingDINO文本 → 框與 SAM框 → 掩碼即可實(shí)現(xiàn)輸入一句文本、輸出對應(yīng)掩碼from groundingdino.util.inference import load_model, predict from segment_anything import sam_model_registry, SamPredictor import cv2 # 加載 Grounding DINO grounding_model load_model(groundingdino_swint_ogc.pth, GroundingDINO_SwinT_OGC.py) # 加載 SAM sam sam_model_registryvit_h predictor SamPredictor(sam) def text_to_mask(image, text_prompt, box_threshold0.3, text_threshold0.25): 從文本描述生成掩碼。 # 從文本獲取邊界框 boxes, logits, phrases predict( modelgrounding_model, imageimage, captiontext_prompt, box_thresholdbox_threshold, text_thresholdtext_threshold ) # 用 SAM 生成掩碼 predictor.set_image(image) masks [] for box in boxes: # 歸一化框轉(zhuǎn)像素坐標(biāo) h, w image.shape[:2] box_pixels box * np.array([w, h, w, h]) mask, score, _ predictor.predict( boxbox_pixels, multimask_outputFalse ) masks.append(mask[0]) return masks, boxes, phrases # 使用示例 image cv2.imread(image.jpg) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) masks, boxes, phrases text_to_mask(image, person . dog . car)批量處理封裝可將預(yù)測器封裝為批處理類統(tǒng)一處理多圖像 多提示的常見任務(wù)class BatchedSAM: def __init__(self, checkpoint, model_typevit_h, devicecuda): self.sam sam_model_registrymodel_type self.sam.to(device) self.predictor SamPredictor(self.sam) self.device device def process_batch(self, images, prompts): 用對應(yīng)提示處理多張圖像。 results [] for image, prompt in zip(images, prompts): self.predictor.set_image(image) if point in prompt: masks, scores, _ self.predictor.predict( point_coordsprompt[point], point_labelsprompt[label], multimask_outputTrue ) elif box in prompt: masks, scores, _ self.predictor.predict( boxprompt[box], multimask_outputFalse ) results.append({ masks: masks, scores: scores, best_mask: masks[np.argmax(scores)] }) return results并行處理多張圖像時每個線程需持有獨(dú)立的模型實(shí)例SAM 模型非線程安全共享可用ThreadPoolExecutor配合多實(shí)例實(shí)現(xiàn)from concurrent.futures import ThreadPoolExecutor from segment_anything import SamAutomaticMaskGenerator def generate_masks_parallel(images, num_workers4): 并行為多張圖像生成掩碼。 # 注意每個 worker 需要自己的模型實(shí)例 def worker_init(): sam sam_model_registryvit_b return SamAutomaticMaskGenerator(sam) generators [worker_init() for _ in range(num_workers)] def process_image(args): idx, image args generator generators[idx % num_workers] return generator.generate(image) with ThreadPoolExecutor(max_workersnum_workers) as executor: results list(executor.map(process_image, enumerate(images))) return results服務(wù)化部署FastAPI 與 Gradio模型常駐內(nèi)存僅加載一次通過 FastAPI 暴露點(diǎn)提示 / 自動分割接口即可構(gòu)建圖像分割微服務(wù)from fastapi import FastAPI, File, UploadFile from pydantic import BaseModel import numpy as np import cv2 import io app FastAPI() # 模型只加載一次 sam sam_model_registryvit_h sam.to(cuda) predictor SamPredictor(sam) class PointPrompt(BaseModel): x: int y: int label: int 1 app.post(/segment/point) async def segment_with_point( file: UploadFile File(...), points: list[PointPrompt] [] ): # 讀取圖像 contents await file.read() nparr np.frombuffer(contents, np.uint8) image cv2.imdecode(nparr, cv2.IMREAD_COLOR) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 設(shè)置圖像 predictor.set_image(image) # 準(zhǔn)備提示 point_coords np.array([[p.x, p.y] for p in points]) point_labels np.array([p.label for p in points]) # 生成掩碼 masks, scores, _ predictor.predict( point_coordspoint_coords, point_labelspoint_labels, multimask_outputTrue ) best_idx np.argmax(scores) return { mask: masks[best_idx].tolist(), score: float(scores[best_idx]), all_scores: scores.tolist() }交互式標(biāo)注界面的輕量方案是 Gradio通過gr.SelectData捕獲點(diǎn)擊坐標(biāo)返回疊加了掩碼的預(yù)覽圖import gradio as gr def segment_image(image, evt: gr.SelectData): 分割點(diǎn)擊處的物體。 predictor.set_image(image) point np.array([[evt.index[0], evt.index[1]]]) label np.array([1]) masks, scores, _ predictor.predict( point_coordspoint, point_labelslabel, multimask_outputTrue ) best_mask masks[np.argmax(scores)] # 在圖像上疊加掩碼 overlay image.copy() overlay[best_mask] overlay[best_mask] * 0.5 np.array([255, 0, 0]) * 0.5 return overlay with gr.Blocks() as demo: gr.Markdown(# SAM Interactive Segmentation) gr.Markdown(Click on an object to segment it) with gr.Row(): input_image gr.Image(labelInput Image, interactiveTrue) output_image gr.Image(labelSegmented Image) input_image.select(segment_image, inputs[input_image], outputs[output_image]) demo.launch()微調(diào) SAM借助peft庫可對 SAM 做參數(shù)高效的 LoRA 微調(diào)實(shí)驗(yàn)性方案把注意力層的qkv作為目標(biāo)模塊from peft import LoraConfig, get_peft_model from transformers import SamModel # 加載模型 model SamModel.from_pretrained(facebook/sam-vit-base) # 配置 LoRA lora_config LoraConfig( r16, lora_alpha32, target_modules[qkv], # 注意力層 lora_dropout0.1, biasnone, ) # 應(yīng)用 LoRA model get_peft_model(model, lora_config) # 簡化訓(xùn)練循環(huán) optimizer torch.optim.AdamW(model.parameters(), lr1e-4) for batch in dataloader: outputs model( pixel_valuesbatch[pixel_values], input_pointsbatch[input_points], input_labelsbatch[input_labels] ) # 自定義損失例如與真值掩碼的 IoU 損失 loss compute_loss(outputs.pred_masks, batch[gt_masks]) loss.backward() optimizer.step() optimizer.zero_grad()領(lǐng)域化微調(diào)的典型代表是 MedSAM醫(yī)學(xué)影像微調(diào)版將通用 checkpoint 替換為醫(yī)學(xué)專用權(quán)重后同樣通過sam_model_registry加載配合框提示完成 CT / 超聲等影像的 ROI 分割。掩碼后處理對模型輸出可做形態(tài)學(xué)后處理如閉運(yùn)算填補(bǔ)孔洞、開運(yùn)算去除噪點(diǎn)、填充內(nèi)部空洞、移除過小連通域import cv2 from scipy import ndimage def refine_mask(mask, kernel_size5, iterations2): 用形態(tài)學(xué)運(yùn)算細(xì)化掩碼。 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size)) # 閉運(yùn)算填補(bǔ)小孔 closed cv2.morphologyEx(mask.astype(np.uint8), cv2.MORPH_CLOSE, kernel, iterationsiterations) # 開運(yùn)算去除小噪點(diǎn) opened cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel, iterationsiterations) return opened.astype(bool) def fill_holes(mask): 填充掩碼孔洞。 filled ndimage.binary_fill_holes(mask) return filled def remove_small_regions(mask, min_area100): 移除過小的不連通區(qū)域。 labeled, num_features ndimage.label(mask) sizes ndimage.sum(mask, labeled, range(1, num_features 1)) mask_clean np.zeros_like(mask) for i, size in enumerate(sizes, 1): if size min_area: mask_clean[labeled i] True return mask_cleanTensorRT 加速對 ONNX 模型可進(jìn)一步轉(zhuǎn)換為 TensorRT engine支持 FP16以獲得 GPU 端極致推理性能import tensorrt as trt def export_to_tensorrt(onnx_path, engine_path, fp16True): 將 ONNX 模型轉(zhuǎn)換為 TensorRT engine。 logger trt.Logger(trt.Logger.WARNING) builder trt.Builder(logger) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) with open(onnx_path, rb) as f: if not parser.parse(f.read()): for error in range(parser.num_errors): print(parser.get_error(error)) return None config builder.create_builder_config() config.max_workspace_size 1 30 # 1GB if fp16: config.set_flag(trt.BuilderFlag.FP16) engine builder.build_engine(network, config) with open(engine_path, wb) as f: f.write(engine.serialize()) return engine故障排查要點(diǎn)完整排障手冊見 故障排查指南這里提煉最常遇到的幾類問題。環(huán)境與安裝RuntimeError: CUDA not available先print(torch.cuda.is_available())與print(torch.version.cuda)檢查 CUDA按需用pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121安裝帶 CUDA 的 PyTorch模型需顯式sam.to(cuda)。ModuleNotFoundError: No module named segment_anything從 GitHub 安裝或git clone后pip install -e .。缺少cv2/pycocotools等依賴pip install opencv-python pycocotools matplotlib onnxruntime onnxWindows 上pycocotools可換pycocotools-windows。模型加載checkpoint 找不到使用絕對路徑并用md5sum校驗(yàn)文件完整性。KeyError: unexpected key in state_dict模型類型與 checkpoint 必須一一對應(yīng)vit_h?sam_vit_h_4b8939.pthvit_l?sam_vit_l_0b3195.pthvit_b?sam_vit_b_01ec64.pth。加載時 CUDA 內(nèi)存溢出改用 ViT-B先sam.to(cpu)再torch.cuda.empty_cache()后轉(zhuǎn) GPU或sam.half()半精度。推理expected input to have 3 channels統(tǒng)一轉(zhuǎn) RGBcv2.COLOR_BGR2RGB灰度圖用COLOR_GRAY2RGBRGBA 丟棄 alpha 通道image[:, :, :3]。坐標(biāo)越界 / 掩碼位置錯誤確認(rèn)點(diǎn)是(x, y)而非(row, col)并斷言0 x w and 0 y h框需滿足x1 x2 and y1 y2。掩碼不匹配目標(biāo)加多前景點(diǎn)、加背景點(diǎn)、換框提示、框 點(diǎn)組合并打印scores取np.argmax。推理慢用 ViT-B、復(fù)用圖像嵌入set_image一次多次predict、降低points_per_side、ONNX 部署。自動掩碼生成掩碼過多points_per_side16、pred_iou_thresh0.92、stability_score_thresh0.98、box_nms_thresh0.5、min_mask_region_area500。掩碼過少 / 漏檢小物體points_per_side64、降低閾值、crop_n_layers2多尺度、min_mask_region_area0或?qū)⒋髨D切塊處理patch_size512, overlap64并偏移回原坐標(biāo)。內(nèi)存CUDA 內(nèi)存不足小模型、逐圖torch.cuda.empty_cache()、順序處理、圖像等比縮放到最長邊 1024 以內(nèi)。RAM 內(nèi)存不足逐圖處理并delgc.collect()或改用生成器惰性產(chǎn)出結(jié)果。常見錯誤速查錯誤原因解決方案CUDA out of memoryGPU 內(nèi)存占滿使用小模型、清理緩存expected 3 channels圖像格式錯誤轉(zhuǎn)換為 RGBindex out of bounds坐標(biāo)非法檢查點(diǎn) / 框邊界checkpoint not found路徑錯誤使用絕對路徑unexpected key模型與 checkpoint 不匹配匹配模型類型invalid box coordinatesx1 x2 或 y1 y2修正框格式在 AI-Research-SKILLs 中的定位本技能是倉庫多模態(tài)技能族18-multimodal/的組成部分。根據(jù) 技能路由文檔 的路由原則當(dāng)你遇到領(lǐng)域特定任務(wù)時在技能庫中搜索合適的工具并在開始前閱讀對應(yīng) SKILL.md——它包含工作流、常見問題與生產(chǎn)級代碼示例。在實(shí)際研究流程中autoresearch 編排器會在以下典型環(huán)節(jié)路由到本技能需要為下游檢測 / 分割模型構(gòu)建訓(xùn)練數(shù)據(jù)時用SamAutomaticMaskGenerator自動生成標(biāo)注可結(jié)合 數(shù)據(jù)標(biāo)注生成示例 中的數(shù)據(jù)集生成代碼處理醫(yī)學(xué)、衛(wèi)星等特定域圖像需要零樣本分割時構(gòu)建交互式標(biāo)注或物體提取工具時。配合倉庫內(nèi)其他技能可形成完整流水線用 CLIP 做圖文檢索、用本技能做像素級分割、用 學(xué)術(shù)繪圖 將掩碼結(jié)果可視化到論文圖表中。參考資源本技能主文檔SKILL.md進(jìn)階用法視頻分割、Grounded SAM、服務(wù)化、微調(diào)、掩碼后處理、TensorRTadvanced-usage.md故障排查手冊安裝、加載、推理、內(nèi)存、ONNX、質(zhì)量優(yōu)化troubleshooting.md技能路由地圖多模態(tài)板塊skill-routing.md官方公開資料供自行檢索SAM 論文arXiv 2304.02643、Segment Anything 官方演示站、SAM 2 視頻分割倉庫、HuggingFace 上的facebook/sam-vit-huge模型卡贊分享AI 技能人工智能大模型深度學(xué)習(xí)【免費(fèi)下載鏈接】AI-Research-SKILLsComprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full horsepower. Maintained by Orchestra Research.項(xiàng)目地址https://gitcode.com/gh_mirrors/ai/AI-Research-SKILLs點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Kornia 中的 Segment AnythingSAM實(shí)戰(zhàn)VisualPrompter 點(diǎn)/框提示分割全指南Kornia 中的 Segment AnythingSAM實(shí)戰(zhàn)VisualPrompter 點(diǎn)/框提示分割全指南 導(dǎo)讀 本文基于 Segment Any計(jì)算機(jī)視覺人工智能深度學(xué)習(xí)圖像處理Kornia 中 Segment Anything (SAM) 的提示式分割VisualPrompter 與 Sam 模型實(shí)戰(zhàn)指南Kornia 中 Segment Anything SAM 的提示式分割VisualPrompter 與 Sam 模型實(shí)戰(zhàn)指南 Segment Anythin計(jì)算機(jī)視覺深度學(xué)習(xí)人工智能圖像處理ComfyUI Segment Anything 終極指南用文本提示實(shí)現(xiàn)智能圖像分割ComfyUI Segment Anything 終極指南用文本提示實(shí)現(xiàn)智能圖像分割 想要通過簡單的文本描述就能精確分割圖像中的任何元素嗎 ComfyU人工智能計(jì)算機(jī)視覺AI 應(yīng)用創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考