模型加载

July 19, 2026 · View on GitHub

X-AnyLabeling 内置了多种通用模型,完整列表参见模型列表

Tip

如需部署远程推理服务或支持多人协作,请参考 X-AnyLabeling-Server

加载内置模型

使用 AI 辅助标注前,需要先加载模型。点击左侧工具栏中的 AI 按钮,或按 Ctrl+A 打开模型面板。

从模型下拉列表中选择模型后,应用会检查 ~/xanylabeling_data/models/${model_name} 中是否已有模型文件;存在时直接加载,否则自动下载到该目录。使用 --work-dir 时,数据目录位于指定工作目录下。

内置模型通常从配置文件指定的 URL 下载,部分模型也可切换至 ModelScope 下载源。请确保当前网络可以访问对应地址。

对由于网络问题未能成功加载模型的用户,可选择离线下载并手动加载模型或修改模型下载源。

离线下载模型

  • 打开模型列表,找到目标模型对应的配置文件。
  • 编辑配置文件,修改模型路径,并根据需要选择性地修改其他超参数。
  • 打开工具界面,点击加载自定义模型,选择配置文件所在路径即可。

修改模型下载源

详情参见《用户手册》中的模型下载源配置

加载已适配的用户自定义模型

已适配模型是指 X-AnyLabeling 已实现推理代码的模型。使用这类模型时,只需准备模型文件和配置文件。适配模型参见模型列表

本教程中,我们以 YOLOv5s 模型为例,详细介绍如何加载自定义模型。

a. 模型转换

假设已经在本地训练好模型,可先将 PyTorch 权重导出为 X-AnyLabeling 默认使用的 ONNX 格式:

python export.py --weights yolov5s.pt --include onnx

导出参数应与所选模型适配器的输入和输出约定一致。除非对应实现明确支持动态尺寸,否则建议使用固定输入尺寸。

此外,强烈建议通过 Netron 在线工具导入上一步导出的 *.onnx 文件,检查输入和输出节点信息,确保维度等信息符合预期。

Netron

b. 模型配置

准备好 ONNX 文件后,在模型列表中找到并复制对应模型的配置文件。

yolov5s.yaml 为例,其内容如下:

type: yolov5
name: yolov5s-r20230520
provider: Ultralytics
display_name: YOLOv5s
model_path: https://github.com/CVHub520/X-AnyLabeling/releases/download/v0.1.0/yolov5s.onnx
iou_threshold: 0.45
conf_threshold: 0.25
max_det: 300
classes:
  - person
  - bicycle
  - car
  ...
字段描述是否可修改
type模型类型标识,不支持自定义
name模型配置文件的索引名称,保留默认值即可
provider模型提供商,可根据实际情况修改✔️
display_name在界面上模型下拉列表中显示的名称,可自行修改✔️
model_path模型加载路径,支持相对路径和绝对路径✔️
iou_threshold用于非极大值抑制的交并比阈值✔️
conf_threshold用于非极大值抑制的置信度阈值✔️
max_det最大检测框数量✔️
classes模型的标签列表,需与训练时的标签列表一致✔️

需要注意的是,以上字段并非所有模型都适用,具体可参考对应模型的定义。

例如,我们可以看下 YOLO 模型的实现,其额外提供了以下可选配置项:

字段描述
filter_classes指定推理时使用的类别
agnostic是否使用类别无关的 NMS

一个典型的参考示例如下:

type: yolov5
name: yolov5s-r20230520
provider: Ultralytics
display_name: YOLOv5s
model_path: https://github.com/CVHub520/X-AnyLabeling/releases/download/v0.1.0/yolov5s.onnx
iou_threshold: 0.60
conf_threshold: 0.25
agnostic: True
filter_classes:
  - person
  - car
classes:
  - person
  - bicycle
  - car
  - ...

特别地,当且仅当使用低版本的 YOLOv5(v5.0 及以下)时,需要在配置文件中指定 anchorsstride 字段,否则请务必不要指定这些字段,以免造成模型推理错误。示例如下:

type: yolov5
...
stride: 32
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

