Sam Hq Vit Large
SAM-HQ是Segment Anything Model(SAM)的增強版本,能夠從點或框等輸入提示生成更高質量的對象掩碼。
下載量 60
發布時間 : 5/5/2025
模型概述
SAM-HQ通過引入高質量輸出令牌和全局-局部特徵融合組件,顯著提升了分割掩碼的質量,特別適用於複雜邊界和細微結構對象的分割。
模型特點
高質量輸出令牌
引入可學習的HQ輸出令牌,專門用於預測高質量掩碼,顯著提升分割精度。
全局-局部特徵融合
結合早期和最終的ViT特徵,融合高級語義上下文和低級邊界信息,改善掩碼細節。
高效訓練
僅需8個GPU上4小時訓練,相比原版SAM增加不到0.5%的參數。
零樣本泛化
保留SAM原有的零樣本泛化能力,同時在10個數據集上表現更優。
模型能力
高質量圖像分割
基於提示的掩碼生成
自動掩碼生成
複雜邊界處理
細微結構識別
使用案例
圖像編輯
精確對象分割
用於圖像編輯軟件中精確分離對象
生成比原版SAM更精細的掩碼邊界
自動化標註
數據標註輔助
自動生成訓練數據的分割標註
減少人工標註工作量,提高標註質量
🚀 高質量分割一切模型(SAM - HQ)
SAM - HQ 是分割一切模型(SAM)的增強版本,它能根據點或框等輸入提示生成更高質量的對象掩碼。在處理複雜結構的對象時,SAM - HQ 顯著提升了掩碼質量,同時保留了 SAM 原有的可提示設計、效率和零樣本泛化能力。
🚀 快速開始
環境準備
確保你已經安裝了所需的庫,如 transformers
、Pillow
、requests
、matplotlib
、torch
等。可以使用以下命令安裝:
pip install transformers pillow requests matplotlib torch
運行示例
下面是一個簡單的示例,展示瞭如何使用 SAM - HQ 進行掩碼生成:
from PIL import Image
import requests
from transformers import SamHQModel, SamHQProcessor
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-large")
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-large")
img_url = "https://raw.githubusercontent.com/SysCV/sam-hq/refs/heads/main/demo/input_imgs/example1.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
input_boxes = [[[306, 132, 925, 893]]] # Bounding box for the image
inputs = processor(raw_image, input_boxes=input_boxes, return_tensors="pt").to("cuda")
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu())
scores = outputs.iou_scores
✨ 主要特性
- 高質量輸出:能夠生成高質量的分割掩碼,即使對於具有複雜邊界和細結構的對象,原 SAM 模型往往難以處理,而 SAM - HQ 表現出色。
- 創新架構:在原 SAM 架構基礎上進行了兩項關鍵創新,即高質量輸出令牌和全局 - 局部特徵融合,同時保留了 SAM 的預訓練權重。
- 高效訓練:在 8 個 GPU 上僅需 4 小時的訓練時間,與原 SAM 模型相比,引入的額外參數不到 0.5%。
- 零樣本泛化:保持了 SAM 原有的可提示設計、效率和零樣本泛化能力。
📚 詳細文檔
模型細節
SAM - HQ 在保留 SAM 預訓練權重的基礎上,對原 SAM 架構進行了兩項關鍵創新:
- 高質量輸出令牌:一個可學習的令牌被注入到 SAM 的掩碼解碼器中,負責預測高質量的掩碼。與 SAM 原有的輸出令牌不同,這個令牌及其相關的 MLP 層經過專門訓練,以生成高度準確的分割掩碼。
- 全局 - 局部特徵融合:SAM - HQ 不是僅在掩碼解碼器特徵上應用高質量輸出令牌,而是首先將這些特徵與早期和最終的 ViT 特徵進行融合,以改善掩碼細節。這結合了高級語義上下文和低級邊界信息,實現更準確的分割。
SAM - HQ 在一個精心策劃的 44K 細粒度掩碼數據集(HQSeg - 44K)上進行訓練,該數據集來自多個來源,具有極其準確的註釋。
評估結果
該模型在 10 個不同的分割數據集上進行了評估,涵蓋了不同的下游任務,其中 8 個數據集採用零樣本遷移協議進行評估。結果表明,SAM - HQ 能夠生成比原 SAM 模型顯著更好的掩碼,同時保持其零樣本泛化能力。
解決的問題
SAM - HQ 解決了原 SAM 模型的兩個關鍵問題:
- 粗糙的掩碼邊界,常常忽略薄對象結構。
- 在具有挑戰性的情況下,預測錯誤、掩碼破碎或存在較大誤差。
這些改進使得 SAM - HQ 對於需要高精度圖像掩碼的應用特別有價值,如自動註釋和圖像/視頻編輯任務。
💻 使用示例
基礎用法
提示掩碼生成
from PIL import Image
import requests
from transformers import SamHQModel, SamHQProcessor
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-large")
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-large")
img_url = "https://raw.githubusercontent.com/SysCV/sam-hq/refs/heads/main/demo/input_imgs/example1.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
input_boxes = [[[306, 132, 925, 893]]] # Bounding box for the image
inputs = processor(raw_image, input_boxes=input_boxes, return_tensors="pt").to("cuda")
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu())
scores = outputs.iou_scores
自動掩碼生成
from transformers import pipeline
generator = pipeline("mask-generation", model="syscv-community/sam-hq-vit-large", device=0, points_per_batch=256)
image_url = "https://raw.githubusercontent.com/SysCV/sam-hq/refs/heads/main/demo/input_imgs/example1.png"
outputs = generator(image_url, points_per_batch=256)
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def show_mask(mask, ax, random_color=False):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
h, w = mask.shape[-2:]
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_image)
plt.imshow(np.array(raw_image))
ax = plt.gca()
for mask in outputs["masks"]:
show_mask(mask, ax=ax, random_color=True)
plt.axis("off")
plt.show()
高級用法
完整示例及可視化
import numpy as np
import matplotlib.pyplot as plt
def show_mask(mask, ax, random_color=False):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30/255, 144/255, 255/255, 0.6])
h, w = mask.shape[-2:]
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
ax.imshow(mask_image)
def show_box(box, ax):
x0, y0 = box[0], box[1]
w, h = box[2] - box[0], box[3] - box[1]
ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0,0,0,0), lw=2))
def show_boxes_on_image(raw_image, boxes):
plt.figure(figsize=(10,10))
plt.imshow(raw_image)
for box in boxes:
show_box(box, plt.gca())
plt.axis('on')
plt.show()
def show_points_on_image(raw_image, input_points, input_labels=None):
plt.figure(figsize=(10,10))
plt.imshow(raw_image)
input_points = np.array(input_points)
if input_labels is None:
labels = np.ones_like(input_points[:, 0])
else:
labels = np.array(input_labels)
show_points(input_points, labels, plt.gca())
plt.axis('on')
plt.show()
def show_points_and_boxes_on_image(raw_image, boxes, input_points, input_labels=None):
plt.figure(figsize=(10,10))
plt.imshow(raw_image)
input_points = np.array(input_points)
if input_labels is None:
labels = np.ones_like(input_points[:, 0])
else:
labels = np.array(input_labels)
show_points(input_points, labels, plt.gca())
for box in boxes:
show_box(box, plt.gca())
plt.axis('on')
plt.show()
def show_points_and_boxes_on_image(raw_image, boxes, input_points, input_labels=None):
plt.figure(figsize=(10,10))
plt.imshow(raw_image)
input_points = np.array(input_points)
if input_labels is None:
labels = np.ones_like(input_points[:, 0])
else:
labels = np.array(input_labels)
show_points(input_points, labels, plt.gca())
for box in boxes:
show_box(box, plt.gca())
plt.axis('on')
plt.show()
def show_points(coords, labels, ax, marker_size=375):
pos_points = coords[labels==1]
neg_points = coords[labels==0]
ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
def show_masks_on_image(raw_image, masks, scores):
if len(masks.shape) == 4:
masks = masks.squeeze()
if scores.shape[0] == 1:
scores = scores.squeeze()
nb_predictions = scores.shape[-1]
fig, axes = plt.subplots(1, nb_predictions, figsize=(15, 15))
for i, (mask, score) in enumerate(zip(masks, scores)):
mask = mask.cpu().detach()
axes[i].imshow(np.array(raw_image))
show_mask(mask, axes[i])
axes[i].title.set_text(f"Mask {i+1}, Score: {score.item():.3f}")
axes[i].axis("off")
plt.show()
def show_masks_on_single_image(raw_image, masks, scores):
if len(masks.shape) == 4:
masks = masks.squeeze()
if scores.shape[0] == 1:
scores = scores.squeeze()
# Convert image to numpy array if it's not already
image_np = np.array(raw_image)
# Create a figure
fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(image_np)
# Overlay all masks on the same image
for i, (mask, score) in enumerate(zip(masks, scores)):
mask = mask.cpu().detach().numpy() # Convert to NumPy
show_mask(mask, ax) # Assuming `show_mask` properly overlays the mask
ax.set_title(f"Overlayed Masks with Scores")
ax.axis("off")
plt.show()
import torch
from transformers import SamHQModel, SamHQProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SamHQModel.from_pretrained("syscv-community/sam-hq-vit-large").to(device)
processor = SamHQProcessor.from_pretrained("syscv-community/sam-hq-vit-large")
from PIL import Image
import requests
img_url = "https://raw.githubusercontent.com/SysCV/sam-hq/refs/heads/main/demo/input_imgs/example1.png"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")
plt.imshow(raw_image)
inputs = processor(raw_image, return_tensors="pt").to(device)
image_embeddings, intermediate_embeddings = model.get_image_embeddings(inputs["pixel_values"])
input_boxes = [[[306, 132, 925, 893]]]
show_boxes_on_image(raw_image, input_boxes[0])
inputs.pop("pixel_values", None)
inputs.update({"image_embeddings": image_embeddings})
inputs.update({"intermediate_embeddings": intermediate_embeddings})
with torch.no_grad():
outputs = model(**inputs)
masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(), inputs["original_sizes"].cpu(), inputs["reshaped_input_sizes"].cpu())
scores = outputs.iou_scores
show_masks_on_single_image(raw_image, masks[0], scores)
show_masks_on_image(raw_image, masks[0], scores)
📄 許可證
本項目採用 Apache - 2.0 許可證。
📜 引用
如果你在研究中使用了該模型,請使用以下 BibTeX 引用:
@misc{ke2023segmenthighquality,
title={Segment Anything in High Quality},
author={Lei Ke and Mingqiao Ye and Martin Danelljan and Yifan Liu and Yu-Wing Tai and Chi-Keung Tang and Fisher Yu},
year={2023},
eprint={2306.01567},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2306.01567},
}
Clipseg Rd64 Refined
Apache-2.0
CLIPSeg是一種基於文本與圖像提示的圖像分割模型,支持零樣本和單樣本圖像分割任務。
圖像分割
Transformers

