查看 Markdown

视觉语言 API

LibreVLM 加载一个生成式视觉语言模型,并把它当作目标检测器来驱动。类别列表是一个提示词,而不是一个固定的 head,模型返回的 Results 和其他任何家族返回的一样。

安装

这一层需要 vlm extra。

bash
pip install 'libreyolo[vlm]'

工厂

python
LibreVLM(model: str = "qwen3-vl-4b", **kwargs) -> LibreVLMModel

model 是一个别名,不是路径。**kwargs 会传到家族的构造函数,它接受 devicenames(初始词汇表,等价于加载之后调用 set_classes)、prompt(覆盖检测用的 提示词)和 max_new_tokens。未知的别名会抛出 ValueError,并列出每一个别名。

检测一份开放词汇
from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")model.set_classes(["person", "skateboard"]) result = model.predict(SAMPLE_IMAGE)for box, cls in zip(result.boxes.xyxy, result.boxes.cls):    print(result.names[int(cls)], box.tolist())
提一个自由形式的问题
from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")print(model.chat(SAMPLE_IMAGE, "How many people are in this image?"))

别名

家族别名尺寸权重
Qwen3-VLqwen3-vl, qwen3-vl-2b, qwen3-vl-4b, qwen3-vl-8b2b, 4b, 8bQwen/Qwen3-VL-2B-Instruct, -4B-, -8B-
LFM2-VLlfm2-vl, lfm2-vl-450m, lfm2-vl-1.6b450m, 1.6bLiquidAI/LFM2.5-VL-450M, -1.6B
InternVL3internvl3, internvl3-1b, internvl3-2b, internvl3-8b1b, 2b, 8bOpenGVLab/InternVL3-1B-hf, -2B-hf, -8B-hf
SmolVLM2smolvlm2, smolvlm2-2.2b, smolvlm2-500m2.2b, 500mHuggingFaceTB/SmolVLM2-2.2B-Instruct, SmolVLM2-500M-Video-Instruct
Florence-2florence-2, florence2, florence-2-base, florence-2-largebase, largeflorence-community/Florence-2-base, -large
Kosmos-2kosmos-2, kosmos2224microsoft/kosmos-2-patch14-224
LocateAnythinglocate-anything, locateanything, locate-anything-3b, locateanything-3b3bnvidia/LocateAnything-3B
SenseNova-Visionsensenova-vision, sensenova-vision-7b, sensenovavision7bLibreYOLO/SenseNovaVision7b
LibreMODUSlibremodus, libremodus-14b-a7b, modus, modus-14b-a7b14b-a7b固定的上游快照

默认别名是 qwen3-vl-4b。每个家族默认别名对应的尺寸,就是列表里排在最前面的那 个:qwen3-vl 解析为 4blfm2-vl450minternvl32bsmolvlm22.2bflorence-2base

LibreVLMLibreLFM2VLLibreQwen3VLLibreSmolVLM2LibreInternVL3LibreFlorence2LibreKosmos2LibreLocateAnythingLibreMODUS (也可以写成 LibreModus)在包级别导出。

任务

大多数家族只服务 detect。有两个提供得更多:

家族支持的任务
LocateAnythingdetect, point
SenseNova-Visiondetect, segment, panoptic, pose, point, depth, ocr

因为任务是提示词驱动的,而不是固化进检查点(checkpoint)里的,所以可以在一个已经 加载好的模型上切换:

python
model.set_task(task: str) -> LibreVLMModel

任务会按家族支持的列表做校验,并且在之后的 predict()track() 调用中一直 沿用;模型本身会被返回,所以调用可以链起来。

set_classes

python
model.set_classes(classes: list[str]) -> LibreVLMModel

设定开放词汇。任何词都可以,因为模型是被这些词提示的,而不是被约束到一个固定的 head 上。列表必须非空,并且忽略大小写比较时各项必须唯一。传入一个裸字符串会抛出 TypeError,因为它会被枚举成一堆单字符类别。词汇表是粘性的:加载之后设置一次, 它会一直保留到下一次设置。

chat

python
model.chat(image, prompt, max_new_tokens=None, color_format="auto") -> str

原始的多模态生成:输入图像和提示词,输出解码后的文本,原样返回。这是检测这层便利 封装底下的逃生口,用于自由形式的提问、计数,或者检测封装覆盖不到的输出格式。 max_new_tokens 会回退到家族的 MAX_NEW_TOKENS,在基类上是 1024。解码是贪心的, 带一点轻微的重复惩罚。

置信度

生成式输出没有经过校准的逐框置信度。这个版本给出一个常数占位值,好让 predict、 绘制和 track 正常工作,这也让 conf= 过滤和 mAP 变得含糊,而不是真有意义。这 也是 val() 抛出异常的原因:在占位分数上算 COCO mAP 会产生误导。

预测与跟踪

标准的预测接口在这里同样适用,track() 也能用,所以一个 VLM 检测器可以像其他任何 家族一样接进同一条流水线。有两条类级别的策略和卷积检测器不同:测试时增强被禁用, 因为多尺度增强对一个固定分辨率的生成器毫无意义;批量预测被关闭,因为生成是自回归 的,而且预处理返回的是一份文本加图像的编码,而不是一个可以堆叠的图像张量。

不支持

train()val()export() 都会抛出 NotImplementedError。微调请在上游做, 然后把得到的权重加载进来。

远程代码

随库发布的每一个家族都通过原生模型类加载,所以 LibreYOLO 默认不会执行第三方仓库的 代码。确实需要它的家族必须显式选择开启,并固定一个快照修订版;LocateAnything 就是 这样的一个,固定在 commit c32291ca5e996f5a7a485845b4f57a233936bba0 上。

LibreMODUS 是检查点结构的一个显式例外:它的别名解析到的是一个装着固定上游文件的 目录,而不是一个 LibreYOLO .pt,并且 LibreYOLO 既不给它加 v1.0 元数据,也不再 分发它。

别名读自 libreyolo/models/vlm/__init__.py;仓库、尺寸和任务列表读自 libreyolo/models/vlm/ 下的各家族模块,以及 libreyolo/models/sensenova/model.py;调用规则和抛出的异常读自 libreyolo/models/vlm/base.py,均为 v1.5.0。