MM Grounding Dino Large模型导出与ONNX部署教程

MM Grounding Dino Large模型导出与ONNX部署教程

【免费下载链接】mm_grounding_dino_large_o365v2_oiv6_goldg 【免费下载链接】mm_grounding_dino_large_o365v2_oiv6_goldg 项目地址: https://ai.gitcode.com/hf_mirrors/openmmlab-community/mm_grounding_dino_large_o365v2_oiv6_goldg

引言

在计算机视觉领域,目标检测(Object Detection)是一项基础且关键的任务,它旨在识别图像中感兴趣的物体并确定其位置。随着深度学习技术的快速发展,目标检测模型的性能不断提升,但模型的部署复杂度也随之增加。ONNX(Open Neural Network Exchange)作为一种开放的神经网络模型格式,能够实现不同深度学习框架之间的模型互操作性,并为模型部署提供了统一的解决方案。

MM Grounding Dino Large模型是一款性能优异的目标检测模型,在COCO数据集上实现了53.0的mAP(mean Average Precision),具有较高的检测精度。本教程将详细介绍如何将MM Grounding Dino Large模型导出为ONNX格式,并实现ONNX部署,帮助开发者解决模型部署过程中的痛点问题,提高模型在实际应用中的运行效率。

模型概述

MM Grounding Dino Large模型是基于MM Grounding DINO框架开发的大尺寸变体模型。该模型在原始Grounding DINO的基础上进行了改进,通过优化对比类头(contrastive class head)和去除解码器中的参数共享,显著提升了零样本目标检测(zero-shot object detection)性能。

模型特点

  • 高性能:在COCO数据集上的零样本目标检测mAP达到53.0,相比其他同类模型具有明显优势。
  • 多数据集训练:模型训练数据包括Objects365v2Open Images v6GOLD-G,具有较强的泛化能力。
  • 支持零样本检测:能够在没有见过特定类别训练样本的情况下,对该类别物体进行检测。

项目文件结构

MM Grounding Dino Large模型的Hugging Face镜像仓库包含以下关键文件:

  • config.json:模型配置文件,包含模型的结构参数、超参数等信息。
  • model.safetensors:模型权重文件,采用Safetensors格式存储,具有高效和安全的特点。
  • preprocessor_config.json:预处理器配置文件,定义了图像和文本的预处理方式。
  • special_tokens_map.json:特殊 tokens 映射文件,用于处理文本输入中的特殊标记。
  • tokenizer_config.json:分词器配置文件,包含分词器的相关参数。
  • vocab.txt:词汇表文件,包含模型使用的词汇集合。
  • README.md:项目说明文档,提供了模型的基本信息、使用示例等内容。

模型导出为ONNX格式

导出前准备

在将MM Grounding Dino Large模型导出为ONNX格式之前,需要确保以下环境依赖已安装:

  • Python 3.8+
  • PyTorch 1.10+
  • Transformers 4.20+
  • ONNX 1.10+
  • ONNX Runtime 1.10+

可以使用以下命令安装所需的Python库:

pip install torch transformers onnx onnxruntime

导出步骤

