Hướng dẫn sử dụng Segment Anything Model (SAM) của Meta AI trên máy tính cá nhân

Segment Anything Model (SAM) là mô hình thị giác máy tính do Meta AI phát triển, cho phép phân đoạn (segmentation) “bất kỳ đối tượng nào” trong ảnh chỉ với vài điểm click hoặc khung bounding box.
Nhờ được huấn luyện trên tập dữ liệu khổng lồ (hơn 11 triệu ảnh, 1,1 tỷ mask), SAM trở thành một
foundation model cho segmentation, rất phù hợp để:

  • Tự động gán nhãn polygon cho dữ liệu (từ detection → segmentation).
  • Tách đối tượng khỏi nền để xử lý hậu kỳ, AR/VR, đồ họa.
  • Hỗ trợ các bài toán segmentation chuyên sâu trong y tế, robot, tự động hóa,…

Bài viết này sẽ giới thiệu tổng quan SAM, các trường hợp nên dùng, cách cài đặt trên máy cá nhân
và ví dụ sử dụng thực tế.

Mục lục

1. Segment Anything (SAM) là gì?

Segment Anything Model (SAM) là mô hình phân đoạn ảnh (image segmentation) do Meta AI phát triển. Ý tưởng chính của SAM là mô hình promptable segmentation – mô hình không chỉ phân đoạn theo cách “cố định” mà có thể nhận nhiều loại prompt khác nhau:

  • Point prompt: click 1 hoặc nhiều điểm trong/ngoài vùng đối tượng.
  • Box prompt: vẽ bounding box quanh đối tượng.
  • Mask prompt: dùng một mask thô như gợi ý để refine.
  • Text prompt (Hỗ trợ ở SAM 3): dùng từ khóa để tự động tìm & phân đoạn đối tượng trong ảnh/video.

SAM gồm 3 thành phần chính:

  1. Image Encoder: mã hóa toàn bộ ảnh thành feature (thường là Vision Transformer).
  2. Prompt Encoder: mã hóa các prompt (điểm, box, mask, text,…).
  3. Mask Decoder: kết hợp thông tin từ image encoder và prompt encoder để sinh ra 1 hoặc nhiều mask chất lượng cao.

Điểm mạnh lớn nhất của SAM là khả năng zero-shot: không cần fine-tune, mô hình vẫn cho kết quả segmentation rất tốt trên nhiều loại ảnh khác nhau, từ đời thường, công nghiệp đến ảnh y tế.

2. Khi nào nên dùng Segment Anything?

Dưới đây là các trường hợp thực tế mà SAM cực kỳ hữu ích:

2.1. Tăng tốc gán nhãn segmentation

Nếu bạn đã có sẵn dataset detection (YOLO, COCO, Pascal VOC) với bounding box, SAM có thể giúp convert từ box sang segmentation mask gần như tự động:

  • Giảm rất nhiều thời gian vẽ polygon thủ công.
  • Giữ được độ chính xác cao cho các biên phức tạp (cây cối, tóc, đồ vật mảnh,…).

2.2. Tách đối tượng khỏi nền (background removal)

Bạn có thể dùng SAM để tách người, sản phẩm, vật thể ra khỏi background, sau đó kết hợp với các pipeline như:

  • Thay nền (background replacement) cho thương mại điện tử.
  • Ghép đối tượng vào cảnh 3D, AR/VR.
  • Làm blur nền, giữ nét chủ thể.

2.3. Hỗ trợ ứng dụng chuyên sâu: y tế, robotics, công nghiệp

Trong các bài toán như phân đoạn mô, cơ quan trong ảnh y tế, hoặc nhận diện chi tiết nhỏ trong môi trường công nghiệp, SAM có thể:

  • Làm bước tiền xử lý (pre-processing) để tách vùng quan tâm.
  • Tạo mask làm ground truth cho các model chuyên biệt khác.
  • Tích hợp với pipeline robot (ví dụ robot pick & place) để định nghĩa vùng grasping chính xác.

Segment Anything Demo

3. Các phiên bản SAM: SAM 1, SAM 2, SAM 3

