MM Grounding Dino Large模型导出与ONNX部署教程
引言
在计算机视觉领域,目标检测(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,相比其他同类模型具有明显优势。
- 多数据集训练:模型训练数据包括Objects365v2、Open Images v6和GOLD-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格式的详细步骤:
-
加载模型和处理器
使用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) -
准备输入示例
为模型导出准备示例输入,包括图像和文本。
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") -
定义导出函数
创建一个函数,用于将模型导出为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 ) -
执行导出
调用导出函数,将模型导出为ONNX格式。
output_onnx_path = "mm_grounding_dino_large.onnx" export_model_to_onnx(model, inputs, output_onnx_path) -
验证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模型的步骤:
-
安装ONNX Runtime
根据目标平台选择合适的ONNX Runtime安装包。例如,对于CPU版本:
pip install onnxruntime对于GPU版本(需要CUDA支持):
pip install onnxruntime-gpu -
加载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") -
图像预处理
def preprocess_image(image_path): image = Image.open(image_path).convert("RGB") inputs = processor(images=image, return_tensors="np") return inputs -
文本预处理
def preprocess_text(text_labels): # 文本标签需要包装在列表中 inputs = processor(text=text_labels, return_tensors="np", padding=True, truncation=True) return inputs -
执行推理
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 -
使用示例
# 图像路径和文本标签 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模型的部署性能,可以考虑以下优化方法:
-
模型量化:使用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 ) -
图优化: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) -
并行推理:对于批量输入,可以利用ONNX Runtime的并行处理能力,提高推理效率。
总结与展望
本教程详细介绍了MM Grounding Dino Large模型的导出与ONNX部署过程。通过将模型导出为ONNX格式,我们可以利用ONNX Runtime等高性能推理引擎,实现模型在不同平台上的高效部署。
MM Grounding Dino Large模型作为一款优秀的目标检测模型,具有较高的检测精度和泛化能力。通过ONNX部署,能够进一步发挥其在实际应用中的价值,例如在智能监控、自动驾驶、机器人视觉等领域。
未来,随着深度学习技术的不断发展,模型的部署方法也将不断创新。我们可以期待更多高效、灵活的模型部署方案,以满足不同场景的需求。同时,MM Grounding Dino系列模型也可能会推出更多改进版本,进一步提升性能和易用性。
希望本教程能够帮助开发者顺利完成MM Grounding Dino Large模型的导出与部署工作。如果在实践过程中遇到问题,可以参考项目的README.md文档或查阅相关技术资料获取更多帮助。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



