欢迎访问宙启技术站
智能推送

使用Python创建的torchvision.modelsmobilenet_v2图像分类模型

发布时间:2023-12-12 08:24:08

MobileNetV2 是一个轻量级的神经网络模型,适用于移动设备上的图像分类任务。它在保持较高的准确率的基础上,具有较小的模型大小和计算开销。在 Python 中,我们可以使用 torchvision.models 中的 mobilenet_v2 来创建并使用这个模型。

首先,我们需要安装 torchtorchvision 库。可以使用以下命令来安装:

pip install torch torchvision

接下来,我们可以使用以下代码创建一个 MobileNetV2 模型,并加载预训练的权重:

import torch
import torchvision.models as models

# 创建 MobileNetV2 模型
model = models.mobilenet_v2(pretrained=True)
model.eval()

# 定义输入
input_tensor = torch.randn(1, 3, 224, 224)  # 输入图像为 224x224 大小的 RGB 图像

# 运行模型
output = model(input_tensor)

# 解析输出结果
_, predicted_idx = torch.max(output, 1)

在上面的代码中,我们首先导入 torchtorchvision.models。然后,使用 mobilenet_v2 函数创建一个 MobileNetV2 模型,并加载预训练的权重。调用 eval() 方法将模型设置为评估模式。

接下来,我们定义输入张量 input_tensor,它的大小为 [batch_size, channels, height, width]。在这个例子中,我们创建了一个随机的输入张量来模拟一个图像输入。

然后,我们通过将输入张量传递给模型来运行模型。输出是一个包含模型预测的张量。在这个例子中,我们使用了 torch.max 函数找到预测中最大的值和其对应的索引。

现在,我们可以使用 predicted_idx 来得到预测的类别。可以使用相应的标签信息,如 ImageNet 标签,来解释这个类别。

下面是一个完整的使用示例,它加载了一个示例图像,并使用 MobileNetV2 进行图像分类:

import torch
import torchvision.models as models
import torchvision.transforms as transforms

# 加载示例图像
img_path = 'sample_image.jpg'
input_image = Image.open(img_path)

# 使用数据预处理
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]),
])

input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0)

# 检查是否有可用的 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 创建 MobileNetV2 模型并加载预训练的权重
model = models.mobilenet_v2(pretrained=True)
model = model.to(device)
model.eval()

# 将输入数据移动到 GPU
input_batch = input_batch.to(device)

# 运行模型
with torch.no_grad():
    output = model(input_batch)

# 将输出结果从 GPU 移到到 CPU
output = output.cpu()

# 解析输出结果
_, predicted_idx = torch.max(output, 1)

# 加载标签信息
labels_path = 'labels.txt'
with open(labels_path) as f:
    labels = f.readlines()

# 打印预测的类别
predicted_label = labels[predicted_idx.item()].strip()
print("预测的类别:", predicted_label)

在上面的代码中,我们首先导入了 torchtorchvision.modelstorchvision.transforms。然后,加载了一个示例图像,并使用 transforms 进行数据预处理,包括缩放、裁剪、正则化等操作。

接下来,检查是否有 GPU 可用,并将模型移动到对应设备上。然后,将输入数据移动到 GPU 完成模型的推理。

在推理过程中,我们使用了 with torch.no_grad() 来告诉 PyTorch 不需要计算梯度,以减少内存开销。

最后,我们从输出结果中找到预测类别,并使用 labels.txt 文件加载标签信息。最终,我们打印出预测的类别。

这就是使用 Python 创建 MobileNetV2 图像分类模型的示例。通过使用 torchvision.models.mobilenet_v2 函数,我们可以轻松地创建该模型,并使用预训练的权重进行图像分类任务。