Phần này hiện chỉ có bản tiếng Anh.
Tài liệu cốt lõi
Bậc thử nghiệm

LibreVLM

Đưa một ảnh và danh sách từ cho vision language model để nhận lại các bounding box. LibreVLM biến Qwen3-VL, Florence-2 và các mô hình tương tự thành bộ phát hiện đối tượng với từ vựng mở sử dụng chính xác cùng API Results như mọi mô hình LibreYOLO khác.

Giới thiệu

Một bộ phát hiện cổ điển đi kèm danh sách lớp đối tượng cố định được gắn vào head. LibreVLM loại bỏ ràng buộc đó. LibreVLM bọc các vision language model hiện đại đã được tinh chỉnh theo chỉ dẫn, dùng prompt để yêu cầu chúng tạo bounding box, phân tích văn bản được sinh ra và trả về cùng đối tượng Results mà bạn đã dùng cho YOLO9 và RF-DETR. Danh sách lớp đối tượng chỉ là danh sách từ bạn cung cấp tại runtime, vì vậy việc thêm một lớp mới không tốn chi phí huấn luyện và hoạt động theo kiểu zero-shot.

  • Từ vựng mở. Phát hiện "ô tô màu hồng", "biển số xe" hoặc "hòn đảo nhỏ" mà không cần huấn luyện head cho chúng.
  • Một factory, một contract. LibreVLM(...) trả về Results chuẩn với boxes.xyxy, boxes.cls, boxes.conf, cùng .plot().save().
  • Backend có thể hoán đổi. Sáu họ mô hình dùng chung một chuỗi bí danh, từ Florence-2 230M đến Qwen3-VL 8B.
  • Lối truy cập thô. chat() cho phép hỏi đáp tự do về ảnh khi bạn cần nhiều hơn bounding box.

Tại sao cần một bậc riêng và một trang riêng

LibreVLM được chủ ý tách khỏi factory LibreYOLO(...) với từ vựng đóng và registry .pt của nó. Các mô hình này hoạt động dựa trên prompt, dùng từ vựng mở và báo cáo độ tin cậy tổng hợp nên tuân theo một contract khác. Đặt chúng vào một bậc riêng giúp tài liệu phát hiện cốt lõi rõ ràng và minh bạch về những gì được đo lường.

Trên nhánh dev

LibreVLM hiện nằm trên nhánh dev và được nhắm đến cho bản phát hành v1.3; tính năng này không thuộc v1.2.0. Đây là bậc chỉ suy luận bằng Python: chưa có quy trình huấn luyện, kiểm định, xuất hoặc CLI, đồng thời điểm độ tin cậy chỉ là giá trị giữ chỗ. Hãy đọc phần Hạn chế trước khi xây dựng dựa trên tính năng này.

Cài đặt

LibreVLM nằm sau extra vlm tùy chọn. Extra này cài một phiên bản transformers mới và các helper mà một số processor cần. Nếu không có extra, việc import một họ VLM sẽ phát sinh ImportError dẫn đến trang này.

bash
1pip install 'libreyolo[vlm]'

Trọng số được tải xuống từ Hugging Face Hub trong lần sử dụng đầu tiên vào thư mục weights/ cục bộ. Một số họ được phát hành theo giấy phép không thuộc OSI và ghi một thông báo duy nhất trước khi tải xuống. Nên dùng GPU cho các backend lớn hơn, nhưng mọi mô hình cũng chạy được trên CPU với device="cpu".

Bắt đầu nhanh

Khởi tạo mô hình, khai báo các từ bạn quan tâm rồi dự đoán. Backend mặc định là Qwen3-VL-4B, bộ phát hiện mạnh nhất trong bậc và mang giấy phép Apache-2.0.

python
1from libreyolo import LibreVLM
2
3# Qwen3-VL-4B by default; weights autodownload on first use
4model = LibreVLM()
5
6# The vocabulary is just words. Any words.
7model.set_classes(["pink car", "wheel"])
8
9result = model.predict("street.jpg")
10
11print(result.boxes.xyxy) # pixel [x1, y1, x2, y2]
12print(result.boxes.cls) # ids into ["pink car", "wheel"]
13result.plot() # same drawing helpers as any LibreYOLO model
14result.save("out.jpg")

Đó là toàn bộ quy trình. Mọi thứ sau predict() hoạt động như một bộ phát hiện thông thường, vì vậy mã trực quan hóa, cắt ảnh và theo dõi hiện có vẫn hoạt động.

Các mô hình được hỗ trợ

Chọn backend bằng bí danh truyền cho LibreVLM(...). Tên họ không kèm kích thước sẽ được phân giải thành kích thước mặc định. Backend mặc định chung là qwen3-vl-4b. Trong thực tế, các bộ phát hiện mạnh nhất là Qwen3-VL, LFM2-VLFlorence-2.

