PyTorch——应用一个已训练好的图片分类网络——AlexNet

1.识别一个图像主体的预训练网络

        ImageNet数据集是由一个Stanford大学维护的包含1400多万幅图像的非常大的数据集,所有的图像都用来自WordNet数据集的名词层次结构标记,而WordNet数据集又是一个大型的英语词汇数据库。

1.1获取一个预先训练好的网络用于图像识别

from torchvision import models

 可以看到很多实际的模型

1.2AlexNet

与先进的深度网络相比,AlexNet是一个非常小的模型,但是,它可以让我们初步学习神经网络处理计算机视觉任务的例子。

我们首先创建一个AlexNet对象,接下来利用resnet101来初始化一个具有101层的卷积神经网络,下载需要一定的时间,resnet101有4450万个参数需要自动优化。

 再次运行resnet来查看这些层的形式

我们可以像调用函数一样调用resnet变量,将图片作为输入。在此之前需要将我们输入的图片进行预处理使其大小正确、颜色处在相同的数值范围。TorchVision模块提供了转换的操作,允许我们快速的定义基本的预处理管道。

from torchvision import transforms
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]
    )])

接下来我们导入图片

from PIL import Image
img = Image.open("bobby.jpg")
img

 

 也可以使用img.show()使用一个窗口来进行查看

接下来通过预处理管道传递图像,按照网络预期的方式对输入的张量进行重塑、裁剪和归一化处理

img_t = preprocess(img)
import torch
batch_t = torch.unsqueeze(img_t, 0)

接下来运行模型。首先将网络设置为eval模式,这种过程被称之为推理。如果不这样做的话,那么一些预先训练过的模型,如批归一化和Dropout将不会产生有意义的答案。

torch.set_printoptions(precision=4,sci_mode=False)
out = resnet(batch_t)
out

 加载标签文件,并进行匹配:

with open('imagenet_classes.txt') as f:
    labels = [line.strip() for line in f.readlines()]

_, index = torch.max(out, 1)

接下来输出结果和置信度,以及前五个比较大的预测结果:

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index[0]], percentage[index[0]].item()
_,indices = torch.sort(out, descending=True)
[(labels[idx], percentage[idx].item()) for idx in indices[0][:5]]

可以看到,预测结果为一只金毛猎犬。 

猜你喜欢

转载自blog.csdn.net/lqm1094583745/article/details/128418942