Ultralytics YOLO27:

Mô hình Phân đoạn Mọi thứ (SAM)#

Quá trình phát triển của SAM

Đây là model SAM ban đầu của Meta. Để có các khả năng nâng cao hơn, hãy xem SAM 2 để phân đoạn video hoặc SAM 3 để Phân đoạn Khái niệm Có thể nhắc bằng các prompt mẫu văn bản và hình ảnh.

How to use Segment Anything In Colab

Chào mừng bạn đến với bước tiến mới trong lĩnh vực phân đoạn ảnh cùng Mô hình Phân đoạn Mọi thứ, hay SAM. Model mang tính cách mạng này đã thay đổi lĩnh vực bằng cách giới thiệu khả năng phân đoạn ảnh theo prompt với hiệu năng thời gian thực, thiết lập các tiêu chuẩn mới trong ngành.

Giới thiệu về SAM: Mô hình Phân đoạn Mọi thứ#

Mô hình Phân đoạn Mọi thứ, hay SAM, là một model phân đoạn ảnh tiên tiến, cho phép phân đoạn theo prompt và mang lại tính linh hoạt vượt trội trong các tác vụ phân tích ảnh. SAM là trung tâm 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à dataset mới cho phân đoạn ảnh.

Thiết kế nâng cao của SAM cho phép model thích ứng với các phân phối ảnh và tác vụ mới mà không cần kiến thức trước đó, một đặc tính được gọi là chuyển giao zero-shot. Được huấn luyện trên dataset SA-1B quy mô lớn, chứa hơn 1 tỷ mask trên 11 triệu ảnh được tuyển chọn cẩn thận, SAM đã thể hiện hiệu năng 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.

Mẫu dataset SA-1B với các mask phân đoạn tự động Ảnh mẫu SA-1B. Các ảnh trong dataset được phủ mask từ dataset SA-1B mới được giới thiệu. SA-1B chứa 11 triệu ảnh đa dạng, độ phân giải cao, được cấp phép và bảo vệ quyền riêng tư, cùng 1,1 tỷ mask phân đoạn chất lượng cao. Các mask này được SAM gán nhãn hoàn toàn tự động và, theo xác minh từ đánh giá của con người cùng nhiều thí nghiệm, có chất lượng và độ đa dạng cao. Các ảnh được nhóm theo số lượng mask trên mỗi ảnh để trực quan hóa (trung bình mỗi ảnh có khoảng 100 mask).

Các tính năng chính của Mô hình Phân đoạn Mọi thứ (SAM)#

  • Tác vụ phân đoạn theo prompt: SAM được thiết kế cho tác vụ phân đoạn theo prompt, cho phép tạo các mask phân đoạn hợp lệ từ bất kỳ prompt nào, chẳng hạn như gợ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: Mô hình Phân đoạn Mọi thứ sử dụng image encoder mạnh mẽ, prompt encoder và mask decoder nhẹ. Kiến trúc độc đáo này cho phép cung cấp prompt linh hoạt, tính toán mask theo thời gian thực và nhận biết sự mơ hồ trong các tác vụ phân đoạn.
  • Dataset SA-1B: Được giới thiệu bởi dự án Segment Anything, dataset SA-1B có hơn 1 tỷ mask trên 11 triệu ảnh. Là dataset phân đoạn lớn nhất cho đến nay, dataset này cung cấp cho SAM nguồn dữ liệu huấn luyện đa dạng và quy mô lớn.
  • Hiệu năng zero-shot: SAM thể hiện hiệu năng zero-shot vượt trội trên nhiều tác vụ phân đoạn khác nhau, trở thành công cụ sẵn sàng sử dụng cho các ứng dụng đa dạng với nhu cầu prompt engineering tối thiểu.

Để tìm hiểu chuyên sâu về Mô hình Phân đoạn Mọi thứ và dataset SA-1B, hãy truy cập GitHub của Segment Anything và xem bài nghiên cứu Segment Anything.

SAM trên Ultralytics Platform