以下是将MM Grounding Dino Large模型导出为ONNX格式的详细步骤:

  1. 加载模型和处理器

    使用Transformers库加载MM Grounding Dino Large模型和对应的处理器(processor)。

    from transformers import AutoModelForZeroShotObjectDetection, AutoProcessor
    
    model_id = "hf_mirrors/openmmlab-community/mm_grounding_dino_large_o365v2_oiv6_goldg"
    model = AutoModelForZeroShotObjectDetection.from_pretrained(model_id)
    processor = AutoProcessor.from_pretrained(model_id)
    
  2. 准备输入示例

    为模型导出准备示例输入,包括图像和文本。

    import torch
    from PIL import Image
    import requests
    from io import BytesIO
    
    # 加载示例图像
    image_url = "http://images.cocodataset.org/val2017/000000039769.jpg"
    response = requests.get(image_url)
    image = Image.open(BytesIO(response.content)).convert("RGB")
    
    # 准备文本标签
    text_labels = [["a cat", "a remote control"]]
    
    # 预处理输入
    inputs = processor(images=image, text=text_labels, return_tensors="pt")
    
  3. 定义导出函数

    创建一个函数,用于将模型导出为ONNX格式。在导出过程中,需要设置动态轴(dynamic axes)以支持不同大小的输入。

    def export_model_to_onnx(model, inputs, output_path):
        # 设置模型为评估模式
        model.eval()
    
        # 定义动态轴
        dynamic_axes = {
            "pixel_values": {0: "batch_size", 2: "height", 3: "width"},
            "input_ids": {0: "batch_size", 1: "sequence_length"},
            "attention_mask": {0: "batch_size", 1: "sequence_length"},
            "output_boxes": {0: "batch_size", 1: "num_boxes"},
            "output_scores": {0: "batch_size", 1: "num_boxes"},
            "output_labels": {0: "batch_size", 1: "num_boxes"}
        }
    
        # 导出模型
        torch.onnx.export(
            model,
            (inputs["pixel_values"], inputs["input_ids"], inputs["attention_mask"]),
            output_path,
            input_names=["pixel_values", "input_ids", "attention_mask"],
            output_names=["output_boxes", "output_scores", "output_labels"],
            dynamic_axes=dynamic_axes,
            opset_version=12
        )
    
  4. 执行导出

    调用导出函数,将模型导出为ONNX格式。

    output_onnx_path = "mm_grounding_dino_large.onnx"
    export_model_to_onnx(model, inputs, output_onnx_path)
    
  5. 验证ONNX模型

    导出完成后,可以使用ONNX Runtime加载模型并进行推理,验证模型的正确性。

    import onnxruntime as ort
    import numpy as np
    
    # 加载ONNX模型
    ort_session = ort.InferenceSession(output_onnx_path)
    
    # 准备输入数据(转换为NumPy数组)
    pixel_values = inputs["pixel_values"].cpu().numpy()
    input_ids = inputs["input_ids"].cpu().numpy()
    attention_mask = inputs["attention_mask"].cpu().numpy()
    
    # 运行推理
    ort_inputs = {
        "pixel_values": pixel_values,
        "input_ids": input_ids,
        "attention_mask": attention_mask
    }
    ort_outputs = ort_session.run(None, ort_inputs)
    
    # 解析输出
    output_boxes, output_scores, output_labels = ort_outputs
    print("ONNX模型输出 boxes shape:", output_boxes.shape)
    print("ONNX模型输出 scores shape:", output_scores.shape)
    print("ONNX模型输出 labels shape:", output_labels.shape)
    

ONNX模型部署

ONNX Runtime部署