Tính đến cuối năm 2025, hệ Segment Anything đã có nhiều phiên bản, bạn có thể chọn tùy theo nhu cầu:

  • SAM 1 (Segment Anything Model ban đầu):
    Tập trung vào image segmentation, là bản đang được sử dụng rộng rãi nhất, mã nguồn tại GitHub facebookresearch/segment-anything.
  • SAM 2: mở rộng sang video segmentation với kiến trúc transformer có bộ nhớ streaming, phù hợp cho xử lý video thời gian thực.
  • SAM 3: bổ sung thêm các tính năng mạnh mẽ cho segment và track đối tượng:

    • Segment Anything trong ảnh và video với chất lượng mask cao hơn SAM 1.
    • Open-vocabulary segmentation: hiểu và phân đoạn đối tượng bằng mô tả ngôn ngữ.
    • Text-to-Segment: chỉ cần nhập mô tả như “red bag”, mô hình tự tìm và phân đoạn đúng vùng.
    • Multi-modal prompting: point, box, mask, text.
    • Video tracking: giữ ID đối tượng xuyên suốt video.
    • Hiệu năng tốt hơn, encoder nhanh hơn, hỗ trợ pipeline thời gian thực.

    Segment Anything Demo

Trong phạm vi bài viết này, chúng ta tập trung vào SAM 1 – bản gốc vì:

  • Đã được cộng đồng hỗ trợ rất tốt.
  • Dễ triển khai trên máy cá nhân (Python + PyTorch).
  • Rất phù hợp cho bài toán annotate dataset và xử lý ảnh tĩnh.

4. Cài đặt Segment Anything trên máy cá nhân

4.1. Yêu cầu hệ thống

  • Python ≥ 3.8.
  • PyTorch (có GPU thì tốt, nhưng SAM vẫn chạy được trên CPU).
  • pip, git đã cài sẵn.
  • Khuyến nghị: máy có GPU NVIDIA (VRAM ≥ 8GB) để xử lý nhanh hơn.

4.2. Cài đặt thư viện Segment Anything

Trong thư mục project, bạn có thể làm như sau:

# 1. Clone repo Segment Anything
git clone https://github.com/facebookresearch/segment-anything.git
cd segment-anything

# 2. (Khuyến nghị) Tạo virtual env
python -m venv .venv
source .venv/bin/activate # Linux / macOS
# .venv\Scripts\activate # Windows

# 3. Cài các dependency
pip install -r requirements.txt

4.3. Tải checkpoint cho SAM

Repository của SAM cung cấp sẵn nhiều checkpoint, phổ biến nhất:

  • sam_vit_h_4b8939.pth: bản lớn, chất lượng cao nhất.
  • sam_vit_l_0b3195.pth: bản large.
  • sam_vit_b_01ec64.pth: bản base, nhẹ hơn, phù hợp máy yếu.

Bạn tải checkpoint mong muốn về và đặt vào một thư mục, ví dụ:
checkpoints/sam_vit_h_4b8939.pth

5. Cách sử dụng SAM cơ bản với Python

Dưới đây là ví dụ tối giản để bạn có thể chạy được SAM trên ảnh bất kỳ.
Ví dụ dùng OpenCV để load & visualize.

5.1. Ví dụ dùng prompt điểm (point)

5.2. Ví dụ dùng prompt bounding box

5.3. Tự động tạo mask cho toàn ảnh

Nếu bạn muốn tạo mask cho tất cả đối tượng trong ảnh (phục vụ annotation dataset), có thể dùng SamAutomaticMaskGenerator:

6. Ứng dụng thực tế: từ YOLO detection sang segmentation

Một workflow rất thường gặp (và được nhiều dự án sử dụng) là:

  1. Bước 1: Train mô hình YOLO detection để tìm bounding box của đối tượng.
  2. Bước 2: Dùng SAM, với prompt là các bounding box từ YOLO, để sinh ra segmentation mask tương ứng.
  3. Bước 3: Lưu mask dưới dạng:
    • Polygon (dùng cho YOLOv8-seg, COCO segmentation).
    • Bitmap (PNG mask, mỗi đối tượng là 1 channel hoặc 1 file).
  4. Bước 4: Dùng dataset mới (segmentation) để train YOLOv8-seg hoặc model segmentation khác.

Workflow này giúp:

  • Tái sử dụng công sức annotate detection sẵn có.
  • Tiết kiệm thời gian, đặc biệt với đối tượng có biên phức tạp.
  • Dễ dàng mở rộng sang các bài toán đếm đối tượng, đo diện tích, ước lượng hình dạng,…