SAM cung cấp năng lực cho tính năng gán nhãn thông minh trên Ultralytics Platform, cho phép tạo mask thông minh bằng thao tác nhấp để gán nhãn dataset nhanh chóng. Xem hướng dẫn gán nhãn để biết chi tiết.

Các model hiện có, tác vụ được hỗ trợ và chế độ vận hành#

Bảng này trình bày các model hiện có cùng pretrained weights tương ứng, các tác vụ được hỗ trợ và khả năng tương thích với những chế độ vận hành khác nhau như Inference, Validation, TrainingExport, được biểu thị bằng emoji ✅ cho các chế độ được hỗ trợ và emoji ❌ cho các chế độ không được hỗ trợ.

Loại modelPretrained weightCác tác vụ được hỗ trợTrainingValidationInferenceExport
SAM bản cơ sởsam_b.ptPhân đoạn instance
SAM bản lớnsam_l.ptPhân đoạn instance

Cách sử dụng SAM: Tính linh hoạt và sức mạnh trong phân đoạn ảnh#

Mô hình Phân đoạn Mọi thứ có thể được sử dụng cho nhiều tác vụ downstream vượt ra ngoài dữ liệu huấn luyện. Các tác vụ này bao gồm phát hiện biên, tạo đề xuất đối tượng, phân đoạn instance và dự đoán văn bản-sang-mask sơ bộ. Với prompt engineering, 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, trở thành công cụ linh hoạt và mạnh mẽ cho mọi nhu cầu phân đoạn ảnh của bạn.

Ví dụ dự đoán SAM#

Phân đoạn bằng prompt

Phân đoạn ảnh bằng các prompt đã 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ộ ả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ộ ảnh nếu bạn không truyền prompt nào (bbox/điểm/mask).
Ví dụ SAMPredictor

Theo cách này, bạn có thể thiết lập ảnh một lần và chạy inference với prompt nhiều lần mà không phải chạy image encoder nhiều lần.

import cv2

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = {"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 = {"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, min_mask_region_area=100)
Lưu ý

Tất cả results được trả về trong các ví dụ trên đều là các object Results, cho phép dễ dàng truy cập các mask dự đoán và ảnh nguồn.

So sánh SAM với YOLO#

Tại đâ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:

ModelKích thước
(MB)
Số tham số
(M)
Tốc độ (CPU)
(ms/im)
Meta SAM-b37593.741703
MobileSAM40.710.123802
FastSAM-s với backbone YOLOv823.911.858.0
Ultralytics YOLOv8n-seg7,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-seg6.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-seg6,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)

So sánh này cho thấy 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. Mặc dù SAM cung cấp 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ả tính toán cao hơn đáng kể.

Tốc độ SAM được đo bằng PyTorch, còn tốc độ YOLO được đo bằng ONNX Runtime. Các phép thử được chạy trên Apple M4 Air 2025 với RAM 16GB bằng torch==2.10.0, ultralytics==8.4.31onnxruntime==1.24.4. Để tái hiện phép thử này:

Ví dụ
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, nms=False)  # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
    model = YOLO(onnx_path)
    model(ASSETS)

Tự động gán nhãn: Con đường nhanh chóng để tạo dataset phân đoạn#

Tự động gán nhãn là một tính năng quan trọng của SAM, cho phép người dùng tạo dataset phân đoạn bằng pretrained detection model. Tính năng này cho phép gán nhãn nhanh chóng và chính xác cho số lượng lớn ảnh, loại bỏ nhu cầu gán nhãn thủ công tốn thời gian.

Tạo dataset phân đoạn bằng detection model#

Để tự động gán nhãn dataset bằng framework Ultralytics, hãy sử dụng function auto_annotate như minh họa bên dưới:

