1. 端侧多模态模型基础环境搭建与验证

任务目标

在端侧Linux设备(如RK3588、Jetson Orin或x86工控机)上完成多模态模型运行环境搭建,安装Python依赖与推理引擎,并运行一个图像+文本输入→文本输出的迷你模型,验证全链路可用。

环境与依赖

  • 操作系统:Ubuntu 20.04/22.04(ARM64或x86_64均可)
  • Python:3.8~3.11
  • 推理引擎:ONNX Runtime(CPU版本即可,无需GPU)
  • 模型:mini-clip-vit-b-32(约90MB,纯CPU可跑)
  • 必要Python包:onnxruntime、numpy、Pillow、transformers、torch(仅用于加载tokenizer,推理走ONNX)

实现方案

采用CLIP ViT-B/32 + 简易文本解码的最小闭环:图像经ViT编码为向量,与候选文本(由CLIP文本编码器离线生成)计算余弦相似度,取最高者作为输出。该方案不依赖LLM解码器,端侧CPU单次推理约0.3~0.5秒,适合验证环境。

关键完整代码

# verify_multimodal_env.py
import numpy as np
import onnxruntime as ort
from PIL import Image
import torch
from transformers import CLIPTokenizer

# ========== 1. 加载ONNX模型 ==========
# 模型文件需提前下载(见下方命令)
vit_session = ort.InferenceSession("clip_vit_b32_image.onnx", providers=["CPUExecutionProvider"])
text_session = ort.InferenceSession("clip_vit_b32_text.onnx", providers=["CPUExecutionProvider"])

# ========== 2. 图像预处理(与CLIP原始预处理一致) ==========
def preprocess_image(img_path):
    img = Image.open(img_path).convert("RGB")
    img = img.resize((224, 224), Image.BICUBIC)
    img = np.array(img).astype(np.float32) / 255.0
    mean = np.array([0.48145466, 0.4578275, 0.40821073], dtype=np.float32)
    std = np.array([0.26862954, 0.26130258, 0.27577711], dtype=np.float32)
    img = (img - mean) / std
    img = np.transpose(img, (2, 0, 1))  # HWC -> CHW
    return np.expand_dims(img, axis=0).astype(np.float32)

# ========== 3. 文本编码(候选标签离线生成) ==========
tokenizer = CLIPTokenizer.from_pretrained("/clip-vit-base-patch32")
candidate_labels = ["a cat", "a dog", "a car", "a person"]
text_inputs = tokenizer(candidate_labels, padding=True, return_tensors="np")
text_features = text_session.run(None, {
    "input_ids": text_inputs["input_ids"],
    "attention_mask": text_inputs["attention_mask"]
})[0]
text_features = text_features / np.linalg.norm(text_features, axis=1, keepdims=True)

# ========== 4. 图像编码与相似度匹配 ==========
def predict(img_path):
    img_tensor = preprocess_image(img_path)
    img_feature = vit_session.run(None, {"pixel_values": img_tensor})[0]
    img_feature = img_feature / np.linalg.norm(img_feature, axis=1, keepdims=True)
    scores = np.dot(img_feature, text_features.T)[0]
    best_idx = np.argmax(scores)
    return candidate_labels[best_idx], float(scores[best_idx])

if __name__ == "__main__":
    # 用一张测试图验证(可用任意jpg图片)
    result = predict("test_image.jpg")
    print(f"识别结果: {result[0]}  置信度: {result[1]:.4f}")
    print("环境验证通过:ONNX Runtime + 图像/文本编码链路正常")

运行步骤

# 1. 安装依赖
pip install onnxruntime numpy Pillow transformers torch --extra-index-url https://download.pytorch.org/whl/cpu

# 2. 下载ONNX模型(约90MB)
wget https://example.com/models/clip_vit_b32_image.onnx
wget https://example.com/models/clip_vit_b32_text.onnx

# 3. 准备测试图片(任选一张本地图片)
# 将图片命名为 test_image.jpg 放在当前目录

# 4. 运行验证
python verify_multimodal_env.py

验证方法与判定标准

  • 通过条件:程序无报错退出,输出识别结果: xxx 置信度: 0.xxxx,且置信度大于0.5(说明图像与文本特征确实产生了有效匹配)。
  • 功能验证:将test_image.jpg换成一张猫的图片,若输出a cat且置信度最高,说明图像编码→文本匹配链路正确。
  • 性能参考:CPU推理单次应在1秒内完成(实际耗时取决于设备,不作为硬性指标)。

常见问题

  • 模型下载失败:可自行用HuggingFace的/clip-vit-base-patch32导出ONNX,或使用其他CLIP ONNX替代。
  • 内存不足:若设备内存小于2GB,可改用mini-clip-vit-b-32量化版(INT8),代码不变。
  • tokenizer加载慢:首次运行需联网下载tokenizer文件,之后会缓存到本地。