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]]
可以看到,预测结果为一只金毛猎犬。?
|