Ví dụ
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")
Đối sốKiểuMặc địnhMô tả
datastrbắt buộcĐường dẫn đến thư mục chứa các ảnh mục tiêu cần gán nhãn hoặc phân đoạn.
det_modelstr'yolo26x.pt'Đường dẫn đến model phát hiện YOLO để phát hiện đối tượng ban đầu.
sam_modelstr'sam_b.pt'Đường dẫn đến model SAM để phân đoạn (hỗ trợ trọng số SAM, SAM 2, MobileSAM và SAM 3).
devicestr''Thiết bị tính toán (ví dụ: 'cuda:0', 'cpu' hoặc '' để tự động phát hiện thiết bị).
conffloat0.25Ngưỡng độ tin cậy phát hiện YOLO để lọc các detection yếu.
ioufloat0.45Ngưỡng IoU cho Non-Maximum Suppression để lọc các box chồng lấp.
imgszint640Kích thước đầu vào để resize ảnh (phải là bội số của 32).
max_detint300Số detection tối đa trên mỗi ảnh để sử dụng bộ nhớ hiệu quả.
classeslist[int]NoneDanh sách index lớp cần phát hiện (ví dụ: [0, 1] cho người và xe đạp).
output_dirstrNoneThư mục lưu các annotation (mặc định: thư mục cùng cấp với <data>_auto_annotate_labels).

Function auto_annotate nhận đường dẫn đến các ảnh của bạn, cùng các đối số tùy chọn để chỉ định detection model và SAM segmentation model pretrained, 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 bằng các pretrained model có thể giảm đáng kể thời gian và công sức cần thiết để tạo dataset phân đoạn chất lượng cao. Tính năng này đặc biệt hữu ích cho các nhà nghiên cứu và developer làm việc với bộ sưu tập ảnh lớn, vì cho phép họ tập trung vào 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 đóng góp#

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:

Trích dẫn
@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 giá trị này cho cộng đồng thị giác máy tính.

FAQ#

  • Segment Anything Model (SAM) của Meta là một model phân đoạn ả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 lệnh. Model này tận dụng kiến trúc tiên tiến, bao gồm bộ mã hóa ảnh và bộ mã hóa lệnh kết hợp với bộ giải mã mặt nạ gọn nhẹ, để tạo ra các mặt nạ phân đoạn chất lượng cao từ nhiều lệnh khác nhau như tín hiệu không gian hoặc văn bản. Được huấn luyện trên SA-1B dataset rộng lớn, SAM đạt hiệu suất zero-shot xuất sắc, thích ứng với các phân phối ảnh và tác vụ mới mà không cần kiến thức trước.

  • Bạn có thể sử dụng Mô hình Phân đoạn Mọi thứ (SAM) để phân đoạn ảnh bằng cách chạy inference với nhiều loại prompt như bounding box hoặc điểm. Dưới đâ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 inference với SAM trong command line interface (CLI):

    yolo predict model=sam_b.pt source=path/to/image.jpg

    Để xem hướng dẫn sử dụng chi tiết hơn, hãy truy cập phần Segmentation.

  • 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 khả năng phân đoạn zero-shot độc đáo. Ví dụ, YOLO26n-seg nhỏ hơn 56 lầnnhanh hơn hơn 1650 lần so với model SAM-b ban đầu của Meta trên CPU. Điều này khiến các model YOLO trở nên lý tưởng cho những ứng dụng yêu cầu khả năng phân đoạn nhanh, nhẹ và hiệu quả về tính toán, trong khi các model SAM nổi trội trong các tác vụ phân đoạn linh hoạt, theo prompt và zero-shot.

  • SAM của Ultralytics cung cấp tính năng tự động gán nhãn, cho phép tạo dataset phân đoạn bằng pretrained detection model. Dưới đây là ví dụ bằng Python:

    from ultralytics.data.annotator import auto_annotate
    
    auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")

    Function này nhận đường dẫn đến các ảnh của bạn và các đối số tùy chọn cho detection model và SAM segmentation model pretrained, cùng thông tin chỉ định thiết bị và thư mục đầu ra. Để xem hướng dẫn đầy đủ, hãy tham khảo Tự động gán nhãn.

  • SAM được huấn luyện trên dataset SA-1B quy mô lớn, bao gồm hơn 1 tỷ mask trên 11 triệu ảnh. SA-1B là dataset phân đoạn lớn nhất cho đế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 năng zero-shot ấn tượng trên 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 Dataset.

Bình luận