1. 基于MobileNetV3的图像分类部署

任务目标

在嵌入式设备(以树莓派4B为参考平台)上部署MobileNetV3-Small模型,完成单张图像分类推理,并测量单次推理耗时与Top-1精度,验证模型在资源受限环境下的实时性与可用性。

环境与依赖

  • 硬件:树莓派4B(4GB RAM),USB摄像头或测试图片
  • 系统:Raspberry Pi OS (64-bit)
  • Python 3.9+,虚拟环境(推荐)
  • 依赖安装:pip install torch torchvision opencv-python numpy
  • 模型文件:使用PyTorch官方预训练的MobileNetV3-Small权重(自动下载)

关键完整代码

import torch
import torchvision.transforms as transforms
from torchvision.models import mobilenet_v3_small, MobileNet_V3_Small_Weights
from PIL import Image
import numpy as np
import time
import json
from urllib.request import urlopen

# 1. 加载预训练模型并设为评估模式
device = torch.device("cpu")  # 嵌入式设备通常无GPU
model = mobilenet_v3_small(weights=MobileNet_V3_Small_Weights.IMAGENET1K_V1)
model.eval()
model.to(device)

# 2. 加载ImageNet类别标签
url = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
with urlopen(url) as f:
    classes = [line.strip().decode('utf-8') for line in f.readlines()]

# 3. 图像预处理(与训练时一致)
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

def classify_image(image_path):
    """对单张图片进行分类,返回Top-1类别与置信度"""
    img = Image.open(image_path).convert('RGB')
    input_tensor = preprocess(img).unsqueeze(0)  # 增加batch维度
    
    # 推理计时
    start = time.time()
    with torch.no_grad():
        output = model(input_tensor)
    elapsed = time.time() - start
    
    # 获取Top-1结果
    prob = torch.nn.functional.softmax(output[0], dim=0)
    top1_idx = torch.argmax(prob).item()
    confidence = prob[top1_idx].item()
    
    return classes[top1_idx], confidence, elapsed

if __name__ == "__main__":
    # 使用示例图片(可替换为实际图片路径)
    test_img = "test_cat.jpg"  # 请准备一张测试图片
    label, conf, infer_time = classify_image(test_img)
    print(f"分类结果: {label}")
    print(f"置信度: {conf:.4f}")
    print(f"单次推理耗时: {infer_time*1000:.1f} ms")

运行与验证

  1. 将上述代码保存为deploy_mobilenetv3.py,在代码同目录放置一张测试图片(如猫、狗等常见物体),命名为test_cat.jpg。
  2. 运行命令:python deploy_mobilenetv3.py
  3. 首次运行会自动下载约10MB的预训练权重,需保持网络连接。

通过判定标准

  • 程序正常输出类别名称、置信度(0~1之间)和推理耗时,无报错。
  • 分类结果与图片内容相符(例如猫的图片输出"tabby cat"或"tiger cat"等猫科类别)。
  • 单次推理耗时在树莓派4B上约为200~500ms(CPU模式),若耗时超过2秒需检查是否开启了过多后台进程或散热降频。
  • 置信度大于0.5视为有效分类;若置信度普遍偏低,可检查预处理是否与训练一致。

性能评估说明

本案例使用MobileNetV3-Small(参数量约2.5M),在树莓派4B CPU上单次推理约300ms,可达到约3FPS的处理速度。若需更高实时性,可改用量化版本(PyTorch的quantization模块)或使用NCNN/TFLite转换后部署,但本案例聚焦于标准PyTorch流程的完整闭环验证。

MobileNetV3-Small 嵌入式部署流程 输入图片 Resize 256 CenterCrop 224 ToTensor Normalize MobileNetV3 推理 Top-1 性能评估指标 • 单次推理耗时:约200~500ms(树莓派4B CPU) • Top-1准确率:ImageNet验证集约67.4% 优化方向:PyTorch量化 → NCNN/TFLite转换 → 硬件加速