1. 本地环境搭建与模型加载

任务目标

在本案例中,你将在本地Python环境中完成以下闭环:安装PyTorch与TorchVision → 加载预训练的MobileNetV2图像分类模型 → 对一张真实图片执行推理 → 输出并解读Top-1预测结果。最终通过运行一个独立脚本验证模型可正确完成图像分类。

环境准备

需要Python 3.9+,并安装以下依赖(建议使用虚拟环境):

pip install torch torchvision pillow requests

若使用NVIDIA GPU且已配置CUDA,可安装对应版本的torch以加速推理;CPU版本同样可完成本案例全部步骤。

完整实现代码

将以下代码保存为 load_mobilenet.py。脚本会自动下载一张示例图片(一只柯基犬照片),加载预训练MobileNetV2模型,输出预测类别及置信度。

import json
from PIL import Image
import requests
import torch
from torchvision import models, transforms

# 1. 加载预训练模型并设为评估模式
model = models.mobilenet_v2(weights=models.MobileNet_V2_Weights.IMAGENET1K_V1)
model.eval()

# 2. 下载ImageNet类别标签(1,000类)
LABELS_URL = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
class_labels = requests.get(LABELS_URL).text.splitlines()

# 3. 图像预处理:与MobileNetV2训练时一致
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]),
])

# 4. 获取示例图片(柯基犬)
img_url = "https://raw.githubusercontent.com/pytorch/hub/master/images/dog.jpg"
img = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")

# 5. 推理
input_tensor = preprocess(img).unsqueeze(0)  # 增加batch维度
with torch.no_grad():
    output = model(input_tensor)

# 6. 解析Top-1结果
probabilities = torch.nn.functional.softmax(output[0], dim=0)
top1_prob, top1_idx = torch.topk(probabilities, 1)
predicted_label = class_labels[top1_idx.item()]

print(f"预测类别: {predicted_label}")
print(f"置信度: {top1_prob.item():.4f}")

运行方式

python load_mobilenet.py

首次运行会自动下载模型权重(约14MB)和示例图片,请保持网络畅通。

验证方法与通过标准

脚本执行成功后,控制台应输出类似以下内容(实际置信度可能略有浮动):

预测类别: Pembroke
置信度: 0.9382

通过条件:

  • 脚本无报错退出,且输出类别为Pembroke(彭布罗克威尔士柯基犬)或Cardigan(卡迪根威尔士柯基犬)——两者均为柯基犬品种,说明模型正确识别了图片内容。
  • 置信度大于0.5,表明模型对该预测有较高把握。

若输出为其他类别,请检查网络下载的图片是否完整、预处理步骤是否与代码一致。

常见问题

  • 网络受限:若无法访问raw.githubusercontent.com,可手动下载图片和标签文件到本地,将代码中对应URL替换为本地文件路径。
  • CPU推理较慢:首次推理包含模型初始化,属正常现象;后续推理会更快。
  • 内存不足:若设备内存较小,可将图片尺寸缩小(如Resize到192),但需同步调整CenterCrop尺寸以保持模型输入为224×224。