Segment Anything Model (SAM)
Chào mừng bạn đến với tiên phong trong lĩnh vực phân đoạn hình ảnh với Segment Anything Model, hay SAM. Model mang tính cách mạng này đã thay đổi cuộc chơi bằng cách giới thiệu khả năng phân đoạn hình ảnh dựa trên lời nhắc (promptable) với hiệu suất thời gian thực, thiết lập những 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 model phân đoạn hình ảnh tiên tiến cho phép phân đoạn dựa trên lời nhắc, mang lại sự linh hoạt vượt trội trong các tác vụ phân tích hình ảnh. SAM là cốt lõi của sáng kiến Segment Anything, một dự án đột phá giới thiệu một model, tác vụ và tập dữ liệu mới cho phân đoạn hình ảnh.
Thiết kế tiên tiến của SAM cho phép nó thích nghi với các phân phối hình ảnh và tác vụ 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 đổi zero-shot. Được huấn luyện trên tập dữ liệu SA-1B rộng lớn, chứa hơn 1 tỷ mặt nạ (mask) trải dài trên 11 triệu hình ảnh được tuyển chọn kỹ lưỡng, 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 hoàn toàn trước đây trong nhiều trường hợp.
Hình ảnh ví dụ SA-1B. Hình ảnh tập dữ liệu phủ các mặt nạ từ tập 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 mật quyền riêng tư cùng 1,1 tỷ mặt nạ phân đoạn chất lượng cao. Những mặt nạ này được gán nhãn hoàn toàn tự động bởi SAM, và như đã được xác minh bởi đánh giá của con người và nhiều thí nghiệm, chúng có chất lượng và độ đ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ể nhắc (Promptable Segmentation Task): SAM được thiết kế với tư duy về tác vụ phân đoạn có thể nhắc, cho phép nó tạo ra các mặt nạ phân đoạn hợp lệ từ bất kỳ lời nhắc nào được đưa ra, chẳng hạn như manh mối không gian hoặc văn bản xác định một đối tượng.
- Kiến trúc tiên tiến: Segment Anything Model sử dụng một bộ mã hóa hình ảnh (image encoder) mạnh mẽ, một bộ mã hóa lời nhắc (prompt encoder) và một bộ giải mã mặt nạ (mask decoder) nhẹ. Kiến trúc độc đáo này cho phép nhắc linh hoạt, tính toán mặt nạ thời gian thực và nhận thức sự mơ hồ trong các tác vụ phân đoạn.
- Tập dữ liệu SA-1B: Được giới thiệu bởi dự án Segment Anything, tập dữ liệu SA-1B có hơn 1 tỷ mặt nạ trên 11 triệu hình ảnh. Là tập 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, biến nó 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 nhắc (prompt engineering).
Để có cái nhìn sâu sắc về Segment Anything Model và tập dữ liệu SA-1B, vui lòng truy cập Segment Anything GitHub và xem bài báo nghiên cứu Segment Anything.
SAM hỗ trợ tính năng gán nhãn thông minh (smart annotation) trên Nền tảng Ultralytics, cho phép tạo mặt nạ thông minh dựa trên cú nhấp chuột để gán nhãn tập dữ liệu nhanh chóng. Xem hướng dẫn gán nhãn để biết chi tiết.
Các model khả dụng, tác vụ được hỗ trợ và chế độ vận hành
Bảng này trình bày các model khả dụng với trọng số pretrained cụ thể của chúng, các tác vụ chúng hỗ trợ và khả năng tương thích với các chế độ vận hành khác nhau như Inference (Dự đoán), Validation (Đánh giá), Training (Huấn luyện), và Export (Xuất), được biểu thị bằng biểu tượng ✅ cho các chế độ được hỗ trợ và biểu tượng ❌ cho các chế độ không được hỗ trợ.
| Loại Model | Weights Tiền huấn luyện | Tác vụ được hỗ trợ | Inference | Validation | Training | Export |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Instance Segmentation | ✅ | ❌ | ❌ | ❌ |
| SAM large | sam_l.pt | Instance Segmentation | ✅ | ❌ | ❌ | ❌ |
Cách sử dụng SAM: Sự linh hoạt và sức mạnh trong phân đoạn hình ảnh
Segment Anything Model có thể được sử dụng cho vô số 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 cá thể (instance segmentation), và dự đoán văn bản-thành-mặt nạ sơ bộ. Với kỹ thuật nhắc, SAM có thể nhanh chóng thích nghi với các tác vụ và phân phối dữ liệu mới theo cách zero-shot, thiết lập nó như một công cụ linh hoạt và mạnh mẽ cho mọi nhu cầu phân đoạn hình ảnh của bạn.
Ví dụ về dự đoán SAM
Phân đoạn hình ảnh với các lời nhắc đã 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 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")- Logic ở đây là phân đoạn toàn bộ hình ảnh nếu bạn không truyền bất kỳ lời nhắc nào (bbox/điểm/mặt nạ).
Theo cách này, bạn có thể thiết lập hình ảnh một lần và chạy dự đoán lời nhắc 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 đối số 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)Tất cả các results được trả về trong các ví dụ trên là các đối tượng Results, cho phép truy cập dễ dàng vào các mặt nạ được dự đoán và hình ảnh nguồn.
- Để biết thêm các đối số bổ sung cho
Segment everything, hãy xem Tài liệu tham khảoPredictor/generate.
So sánh SAM với YOLO
Ở đây chúng tôi so sánh model SAM-b của Meta với các model phân đoạn của Ultralytics bao gồm YOLO26n-seg:
| Model | Kích thước (MB) | Tham số (M) | Tốc độ (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s với backbone YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (nhỏ hơn 52.8 lần) | 3.4 (ít hơn 27.6 lần) | 24.8 (nhanh hơn 1682 lần) |
| Ultralytics YOLO11n-seg | 6.2 (nhỏ hơn 60.5 lần) | 2.9 (ít hơn 32.3 lần) | 24.3 (nhanh hơn 1716 lần) |
| Ultralytics YOLO26n-seg | 6.7 (nhỏ hơn 56.0 lần) | 2.7 (ít hơn 34.7 lần) | 25.2 (nhanh hơn 1655 lần) |
Sự so sánh này chứng minh sự khác biệt đáng kể về kích thước và tốc độ model giữa các biến thể SAM và các model phân đoạn YOLO. Trong khi SAM cung cấp các khả năng phân đoạn tự động độc đáo, các model YOLO, đặc biệt là YOLOv8n-seg, YOLO11n-seg và YOLO26n-seg, nhỏ hơn, nhanh hơn và hiệu quả về tính toán hơn đáng kể.
Tốc độ SAM được đo bằng PyTorch, tốc độ YOLO được đo bằng ONNX Runtime. Các bài kiểm tra chạy trên Apple M4 Air 2025 với 16GB RAM sử dụng torch==2.10.0, ultralytics==8.4.31, và onnxruntime==1.24.4. Để tái tạo bài kiểm tra này:
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM-b, MobileSAM
for file in ["sam_b.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 (ONNX)
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt", "yolo26n-seg.pt"]:
model = YOLO(file_name)
model.info()
onnx_path = model.export(format="onnx", dynamic=True)
model = YOLO(onnx_path)
model(ASSETS)Tự động gán nhãn (Auto-Annotation): Con đường nhanh chóng đến các tập dữ liệu phân đoạn
Tự động gán nhãn là một tính năng chính của SAM, cho phép người dùng tạo tập dữ liệu phân đoạn bằng cách sử dụng một model phát hiện pretrained. Tính năng này cho phép gán nhãn nhanh chóng và chính xác cho một số lượng lớn hình ảnh, bỏ qua sự cần thiết của việc gán nhãn thủ công tốn thời gian.
Tạo tập dữ liệu phân đoạn của bạn bằng cách sử dụng một model phát hiện
Để tự động gán nhãn tập dữ liệu của bạn với framework Ultralytics, hãy sử dụng hàm auto_annotate như hiển thị bên dưới:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.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 các hình ảnh mục tiêu để gán nhãn hoặc phân đoạn. |
det_model | str | 'yolo26x.pt' | Đường dẫn model phát hiện YOLO cho phát hiện đối tượng ban đầu. |
sam_model | str | 'sam_b.pt' | Đường dẫn model SAM cho phân đoạn (hỗ trợ SAM, các biến thể SAM2, và các model MobileSAM). |
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 kết quả phát hiện yếu. |
iou | float | 0.45 | Ngưỡng IoU cho NMS để 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 hình ảnh để tối ưu hóa 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 & xe đạp). |
output_dir | str | None | Thư mục lưu cho các nhãn (mặc định là './labels' tương đối 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 model phát hiện pretrained và model phân đoạn SAM, thiết bị để chạy các model và thư mục đầu ra để lưu kết quả đã gán nhãn.
Tự động gán nhãn với các model pretrained có thể cắt giảm đáng kể thời gian và nỗ lực cần thiết để tạo các tập 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 xử lý các bộ sưu tập hình ảnh lớn, vì nó cho phép họ tập trung vào việc phát triển và đánh giá model thay vì gán nhãn 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 cân nhắc 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 muốn bày tỏ lòng biết ơn đến Meta AI vì đã tạo và duy trì nguồn tài nguyên quý giá này cho cộng đồng thị giác máy tính (computer vision).
Câu hỏi thường gặp (FAQ)
Segment Anything Model (SAM) của Ultralytics là gì?
Segment Anything Model (SAM) của Ultralytics là một model 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ể nhắ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 các 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 tập dữ liệu SA-1B rộng lớn, SAM vượt trội về hiệu suất zero-shot, thích nghi với các phân phối hình ảnh và tác vụ mới mà không cần kiến thức trước đó.
Làm thế nào để tôi có thể sử dụng Segment Anything Model (SAM) cho phân đoạn hình ảnh?
Bạn có thể sử dụng Segment Anything Model (SAM) cho phân đoạn hình ảnh bằng cách chạy dự đoán với các lời nhắc khác nhau như hộp bao (bounding boxes) hoặc điểm. Đây là 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 dự đoá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 thêm hướng dẫn sử dụng chi tiết, hãy truy cập phần Phân đoạn.
SAM và các model YOLO so sánh như thế nào về mặt hiệu suất?
So với các model YOLO, các biến thể SAM như SAM-b, 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ụ, YOLO26n-seg nhỏ hơn 56 lần và nhanh hơn hơn 1650 lần so với model SAM-b gốc của Meta trên CPU. Điều này làm cho các model YOLO trở nên lý tưởng cho các ứng dụng đòi hỏi sự phân đoạn nhanh, nhẹ và hiệu quả về tính toán, trong khi các model 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ôi có thể tự động gán nhãn tập dữ liệu của mình bằng SAM?
SAM của Ultralytics cung cấp tính năng tự động gán nhãn cho phép tạo các tập dữ liệu phân đoạn bằng cách sử dụng một model phát hiện pretrained. Đây là ví dụ trong Python:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")Hàm này nhận đường dẫn đến các hình ảnh của bạn và các đối số tùy chọn cho các model detection và SAM segmentation được huấn luyện trước, cùng với các thông số kỹ thuật về thiết bị và thư mục đầu ra. Để xem hướng dẫn đầy đủ, hãy xem Auto-Annotation.
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ỷ mask trên 11 triệu hình ảnh. SA-1B là tập dữ liệu segmentation lớn nhất tính đến nay, cung cấp dữ liệu huấn luyện chất lượng cao và đa dạng, đảm bảo hiệu suất zero-shot ấn tượng trong nhiều tác vụ segmentation khác nhau. Để biết thêm chi tiết, hãy truy cập phần Dataset.