HọBí danhKích thước (tham số)Giấy phépGhi chú
Qwen3-VLqwen3-vl-2b / -4b / -8b2B / 4B / 8BApache-2.0Mặc định và mạnh nhất. Điểm khởi đầu được đề xuất.
LFM2-VLlfm2-vl-450m / -1.6b450M / 1.6BLFM Open LicenseKích thước phù hợp thiết bị biên, bộ phát hiện nhỏ mạnh đáng ngạc nhiên. Có thông báo giấy phép.
InternVL3internvl3-1b / -2b / -8b1B / 2B / 8BQwen LicenseGrounding tốt ở kích thước 8B; các kích thước nhỏ hoạt động yếu. Có thông báo giấy phép.
Florence-2florence-2-base / -large0.23B / 0.77BMITMô hình grounding chuyên dụng. Bounding box khít, không có chat().
SmolVLM2smolvlm2-500m / -2.2b500M / 2.2BApache-2.0Rất nhỏ và nhanh; khả năng phát hiện yếu hơn. Phù hợp để thử nhanh.
Kosmos-2kosmos-2~1.6BMITMô hình grounding từ năm 2023. Bounding box thô hơn, không có chat().

Chọn backend

  • Chất lượng tốt nhất: qwen3-vl-8b hoặc qwen3-vl-4b (mặc định).
  • Bounding box khít, dung lượng nhỏ: florence-2-large.
  • Thiết bị biên / CPU: lfm2-vl-450m hoặc smolvlm2-500m.
  • Giấy phép hoàn toàn thoáng: mọi kích thước Qwen3-VL, SmolVLM2, Florence-2 hoặc Kosmos-2.

Giấy phép

Qwen3-VL và SmolVLM2 dùng Apache-2.0; Florence-2 và Kosmos-2 dùng MIT. LFM2-VL và InternVL3 mang giấy phép không thuộc OSI và hiển thị thông báo một lần trước lần tải xuống đầu tiên để bạn có thể đưa ra lựa chọn đầy đủ thông tin cho mục đích thương mại.

Thiết lập từ vựng

Từ vựng là phần cốt lõi của phát hiện với từ vựng mở. Gọi set_classes() với danh sách chuỗi nhãn. Danh sách này được giữ lại qua mọi lời gọi predict()track() sau đó cho đến khi bạn thiết lập lại. Phương thức trả về self nên có thể nối chuỗi lời gọi.

python
1# Sticky and chainable
2model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"])
3
4# Set it once at construction instead
5model = LibreVLM("lfm2-vl-450m", names=["boat"], device="cpu")
6
7# Re-set any time to change what you are looking for
8model.set_classes(["a red car", "a blue truck"])

Nhãn có thể là bất kỳ cụm từ nào. Chúng phải là duy nhất khi không phân biệt chữ hoa chữ thường và bạn phải truyền một danh sách, không phải một chuỗi đơn lẻ. Nếu không bao giờ gọi set_classes(), mô hình sẽ dùng từ vựng COCO-80 dự phòng để lời gọi predict() đơn thuần vẫn cho kết quả hợp lý.

Dự đoán

predict() và lời gọi model(...) tương đương chấp nhận cùng các loại nguồn như mọi bộ phát hiện LibreYOLO: đường dẫn, ảnh PIL, mảng numpy, URL, thư mục hoặc video. stream=Truetrack() cũng hoạt động.

python
1result = model.predict(
2 source="image.jpg", # path | PIL | ndarray | URL | folder | video
3 conf=0.25, # see note below: scoring is synthetic
4 classes=[0], # optional: keep only these vocabulary ids
5 max_det=300,
6)

Cấu trúc trả về

Bạn nhận lại đối tượng Results chuẩn, giống hệt bộ phát hiện với từ vựng đóng:

TrườngHình dạng / kiểuÝ nghĩa
result.boxes.xyxyN x 4Bounding box theo pixel [x1, y1, x2, y2], được đổi tỷ lệ về ảnh gốc.
result.boxes.clsNID lớp đối tượng làm chỉ mục vào từ vựng set_classes() của bạn.
result.boxes.confNĐộ tin cậy tổng hợp: 1.0 cho mọi bounding box (xem phần Hạn chế).
result.plot() / .save()-Các helper vẽ và lưu thông thường.

Bên trong, LibreVLM phân tích đầu ra mô hình theo cách linh hoạt, xử lý khối Markdown, văn bản thừa, bounding box trùng lặp và mảng bị cắt ngắn, ánh xạ nhãn văn bản tự do về ID lớp đối tượng của bạn và loại bỏ mọi nhãn không có trong từ vựng. Bước cuối cùng này khiến một bộ sinh tự do hoạt động như bộ phát hiện tập đóng.

Ví dụ

Phát hiện đối tượng có màu cụ thể

python
1from libreyolo import LibreVLM
2
3model = LibreVLM("qwen3-vl-4b")
4model.set_classes(["red car"])
5
6result = model.predict("parking_lot.jpg")
7print(f"Found {len(result.boxes.cls)} red car(s)")
8result.save("red_cars.jpg")

Bounding box khít với Florence-2