C
CIDAS
10.0M
122
RMBG 1.4
其他
BRIA RMBG v1.4 是一款先進的背景移除模型,專為高效分離各類圖像的前景與背景而設計,適用於非商業用途。
圖像分割
Transformers

R
briaai
874.12k
1,771
RMBG 2.0
其他
BRIA AI開發的最新背景移除模型,能有效分離各類圖像的前景與背景,適合大規模商業內容創作場景。
圖像分割
Transformers

R
briaai
703.33k
741
Segformer B2 Clothes
MIT
基於ATR數據集微調的SegFormer模型,用於服裝和人體分割
圖像分割
Transformers

S
mattmdjaga
666.39k
410
Sam Vit Base
Apache-2.0
SAM是一個能夠通過輸入提示(如點或框)生成高質量對象掩碼的視覺模型,支持零樣本分割任務
圖像分割
Transformers 其他

S
facebook
635.09k
137
Birefnet
MIT
BiRefNet是一個用於高分辨率二分圖像分割的深度學習模型,通過雙邊參考網絡實現精確的圖像分割。
圖像分割
Transformers

B
ZhengPeng7
626.54k
365
Segformer B1 Finetuned Ade 512 512
其他
SegFormer是一種基於Transformer的語義分割模型,在ADE20K數據集上進行了微調,適用於圖像分割任務。
圖像分割
Transformers