Tip

  1. 对于分割模型,可指定 epsilon_factor 参数来控制输出轮廓点的平滑程度,默认值为 0.005
  2. 对于 YOLO26 系列模型,如果导出的 ONNX 文件已经包含 NMS 后处理,请继承 YOLO11 模板进行适配;默认的 YOLO26 模板适用于 nms-free 输出。

可选:切换 YOLO 推理后端(engine 字段)

对于 YOLO 系列模型,还可以在配置文件中通过 engine 字段切换推理后端。该字段属于模型配置的一部分,通常与 model_path 一起修改:

取值说明依赖
ort默认值,使用 ONNX Runtime 推理 (*.onnx)内置
dnn使用 OpenCV DNN 推理 (*.onnx)内置
trt使用 NVIDIA TensorRT 推理 (*.engine)需额外安装 TensorRT 运行时依赖

TensorRT 不属于 X-AnyLabeling 的默认依赖,仅在希望以 TensorRT 后端加速 NVIDIA GPU 推理时才需要安装。如未安装相关依赖,软件其他功能不会受到影响。

使用 TensorRT 推理时,还需要额外完成以下准备:

  • 环境准备

请先确认本机已正确安装 NVIDIA 驱动和 CUDA,然后在 X-AnyLabeling 所在的 Python 环境中安装 TensorRT 运行时依赖:

uv pip install tensorrt cuda-python

Note

如果未使用 uv 管理环境,也可以将上述命令替换为 pip install tensorrt cuda-python。请确保所安装的 tensorrt 版本与本地 CUDA 版本兼容;用于推理的 *.engine 文件必须使用相同主版本的 TensorRT 在相同 GPU 架构下导出,否则反序列化会失败。

  • 准备 .engine 文件

YOLO26 模型为例,可参考官方手册 Ultralytics YOLO26 导出 TensorRT 后端模型文件。

导出的 .engine 文件会自带一段 Ultralytics 写入的 JSON 元数据头,X-AnyLabeling 已自动兼容,无需手工剥离。

  • 配置模型

参考 yolo26s_trt.yaml 配置,将 model_path 指向 .engine 文件,并显式指定 engine: trt

type: yolo26
model_path: /path/to/yolo26s.engine
engine: trt

随后按照离线下载模型的流程,通过加载自定义模型导入该 YAML 文件,即可使用 TensorRT 推理。

c. 模型加载

了解完上述内容后,修改配置文件中的 model_path 字段,并根据需要选择性地修改其他超参数即可。

目前软件支持 相对路径绝对路径 两种模型加载方式,用户在填写模型路径时,注意避免路径中转义字符的影响。

最后,在界面上方菜单栏中的模型下拉框列表中,找到 ...加载自定义模型 选项,然后导入上一步准备的配置文件即可完成自定义模型加载。

加载未适配的用户自定义模型

未适配模型指还未在 X-AnyLabeling 中适配过的模型,需要用户自行参考以下实施步骤进行集成。

这里以多类别语义分割模型 U-Net 为例,可遵循以下实施步骤:

a. 训练及导出模型

导出 ONNX 模型,确保输出节点的维度为 [1, C, H, W],其中 C 为总的类别数(包含背景类)。

ONNX 并非唯一可用格式,也可以根据适配器需要使用 PyTorch、OpenVINO 或 TensorRT。以 SAM 2 视频目标追踪为例,可参考安装指南配置文件推理实现

b. 定义配置文件

首先,在配置文件目录下新增 unet.yaml

type: unet
name: unet-r20250101
display_name: U-Net (ResNet34)
provider: xxx
conf_threshold: 0.5
model_path: /path/to/best.onnx
classes:
  - cat
  - dog
  - _background_

其中:

字段描述
type指定模型类型,确保与现有模型类型不重复,以维护模型标识的唯一性。
name定义模型索引,用于内部引用和管理,避免与现有模型的索引名称冲突。
display_name显示在用户界面中的模型名称,不得与其他模型重名。

以上三个字段不可省略。还可根据需要添加模型提供商、模型路径和模型超参数等字段。

c. 添加配置文件

其次,将上述配置文件添加到模型管理文件中:

...

- model_name: "unet-r20250101"
  config_file: ":/unet.yaml"
...

d. 配置 UI 组件

根据模型需要,将模型类型添加到 auto_labeling/init.py 中对应的 UI 控件列表。

e. 定义推理服务

在定义推理服务的过程中,继承 Model 基类是关键步骤之一,它允许你实现特定于模型的前向推理逻辑。

具体地,你可以在模型推理服务目录下新建一个 unet.py 文件,参考示例如下:

import logging
import os

import cv2
import numpy as np
from PyQt6 import QtCore
from PyQt6.QtCore import QCoreApplication

from anylabeling.app_info import __preferred_device__
from anylabeling.views.labeling.shape import Shape
from anylabeling.views.labeling.utils.opencv import qt_img_to_rgb_cv_img
from .model import Model
from .types import AutoLabelingResult
from .engines.build_onnx_engine import OnnxBaseModel


class UNet(Model):
    """Semantic segmentation model using UNet"""

    class Meta:
        required_config_names = [
            "type",
            "name",
            "display_name",
            "model_path",
            "classes",
        ]
        widgets = ["button_run"]
        output_modes = {
            "polygon": QCoreApplication.translate("Model", "Polygon"),
        }
        default_output_mode = "polygon"

    def __init__(self, model_config, on_message) -> None:
        # Run the parent class's init method
        super().__init__(model_config, on_message)
        model_name = self.config["type"]
        model_abs_path = self.get_model_abs_path(self.config, "model_path")
        if not model_abs_path or not os.path.isfile(model_abs_path):
            raise FileNotFoundError(
                QCoreApplication.translate(
                    "Model",
                    f"Could not download or initialize {model_name} model.",
                )
            )
        self.net = OnnxBaseModel(model_abs_path, __preferred_device__)
        self.classes = self.config["classes"]
        self.input_shape = self.net.get_input_shape()[-2:]

    def preprocess(self, input_image):
        input_h, input_w = self.input_shape
        image = cv2.resize(input_image, (input_w, input_h))
        image = np.transpose(image, (2, 0, 1))
        image = image.astype(np.float32) / 255.0
        image = (image - 0.5) / 0.5
        image = np.expand_dims(image, axis=0)
        return image

    def postprocess(self, image, outputs):
        n, c, h, w = outputs.shape
        image_height, image_width = image.shape[:2]
        # Obtain the category index of each pixel
        # target shape: (1, h, w)
        outputs = np.argmax(outputs, axis=1)
        results = []
        for i in range(c):
            # Skip the background label
            if self.classes[i] == '_background_':
                continue
            # Get the category index of each pixel for the first batch by adding [0].
            mask = outputs[0] == i
            # Rescaled to original shape
            mask_resized = cv2.resize(mask.astype(np.uint8), (image_width, image_height))
            # Get the contours
            contours, _ = cv2.findContours(mask_resized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            # Append the contours along with their respective class labels
            results.append((self.classes[i], [np.squeeze(contour).tolist() for contour in contours]))
        return results

    def predict_shapes(self, image, image_path=None):
        if image is None:
            return []

        try:
            image = qt_img_to_rgb_cv_img(image, image_path)
        except Exception as e:  # noqa
            logging.warning("Could not inference model")
            logging.warning(e)
            return []

        blob = self.preprocess(image)
        outputs = self.net.get_ort_inference(blob)
        results = self.postprocess(image, outputs)
        shapes = []
        for item in results:
            label, contours = item
            for points in contours:
                # Make sure to close
                points += points[0]
                shape = Shape(flags={})
                for point in points:
                    shape.add_point(QtCore.QPointF(point[0], point[1]))
                shape.shape_type = "polygon"
                shape.closed = True
                shape.fill_color = "#000000"
                shape.label = label
                shape.selected = False
                shapes.append(shape)

        result = AutoLabelingResult(shapes, replace=True)
        return result

    def unload(self):
        del self.net

这里:

  • 元数据 Meta 类中:
    • required_config_names:用于指定模型配置文件中必须包含的配置项,确保模型推理服务能够正确初始化。
    • widgets:指定模型推理服务中需要显示的控件,如按钮、下拉框等,具体可参考此 文件 中的定义。
    • output_modes:指定模型推理服务中输出的形状类型,支持多边形、矩形和旋转框等。
    • default_output_mode:指定模型推理服务中默认的输出形状类型。
  • predict_shapesunload 均属于抽象方法,分别用于定义模型推理过程和模型资源释放逻辑,因此一定需要实现。

f. 添加至模型管理

完成上述步骤后,将模型类型(如 unet)添加到 auto_labeling/init.py_CUSTOM_MODELS 列表,并根据需要加入相应的 UI 控件列表。

提示: 如果你不知道如何实现对应的控件,可打开搜索面板,输入相应关键字,查看所有可用控件的实现逻辑。

最后,移步至 模型管理类文件 中,在 _load_model 方法中按照如下方式初始化你的实例:

...

class ModelManager(QObject):
    """Model manager"""

    def __init__(self):
        ...
    ...
    def _load_model(self, model_id):
        """Load and return model info"""
        if self.loaded_model_config is not None:
            self.loaded_model_config["model"].unload()
            self.loaded_model_config = None
            self.auto_segmentation_model_unselected.emit()

        model_config = copy.deepcopy(self.model_configs[model_id])
        if model_config["type"] == "yolov5":
            ...
        elif model_config["type"] == "unet":
            from .unet import UNet

            try:
                model_config["model"] = UNet(
                    model_config, on_message=self.new_model_status.emit
                )
                self.auto_segmentation_model_unselected.emit()
            except Exception as e:  # noqa
                self.new_model_status.emit(
                    self.tr(
                        "Error in loading model: {error_message}".format(
                            error_message=str(e)
                        )
                    )
                )
                print(
                    "Error in loading model: {error_message}".format(
                        error_message=str(e)
                    )
                )
                return
          ...
    ...

Note

模型类型必须与 b. 定义配置文件中的 type 字段一致。如果模型使用 SAM 交互模式,应触发 self.auto_segmentation_model_selected,而不是 self.auto_segmentation_model_unselected

模型导出

本章节将向您展示一些将自定义模型转换为 ONNX 模型的具体示例,以便您快速集成到 X-AnyLabeling 中。

更多模型导出示例请参考 tools/onnx_exporter 目录。

图像分类

InternImage

InternImage 引入了一个大规模卷积神经网络 (CNN) 模型,利用可变形卷积作为核心操作符,以实现大的有效感受野、自适应空间聚合和减少的归纳偏置,从而从大量数据中学习到更强、更鲁棒的模式。它在基准测试中超越了当前的 CNN 和视觉Transformer。

属性
论文标题InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions
发表单位上海人工智能实验室,清华大学,南京大学等
发表时间CVPR'23

请参考此 教程

PersonAttribute

本教程为用户提供了一种使用 PaddleClas PULC (实用超轻量图像分类) 快速构建轻量、高精度和实用的人员属性分类模型的方法。该模型可广泛用于行人分析场景、行人跟踪场景等。

请参考此 教程

VehicleAttribute

本教程为用户提供了一种使用 PaddleClas PULC (实用超轻量图像分类) 快速构建轻量、高精度和实用的车辆属性分类模型的方法。该模型可广泛用于车辆识别、道路监控等场景。

请参考此 教程

目标检测

RF-DETR

RF-DETR 是第一个在 Microsoft COCO 基准测试中超过 60 AP 的实时模型,同时在小尺寸模型中表现出色。它还在 RF100-VL 上实现了最先进的性能,这是一个衡量模型对现实世界问题适应能力的对象检测基准。RF-DETR 的性能与当前的实时目标检测模型相当。

机构: Roboflow

请参考此 教程

YOLOv5_OBB

作者: Kaixuan Hu

请参考此 教程

YOLOv7

属性
论文标题YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
发表单位台湾中央研究院信息科学研究所
python export.py --weights yolov7.pt --img-size 640 --grid

注意: 运行此命令时必须包含 --grid 参数。

Gold-YOLO

属性
论文标题Efficient object detectors including Gold-YOLO
发表单位华为诺亚
发表时间NeurIPS'23
git clone https://github.com/huawei-noah/Efficient-Computing.git
cd Detection/Gold-YOLO
python deploy/ONNX/export_onnx.py --weights Gold_n_dist.pt --simplify --ort

DAMO-YOLO

DAMO-YOLO 是由阿里巴巴达摩院数据分析与智能实验室的 TinyML 团队开发的一种快速准确的目标检测方法。它通过引入新的技术,包括神经架构搜索 (NAS) 主干网、高效的重参数化通用-FPN (RepGFPN)、轻量级头部和 AlignedOTA 标签分配,并进行蒸馏增强,使其性能超过了最新的 YOLO 系列。更多细节请参阅 Arxiv 报告。这里不仅可以找到强大的模型,还可以找到从训练到部署的高效训练策略和完整工具。

属性
论文标题DAMO-YOLO: A Report on Real-Time Object Detection
发表单位阿里巴巴集团
发表时间Arxiv'22
git clone https://github.com/tinyvision/DAMO-YOLO.git
cd DAMO-YOLO
python tools/converter.py -f configs/damoyolo_tinynasL25_S.py -c damoyolo_tinynasL25_S.pth --batch_size 1 --img_size 640

RT-DETR

实时检测变换器 (RT-DETR,又称 RTDETR) 是已知的第一个实时端到端目标检测器。RT-DETR-L 在 COCO val2017 上达到了 53.0% AP,并在 T4 GPU 上达到了 114 FPS,而 RT-DETR-X 达到了 54.8% AP 和 74 FPS,速度和准确性都超过了同规模的所有 YOLO 检测器。此外,RT-DETR-R50 达到了 53.1% AP 和 108 FPS,准确性比 DINO-Deformable-DETR-R50 高 2.2% AP,FPS 快约 21 倍。

属性
论文标题RT-DETR: DETRs Beat YOLOs on Real-time Object Detection
发表单位百度
发表时间Arxiv'22

请参考此 文章

Hyper-YOLO

Hyper-YOLO 是一种新型目标检测方法,通过集成超图计算来捕获视觉特征之间的复杂高阶关联。该模型引入了超图计算增强的语义收集和散射(HGC-SCS)框架,将视觉特征图转换到语义空间并构建超图以进行高阶信息传播。

属性
论文标题Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation
发表单位清华大学,西安交通大学
发表时间TAPMI'25

下载模型,安装依赖后,修改Hyper-YOLO/ultralytics/export.py文件,设置batch=1half=False

import sys
import os
sys.path.append(os.getcwd())
from pathlib import Path
from ultralytics import YOLO

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import torch
torch.cuda.device_count.cache_clear()

if __name__ == '__main__':
    model = 'hyper-yolon-seg.pt'
    if isinstance(model, (str, Path)):
        model = YOLO(model)
    filename = model.export(imgsz=640, batch=1, format='ONNX', int8=False, half=False, device="0", verbose=False)

然后运行以下命令导出即可:

python3 ultralytics/utils/export_onnx.py

D-FINE

D-FINE是一款强大的实时目标检测器,它将DETR中的边界框回归任务重新定义为细粒度分布优化(FDR),并引入全局最优定位自蒸馏(GO-LSD),在不增加额外推理和训练成本的情况下实现了卓越性能。

属性
论文标题D-FINE: Redefine Regression Task of DETRs as Fine-grained Distribution Refinement
发表单位中国科学技术大学
发表时间ICLR'25 Spotlight

请参考导出脚本

DEIMv2

DEIMv2 是 DEIM 框架的进化版本,同时利用了 DINOv3 的丰富特征。该方法设计了从超轻量级版本到 S、M、L 和 X 等不同规模的模型,以适应各种应用场景。在这些变体中,DEIMv2 都达到了最先进的性能,其中 S 级模型在具有挑战性的 COCO 基准测试中显著超过了 50 AP。

属性
论文标题Real-Time Object Detection Meets DINOv3
发表单位英特灵达 & 厦门大学
发表时间Arxiv'25

请参考导出脚本

Segment Anything 系列

SAM

分割一切模型 (SAM) 从输入提示(如点或框)中生成高质量的物体掩码。它可用于生成图像中所有物体的掩码,并在 1100 万张图像和 11 亿个掩码的数据集上进行了训练。SAM 在各种分割任务中具有强大的零样本性能。

属性
论文标题Segment Anything
发表单位Meta AI 研究院,FAIR
发表时间ICCV'23

请参考这些 步骤

Efficient-SAM

EfficientViT 是一系列新的视觉模型,用于高效的高分辨率密集预测。它使用一种新的轻量级多尺度线性注意模块作为核心构建模块。该模块仅通过硬件高效操作实现全局感受野和多尺度学习。

属性
论文标题EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction
发表单位麻省理工学院
发表时间ICCV'23

请参考这些 步骤

SAM-Med2D

SAM-Med2D 是为解决将最先进的图像分割技术应用于医学图像挑战而开发的专业模型。

属性
论文标题SAM-Med2D
发表单位OpenGVLab
发表时间Arxiv'23

请参考这些 步骤

HQ-SAM

HQ-SAM 是增强版的任意物体分割模型 (SAM),旨在提高掩码预测质量,特别是针对复杂结构,同时保持 SAM 的效率和零样本能力。它通过改进的解码过程和在专用数据集上的额外训练来实现这一目标。

属性
论文标题Segment Anything in High Quality
发表单位苏黎世联邦理工学院和香港科技大学
发表时间NeurIPS'23

请参考此 教程

EdgeSAM

EdgeSAM 是适用于边缘设备的 SAM 加速变体。根据其论文报告,它比原版 SAM 快 40 倍,在边缘设备上比 MobileSAM 快 14 倍,同时在 COCO 和 LVIS 数据集上的 mIoU 分别提高 2.3 和 3.2,并可在 iPhone 14 上达到 30 FPS 以上。

属性
论文标题Prompt-In-the-Loop Distillation for On-Device Deployment of SAM
发表单位南洋理工大学 S-Lab,上海人工智能实验室
发表时间Arxiv'23

请参考此 教程

Grounding

Grounding DINO

Grounding DINO 是一款最先进的 (SOTA) 零样本目标检测模型,擅长检测训练中未定义的物体。其独特的能力使其能够适应新物体和场景,使其在现实世界应用中具有高度的多样性。它在指称表达理解 (REC) 方面表现出色,能够基于文本描述识别和定位图像中的特定物体或区域。Grounding DINO 简化了目标检测,通过消除手工设计的组件(如非极大值抑制 (NMS)),简化了模型架构,增强了效率和性能。

属性
论文标题Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection
发表单位IDEA-CVR,IDEA-Research
发表时间Arxiv'23

请参考此 教程

YOLO-World

YOLO-World 通过引入视觉语言建模来增强 YOLO 系列,实现高效的开放场景目标检测,在各种任务中表现出色。

属性
论文标题Real-Time Open-Vocabulary Object Detection
发表单位腾讯人工智能实验室,ARC 实验室,腾讯 PCG,华中科技大学
发表时间Arxiv'24
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
yolo export model=yolov8s-worldv2.pt format=onnx opset=13 simplify

GeCo

GeCo 是一种统一架构的少样本计数器,通过新颖的密集查询和计数损失,实现了高精度的目标检测、分割和计数。

属性
论文标题A Novel Unified Architecture for Low-Shot Counting by Detection and Segmentation
发表单位卢布尔雅那大学
发表时间NeurIPS'24

请参考此 教程

图像标签

Recognize Anything

RAM 是一款以其卓越图像识别能力著称的强大图像打标签模型。RAM 在零样本泛化方面表现出色,具有成本效益高和可复现的优点,依赖于开源和无注释数据集。RAM 的灵活性使其适用于广泛的应用场景,成为各种图像识别任务中的宝贵工具。

属性
论文标题Recognize Anything: A Strong Image Tagging Model
发表单位OPPO 研究院,IDEA-Research,AI Robotics
发表时间Arxiv'23

请参考此 教程