ONNX Runtime是一个高性能的跨平台推理引擎,支持ONNX模型的高效部署。以下是使用ONNX Runtime部署MM Grounding Dino Large ONNX模型的步骤:

  1. 安装ONNX Runtime

    根据目标平台选择合适的ONNX Runtime安装包。例如,对于CPU版本:

    pip install onnxruntime
    

    对于GPU版本(需要CUDA支持):

    pip install onnxruntime-gpu
    
  2. 加载ONNX模型和处理器

    import onnxruntime as ort
    from transformers import AutoProcessor
    from PIL import Image
    import numpy as np
    
    # 加载ONNX模型
    onnx_model_path = "mm_grounding_dino_large.onnx"
    ort_session = ort.InferenceSession(onnx_model_path)
    
    # 加载处理器
    processor = AutoProcessor.from_pretrained("hf_mirrors/openmmlab-community/mm_grounding_dino_large_o365v2_oiv6_goldg")
    
  3. 图像预处理

    def preprocess_image(image_path):
        image = Image.open(image_path).convert("RGB")
        inputs = processor(images=image, return_tensors="np")
        return inputs
    
  4. 文本预处理

    def preprocess_text(text_labels):
        # 文本标签需要包装在列表中
        inputs = processor(text=text_labels, return_tensors="np", padding=True, truncation=True)
        return inputs
    
  5. 执行推理

    def infer(image_path, text_labels, threshold=0.4):
        # 预处理输入
        image_inputs = preprocess_image(image_path)
        text_inputs = preprocess_text(text_labels)
    
        # 准备ONNX输入
        ort_inputs = {
            "pixel_values": image_inputs["pixel_values"],
            "input_ids": text_inputs["input_ids"],
            "attention_mask": text_inputs["attention_mask"]
        }
    
        # 运行推理
        ort_outputs = ort_session.run(None, ort_inputs)
        output_boxes, output_scores, output_labels = ort_outputs
    
        # 后处理:过滤低置信度检测结果
        valid_indices = np.where(output_scores >= threshold)[1]
        if len(valid_indices) == 0:
            return []
    
        valid_boxes = output_boxes[0, valid_indices]
        valid_scores = output_scores[0, valid_indices]
        valid_labels = [text_labels[0][i] for i in output_labels[0, valid_indices].astype(int)]
    
        # 整理结果
        results = []
        for box, score, label in zip(valid_boxes, valid_scores, valid_labels):
            box = [round(x, 2) for x in box.tolist()]
            results.append({
                "label": label,
                "score": round(score.item(), 3),
                "box": box
            })
    
        return results
    
  6. 使用示例

    # 图像路径和文本标签
    image_path = "test_image.jpg"
    text_labels = [["a cat", "a remote control", "a book"]]
    
    # 执行推理
    results = infer(image_path, text_labels, threshold=0.4)
    
    # 打印检测结果
    for result in results:
        print(f"Detected {result['label']} with confidence {result['score']} at location {result['box']}")
    

部署优化

为了进一步提高ONNX模型的部署性能,可以考虑以下优化方法:

  1. 模型量化:使用ONNX Runtime的量化工具对模型进行量化,将模型参数从FP32转换为INT8或FP16,减少模型大小和推理时间。

    from onnxruntime.quantization import quantize_dynamic, QuantType
    
    quantized_model_path = "mm_grounding_dino_large_quantized.onnx"
    quantize_dynamic(
        model_input=onnx_model_path,
        model_output=quantized_model_path,
        op_types_to_quantize=["MatMul", "Add"],
        weight_type=QuantType.INT8
    )
    
  2. 图优化:ONNX Runtime会自动对模型进行图优化,但也可以通过设置会话选项来启用更高级的优化。

    sess_options = ort.SessionOptions()
    sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
    ort_session = ort.InferenceSession(onnx_model_path, sess_options)
    
  3. 并行推理:对于批量输入,可以利用ONNX Runtime的并行处理能力,提高推理效率。

总结与展望

本教程详细介绍了MM Grounding Dino Large模型的导出与ONNX部署过程。通过将模型导出为ONNX格式,我们可以利用ONNX Runtime等高性能推理引擎,实现模型在不同平台上的高效部署。

MM Grounding Dino Large模型作为一款优秀的目标检测模型,具有较高的检测精度和泛化能力。通过ONNX部署,能够进一步发挥其在实际应用中的价值,例如在智能监控、自动驾驶、机器人视觉等领域。

未来,随着深度学习技术的不断发展,模型的部署方法也将不断创新。我们可以期待更多高效、灵活的模型部署方案,以满足不同场景的需求。同时,MM Grounding Dino系列模型也可能会推出更多改进版本,进一步提升性能和易用性。

希望本教程能够帮助开发者顺利完成MM Grounding Dino Large模型的导出与部署工作。如果在实践过程中遇到问题,可以参考项目的README.md文档或查阅相关技术资料获取更多帮助。

【免费下载链接】mm_grounding_dino_large_o365v2_oiv6_goldg 【免费下载链接】mm_grounding_dino_large_o365v2_oiv6_goldg 项目地址: https://ai.gitcode.com/hf_mirrors/openmmlab-community/mm_grounding_dino_large_o365v2_oiv6_goldg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值