python
1# Florence-2 is a purpose-built grounder: very tight pixel boxes.
2model = LibreVLM("florence-2-large")
3model.set_classes(["a red car", "license plate"])
4
5result = model.predict("car.jpg")
6result.plot()

Lọc nhanh về một lớp đối tượng

python
1model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"])
2
3# classes= filters the configured vocabulary by id
4people_only = model.predict("street.jpg", classes=[0])

Chạy trên CPU với ảnh mẫu tích hợp sẵn

python
1from libreyolo import LibreVLM, SAMPLE_IMAGE
2
3model = LibreVLM("lfm2-vl-450m", device="cpu")
4# No set_classes() -> falls back to the COCO-80 vocabulary
5result = model.predict(SAMPLE_IMAGE)
6print(model.names[result.boxes.cls[0]]) # e.g. "person"

Batch, thư mục và video

python
1model = LibreVLM().set_classes(["forklift", "pallet"])
2
3# A whole folder
4for result in model.predict("warehouse_frames/", stream=True):
5 result.save()
6
7# A video file (frames are processed one at a time)
8model.predict("warehouse.mp4", save=True)

Chat thô

Đôi khi bạn cần mô hình chứ không phải bộ phát hiện. Các họ dùng chat template cung cấp chat(), nhận một ảnh cùng prompt tự do và trả về nguyên văn phần văn bản đã giải mã. Hãy dùng phương thức này để đếm, tạo chú thích hoặc đặt câu hỏi nhanh về hình ảnh.

python
1model = LibreVLM("qwen3-vl-4b")
2
3answer = model.chat("harbor.jpg", "How many boats are docked? Answer with a number.")
4print(answer)

chat() có trên các họ dùng chat template (Qwen3-VL, LFM2-VL, SmolVLM2, InternVL3). Florence-2 và Kosmos-2 là các mô hình grounding dùng task token và phát sinh NotImplementedError; hãy dùng predict() với chúng.

Sự khác biệt giữa các backend

Mọi họ đều trả về cùng một Results, nhưng theo những cách khác nhau. Bạn hiếm khi cần quan tâm đến điều này, tuy nhiên việc hiểu lý do một số backend hoạt động khác biệt vẫn hữu ích. Các họ chat được prompt để trả về một mảng JSON chứa bounding box; các mô hình grounding dùng task token chuyên biệt.

HọCách dùng promptKhông gian tọa độchat()
Qwen3-VLPrompt JSON chứa bounding box0 đến 1000, đã đổi tỷ lệ
LFM2-VLPrompt JSON chứa bounding boxChuẩn hóa từ 0 đến 1
SmolVLM2Prompt JSON chứa bounding boxChuẩn hóa từ 0 đến 1
InternVL3Prompt JSON chứa bounding box0 đến 1000, đã đổi tỷ lệ
Florence-2Task tokenPixel gốcKhông
Kosmos-2Prompt groundingĐã chuẩn hóa, đã đổi tỷ lệKhông

Với các họ chat, bạn có thể ghi đè prompt phát hiện bằng đối số constructor prompt= và giới hạn độ dài sinh bằng max_new_tokens=. Thiết bị và dtype được phân giải tự động: bf16 hoặc fp16 trên CUDA, fp32 trên CPU.

Hạn chế

LibreVLM mạnh mẽ nhưng còn non trẻ. Biết trước các giới hạn sẽ tránh những bất ngờ về sau.

  • Độ tin cậy tổng hợp. Mọi bounding box đều có điểm 1.0. Vì vậy bộ lọc conf= hoạt động theo kiểu tất cả hoặc không có gì thay vì dùng ngưỡng thực.
  • Không có mAP / kiểm định. val() phát sinh lỗi vì điểm tổng hợp sẽ khiến mAP COCO gây hiểu lầm.
  • Không huấn luyện hoặc xuất. train()export() phát sinh lỗi. Thay vào đó, hãy tinh chỉnh VLM thượng nguồn rồi tải trọng số thu được.
  • Khả năng theo dõi bị suy giảm. track() vẫn chạy, nhưng điểm số đồng nhất khiến giai đoạn khôi phục với độ tin cậy thấp của tracker không hoạt động.
  • Mỗi lần một ảnh. Quá trình sinh diễn ra tuần tự trong v1 nên giá trị batch= lớn hơn không giúp tăng tốc.
  • Chỉ có API Python. CLI libreyolo chưa phân giải bí danh VLM.

Trường hợp phù hợp nhất

Dùng LibreVLM khi tập lớp đối tượng có tính mở, thay đổi thường xuyên hoặc khó gán nhãn từ trước: tạo nguyên mẫu nhanh, các lớp đuôi dài hoặc hiếm và quy trình "tìm thứ tôi mô tả bằng lời". Khi cần độ tin cậy đã hiệu chỉnh, thông lượng hoặc artifact có thể triển khai, hãy huấn luyện YOLO9 hoặc RF-DETR với từ vựng đóng theo tài liệu cốt lõi.

Chỉ suy luậnnhánh dev / nhắm đến v1.3Mã nguồn trên GitHub