Segment Anything Model (SAM)
Chào mừng bạn đến với lĩnh vực tiên phong về phân đoạn ảnh với Segment Anything Model, hay SAM. Mô hình mang tính cách mạng này đã thay đổi cuộc chơi bằng cách giới thiệu phân đoạn ảnh có thể điều khiển được với hiệu suất thời gian thực, thiết lập các tiêu chuẩn mới trong lĩnh vực này.
Giới thiệu về SAM: Segment Anything Model
Segment Anything Model, hay SAM, là một mô hình phân đoạn ảnh tiên tiến cho phép phân đoạn có thể điều khiển được, mang lại tính linh hoạt vô song trong các tác vụ phân tích ảnh. SAM tạo thành cốt lõi của sáng kiến Segment Anything, một dự án đột phá giới thiệu một mô hình, nhiệm vụ và bộ dữ liệu mới cho phân đoạn ảnh.
Thiết kế tiên tiến của SAM cho phép nó thích ứng với các phân phối và tác vụ hình ảnh mới mà không cần kiến thức trước, một tính năng được gọi là chuyển giao zero-shot. Được đào tạo trên bộ dữ liệu SA-1B mở rộng, chứa hơn 1 tỷ mặt nạ trải rộng trên 11 triệu hình ảnh được tuyển chọn cẩn thận, SAM đã thể hiện hiệu suất zero-shot ấn tượng, vượt qua các kết quả được giám sát đầy đủ trước đó trong nhiều trường hợp.
Hình ảnh ví dụ SA-1B. Hình ảnh bộ dữ liệu được phủ các mặt nạ từ bộ dữ liệu SA-1B mới được giới thiệu. SA-1B chứa 11 triệu hình ảnh đa dạng, độ phân giải cao, được cấp phép và bảo vệ quyền riêng tư và 1,1 tỷ mặt nạ phân đoạn chất lượng cao. Các mặt nạ này được SAM chú thích hoàn toàn tự động và được xác minh bằng xếp hạng của con người và nhiều thử nghiệm, có chất lượng và tính đa dạng cao. Hình ảnh được nhóm theo số lượng mặt nạ trên mỗi hình ảnh để trực quan hóa (trung bình có ∼100 mặt nạ trên mỗi hình ảnh).
Các tính năng chính của Segment Anything Model (SAM)
- Tác vụ phân đoạn có thể điều khiển: SAM được thiết kế với mục tiêu là tác vụ phân đoạn có thể điều khiển, cho phép nó tạo ra các mặt nạ phân đoạn hợp lệ từ bất kỳ dấu hiệu nào, chẳng hạn như các manh mối không gian hoặc văn bản xác định một đối tượng.
- Kiến trúc nâng cao: Segment Anything Model sử dụng bộ mã hóa hình ảnh mạnh mẽ, bộ mã hóa dấu hiệu và bộ giải mã mặt nạ nhẹ. Kiến trúc độc đáo này cho phép điều khiển linh hoạt, tính toán mặt nạ theo thời gian thực và nhận biết sự mơ hồ trong các tác vụ phân đoạn.
- Bộ dữ liệu SA-1B: Được giới thiệu bởi dự án Segment Anything, bộ dữ liệu SA-1B có hơn 1 tỷ mặt nạ trên 11 triệu hình ảnh. Là bộ dữ liệu phân đoạn lớn nhất cho đến nay, nó cung cấp cho SAM một nguồn dữ liệu huấn luyện đa dạng và quy mô lớn.
- Hiệu suất Zero-Shot: SAM hiển thị hiệu suất zero-shot vượt trội trên nhiều tác vụ phân đoạn khác nhau, khiến nó trở thành một công cụ sẵn sàng sử dụng cho các ứng dụng đa dạng với nhu cầu tối thiểu về kỹ thuật dấu hiệu.
Để có cái nhìn sâu sắc về Segment Anything Model và bộ dữ liệu SA-1B, vui lòng truy cập trang web Segment Anything và xem bài nghiên cứu Segment Anything.
Các mô hình hiện có, tác vụ được hỗ trợ và chế độ hoạt động
Bảng này trình bày các mô hình có sẵn với trọng số được huấn luyện trước cụ thể của chúng, các tác vụ chúng hỗ trợ và khả năng tương thích của chúng với các chế độ hoạt động khác nhau như Suy luận, Xác thực, Huấn luyện và Xuất, được biểu thị bằng biểu tượng cảm xúc ✅ cho các chế độ được hỗ trợ và biểu tượng cảm xúc ❌ cho các chế độ không được hỗ trợ.
Loại mô hình | Trọng số được huấn luyện trước | Các tác vụ được hỗ trợ | Suy luận | Xác thực | Huấn luyện | Xuất |
---|---|---|---|---|---|---|
SAM base | sam_b.pt | Phân đoạn thực thể | ✅ | ❌ | ❌ | ❌ |
SAM large | sam_l.pt | Phân đoạn thực thể | ✅ | ❌ | ❌ | ❌ |
Cách sử dụng SAM: Tính linh hoạt và sức mạnh trong phân đoạn ảnh
Segment Anything Model có thể được sử dụng cho vô số các tác vụ hạ nguồn vượt ra ngoài dữ liệu huấn luyện của nó. Điều này bao gồm phát hiện cạnh, tạo đề xuất đối tượng, phân đoạn thực thể và dự đoán mặt nạ từ văn bản sơ bộ. Với kỹ thuật prompt, SAM có thể nhanh chóng thích ứng với các tác vụ và phân phối dữ liệu mới theo cách zero-shot, khẳng định nó như một công cụ linh hoạt và mạnh mẽ cho tất cả các nhu cầu phân đoạn hình ảnh của bạn.
Ví dụ dự đoán SAM
Phân đoạn bằng prompts
Phân đoạn hình ảnh với các prompts đã cho.
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Run inference with single point
results = model(points=[900, 370], labels=[1])
# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
Phân đoạn mọi thứ
Phân đoạn toàn bộ hình ảnh.
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference
model("path/to/image.jpg")
# Run inference with a SAM model
yolo predict model=sam_b.pt source=path/to/image.jpg
- Logic ở đây là phân đoạn toàn bộ hình ảnh nếu bạn không chuyển bất kỳ prompts nào (bboxes/points/masks).
Ví dụ về SAMPredictor
Bằng cách này, bạn có thể thiết lập hình ảnh một lần và chạy suy luận prompts nhiều lần mà không cần chạy bộ mã hóa hình ảnh nhiều lần.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Set image
predictor.set_image("ultralytics/assets/zidane.jpg") # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])
# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Reset image
predictor.reset_image()
Phân đoạn mọi thứ với các args bổ sung.
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)
Lưu ý
Tất cả các đối tượng được trả về results
trong các ví dụ trên là Results cho phép truy cập mặt nạ đã dự đoán và hình ảnh nguồn một cách dễ dàng.
- Các args bổ sung khác cho
Segment everything
xemPredictor/generate
Tham khảo.
So sánh SAM với YOLO
Ở đây, chúng ta so sánh mô hình SAM-b của Meta với mô hình phân đoạn nhỏ nhất của Ultralytics, YOLO11n-seg:
Mô hình | Kích thước (MB) |
Tham số (M) |
Tốc độ (CPU) (ms/ảnh) |
---|---|---|---|
Meta SAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
FastSAM-s với backbone YOLOv8 | 23.7 | 11.8 | 55.9 |
Ultralytics YOLOv8n-seg | 6.7 (nhỏ hơn 11.7 lần) | 3.4 (ít hơn 11.4 lần) | 24.5 (nhanh hơn 1061 lần) |
Ultralytics YOLO11n-seg | 5.9 (nhỏ hơn 13.2 lần) | 2.9 (ít hơn 13.4 lần) | 30.1 (nhanh hơn 864 lần) |
So sánh này cho thấy sự khác biệt đáng kể về kích thước và tốc độ mô hình giữa các biến thể SAM và các mô hình phân đoạn YOLO. Mặc dù SAM cung cấp các khả năng phân đoạn tự động độc đáo, nhưng các mô hình YOLO, đặc biệt là YOLOv8n-seg và YOLO11n-seg, nhỏ hơn, nhanh hơn và hiệu quả về mặt tính toán hơn đáng kể.
Các thử nghiệm được chạy trên Apple M4 Pro 2025 với RAM 24GB sử dụng torch==2.6.0
và ultralytics==8.3.90
. Để tái tạo thử nghiệm này:
Ví dụ
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Profile YOLO models
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
model = YOLO(file_name)
model.info()
model(ASSETS)
Tự động chú thích: Một con đường nhanh chóng đến bộ dữ liệu phân đoạn
Tự động chú thích là một tính năng quan trọng của SAM, cho phép người dùng tạo bộ dữ liệu phân đoạn bằng mô hình phát hiện được huấn luyện trước. Tính năng này cho phép chú thích nhanh chóng và chính xác một lượng lớn hình ảnh, bỏ qua nhu cầu dán nhãn thủ công tốn thời gian.
Tạo bộ dữ liệu phân đoạn của bạn bằng mô hình phát hiện
Để tự động chú thích bộ dữ liệu của bạn bằng framework Ultralytics, hãy sử dụng auto_annotate
hàm như được hiển thị bên dưới:
Ví dụ
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
Đối số | Loại | Mặc định | Mô tả |
---|---|---|---|
data |
str |
bắt buộc | Đường dẫn đến thư mục chứa hình ảnh mục tiêu để chú thích hoặc phân đoạn. |
det_model |
str |
'yolo11x.pt' |
Đường dẫn mô hình phát hiện YOLO để phát hiện đối tượng ban đầu. |
sam_model |
str |
'sam_b.pt' |
Đường dẫn mô hình SAM để phân đoạn (hỗ trợ các biến thể SAM, SAM2 và mô hình mobile_sam). |
device |
str |
'' |
Thiết bị tính toán (ví dụ: 'cuda:0', 'cpu' hoặc '' để tự động phát hiện thiết bị). |
conf |
float |
0.25 |
Ngưỡng độ tin cậy phát hiện YOLO để lọc các phát hiện yếu. |
iou |
float |
0.45 |
Ngưỡng IoU cho Non-Maximum Suppression để lọc các hộp chồng chéo. |
imgsz |
int |
640 |
Kích thước đầu vào để thay đổi kích thước hình ảnh (phải là bội số của 32). |
max_det |
int |
300 |
Số lượng phát hiện tối đa trên mỗi ảnh để tiết kiệm bộ nhớ. |
classes |
list[int] |
None |
Danh sách các chỉ số lớp để phát hiện (ví dụ: [0, 1] cho người và xe đạp). |
output_dir |
str |
None |
Thư mục lưu trữ cho các chú thích (mặc định là '.\/labels' tương ứng với đường dẫn dữ liệu). |
Hàm auto_annotate
nhận đường dẫn đến hình ảnh của bạn, với các đối số tùy chọn để chỉ định mô hình phát hiện được huấn luyện trước và mô hình phân đoạn SAM, thiết bị để chạy các mô hình và thư mục đầu ra để lưu kết quả được chú thích.
Tự động chú thích bằng các mô hình được huấn luyện trước có thể giảm đáng kể thời gian và công sức cần thiết để tạo bộ dữ liệu phân đoạn chất lượng cao. Tính năng này đặc biệt có lợi cho các nhà nghiên cứu và nhà phát triển làm việc với bộ sưu tập hình ảnh lớn, vì nó cho phép họ tập trung vào phát triển và đánh giá mô hình thay vì chú thích thủ công.
Trích dẫn và ghi nhận
Nếu bạn thấy SAM hữu ích trong công việc nghiên cứu hoặc phát triển của mình, vui lòng xem xét trích dẫn bài báo của chúng tôi:
@misc{kirillov2023segment,
title={Segment Anything},
author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
year={2023},
eprint={2304.02643},
archivePrefix={arXiv},
primaryClass={cs.CV}
}
Chúng tôi xin bày tỏ lòng biết ơn đến Meta AI vì đã tạo và duy trì tài nguyên có giá trị này cho cộng đồng thị giác máy tính.
Câu hỏi thường gặp
Segment Anything Model (SAM) của Ultralytics là gì?
Segment Anything Model (SAM) của Ultralytics là một mô hình phân đoạn hình ảnh mang tính cách mạng được thiết kế cho các tác vụ phân đoạn có thể điều khiển được. Nó tận dụng kiến trúc tiên tiến, bao gồm bộ mã hóa hình ảnh và lời nhắc kết hợp với bộ giải mã mặt nạ nhẹ, để tạo ra mặt nạ phân đoạn chất lượng cao từ nhiều lời nhắc khác nhau như tín hiệu không gian hoặc văn bản. Được huấn luyện trên bộ dữ liệu SA-1B mở rộng, SAM vượt trội về hiệu suất zero-shot, thích ứng với các phân phối và tác vụ hình ảnh mới mà không cần kiến thức trước.
Làm cách nào tôi có thể sử dụng Segment Anything Model (SAM) để phân đoạn ảnh?
Bạn có thể sử dụng Segment Anything Model (SAM) để phân đoạn hình ảnh bằng cách chạy suy luận với các prompt khác nhau, chẳng hạn như hộp giới hạn hoặc điểm. Dưới đây là một ví dụ sử dụng Python:
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Segment with negative points prompt.
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
Ngoài ra, bạn có thể chạy suy luận với SAM trong giao diện dòng lệnh (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpg
Để biết hướng dẫn sử dụng chi tiết hơn, hãy truy cập phần Phân đoạn.
So sánh SAM và các mô hình YOLO về hiệu suất như thế nào?
So với các mô hình YOLO, các biến thể SAM như SAM-b, SAM2-t, MobileSAM và FastSAM-s thường lớn hơn và chậm hơn nhưng cung cấp các khả năng phân đoạn zero-shot độc đáo. Ví dụ: Ultralytics YOLOv8n-seg nhỏ hơn 11.7 lần và nhanh hơn 1069 lần so với mô hình SAM-b gốc của Meta, làm nổi bật lợi thế đáng kể của YOLO về tốc độ và hiệu quả. Tương tự, YOLO11n-seg mới hơn cung cấp kích thước thậm chí còn nhỏ hơn và duy trì tốc độ suy luận ấn tượng. Điều này làm cho các mô hình YOLO trở nên lý tưởng cho các ứng dụng yêu cầu phân đoạn nhanh, nhẹ và hiệu quả về mặt tính toán, trong khi các mô hình SAM vượt trội trong các tác vụ phân đoạn linh hoạt, có thể nhắc và zero-shot.
Làm thế nào để tự động gán nhãn cho bộ dữ liệu của tôi bằng SAM?
SAM của Ultralytics cung cấp một tính năng tự động chú thích cho phép tạo bộ dữ liệu phân đoạn bằng mô hình phát hiện được huấn luyện trước. Dưới đây là một ví dụ trong Python:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
Hàm này lấy đường dẫn đến hình ảnh của bạn và các đối số tùy chọn cho mô hình phát hiện được huấn luyện trước và mô hình phân đoạn SAM, cùng với các thông số kỹ thuật về thiết bị và thư mục đầu ra. Để có hướng dẫn đầy đủ, hãy xem Tự động chú thích.
Những bộ dữ liệu nào được sử dụng để huấn luyện Segment Anything Model (SAM)?
SAM được huấn luyện trên tập dữ liệu SA-1B mở rộng, bao gồm hơn 1 tỷ mặt nạ trên 11 triệu hình ảnh. SA-1B là tập dữ liệu phân đoạn lớn nhất cho đến nay, cung cấp dữ liệu huấn luyện đa dạng và chất lượng cao, đảm bảo hiệu suất zero-shot ấn tượng trong các tác vụ phân đoạn khác nhau. Để biết thêm chi tiết, hãy truy cập phần Tập dữ liệu.