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")
运行与验证
- 将上述代码保存为
deploy_mobilenetv3.py,在代码同目录放置一张测试图片(如猫、狗等常见物体),命名为test_cat.jpg。 - 运行命令:
python deploy_mobilenetv3.py - 首次运行会自动下载约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流程的完整闭环验证。