S
nvidia
560.79k
6
Sam Vit Large
Apache-2.0
SAM是一個能夠通過輸入提示點或邊界框生成高質量物體掩膜的視覺模型,具備零樣本遷移能力。
圖像分割
Transformers 其他

S
facebook
455.43k
28
Face Parsing
基於nvidia/mit-b5微調的語義分割模型,用於面部解析任務
圖像分割
Transformers 英語

F
jonathandinu
398.59k
157
Sam Vit Huge
Apache-2.0
SAM是一個能夠根據輸入提示生成高質量對象掩碼的視覺模型,支持零樣本遷移到新任務
圖像分割
Transformers 其他

S
facebook
324.78k
163
精選推薦AI模型
Llama 3 Typhoon V1.5x 8b Instruct
專為泰語設計的80億參數指令模型,性能媲美GPT-3.5-turbo,優化了應用場景、檢索增強生成、受限生成和推理任務
大型語言模型
Transformers 支持多種語言

L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-Tiny是一個基於SODA數據集訓練的超小型對話模型,專為邊緣設備推理設計,體積僅為Cosmo-3B模型的2%左右。
對話系統
Transformers 英語

C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
基於RoBERTa架構的中文抽取式問答模型,適用於從給定文本中提取答案的任務。
問答系統 中文
R
uer
2,694
98