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。