Trong code, bạn chỉ cần đọc label detection (YOLO format: class cx cy w h), convert về x_min, y_min, x_max, y_max, rồi đưa vào predictor.predict(…, box=input_box) như ví dụ ở trên. Sau đó convert mask sang format polygon phù hợp (YOLOv8 segmentation, COCO, v.v.).

7. Mẹo tối ưu hiệu năng khi dùng Segment Anything

7.1. Chọn kích thước model phù hợp

  • sam_vit_h: chất lượng tốt nhất, nhưng nặng – phù hợp máy có GPU mạnh.
  • sam_vit_l: cân bằng giữa tốc độ và chất lượng.
  • sam_vit_b: nhẹ nhất, phù hợp khi chạy trên CPU hoặc GPU yếu.

7.2. Tối ưu kích thước ảnh

  • Không nên feed ảnh 4K, 8K nếu không cần thiết → resize về một mức hợp lý (ví dụ chiều dài lớn nhất ~1024–1536 px).
  • Đảm bảo đối tượng vẫn đủ lớn trong ảnh sau khi resize.

7.3. Tận dụng GPU và batch

  • Luôn sam.to(“cuda”) nếu có GPU NVIDIA.
  • Với SamAutomaticMaskGenerator, nhóm nhiều ảnh lại xử lý tuần tự (theo batch logic của bạn) để hạn chế overhead load model.

7.4. Lưu cache feature

Khi annotate ảnh tương tác (người dùng click nhiều lần trên cùng một ảnh), SAM cho phép:

  • Chạy set_image() một lần → encode ảnh.
  • Các lần click sau chỉ cần gọi predictor.predict(), rất nhanh.

8. Lưu ý và best practices khi dùng SAM

  • Giấy phép: SAM được release với license Apache 2.0 – rất thân thiện cho nghiên cứu và thương mại. Bạn vẫn nên đọc kỹ file LICENSE trong repo.
  • Bias dữ liệu: Dù dataset rất lớn, vẫn có thể tồn tại bias (ví dụ kém với một số domain rất đặc thù). Với domain khó (medical, vệ tinh,…), bạn nên đánh giá kỹ trước khi đưa vào production.
  • Kết hợp với model khác: SAM rất mạnh cho segmentation nhưng không thay thế hoàn toàn detection/classification. Thực tế nên kết hợp: YOLO (detection) + SAM (segmentation) + classifier,…
  • Kiểm soát chất lượng mask: Đừng tin 100% vào mask tự động. Trong pipeline gán nhãn, vẫn nên có bước review/adjust thủ công với các trường hợp khó.

9. Câu hỏi thường gặp về Segment Anything (FAQ)

9.1. Segment Anything (SAM) có miễn phí không?

SAM được Meta phát hành dưới license Apache 2.0, bạn có thể sử dụng cho mục đích nghiên cứu và thương mại, miễn là tuân thủ điều khoản trong license.

9.2. SAM có bắt buộc dùng GPU không?

Không bắt buộc. SAM chạy được trên CPU, nhưng:

  • Trên CPU: tốc độ chậm, phù hợp demo, thử nghiệm nhỏ.
  • Trên GPU: tốc độ nhanh hơn rất nhiều, đặc biệt với automatic mask generator hoặc xử lý hàng nghìn ảnh.

9.3. SAM khác gì so với YOLOv8-seg?

Tóm tắt:

  • SAM: foundation model, zero-shot, promptable, không cần train lại vẫn chạy được trên nhiều domain.
  • YOLOv8-seg: model segmentation/detection chuyên biệt, cần train trên dataset của bạn để đạt hiệu năng tốt nhất.

Thực tế, nhiều pipeline sử dụng SAM để tạo nhãn, sau đó train YOLOv8-seg trên nhãn đó.

9.4. Có cần fine-tune SAM không?

Phần lớn trường hợp không cần. Tuy nhiên, nếu bạn làm domain rất đặc biệt (y tế, microscopy, ảnh vệ tinh hiếm,…), có thể cân nhắc các kỹ thuật fine-tune nhẹ hoặc adapter, hoặc dùng các biến thể như HQ-SAM để cải thiện chất lượng mask chi tiết.

9.5. Nên chọn SAM 1, SAM 2 hay SAM 3?

  • Chỉ ảnh tĩnh, cần annotate dataset, xử lý offline → SAM 1 là đủ.
  • Video, cần streaming real-time → cân nhắc SAM 2.
  • Bài toán 3D, tái tạo object/scene → xem thêm SAM 3.


Leave a Reply