三十多年来,许多钻研人员在图像识别算法和图像数据方面积攒了丰盛的常识。如果你对图像训练感兴趣但不晓得从哪里开始,这篇文章会是一个很好的开始。这篇文章简要介绍了过来的演变,并总结了当初的一些热门话题。
- ImageNet
- 预训练模型
- 迁徙学习(热门话题)
- 应用预训练模型辨认未知图像
- PyTorch
ImageNet 的起源
在 2000 年代初期,大多数 AI 钻研人员都专一于图像分类问题的模型算法,但不足数据样本,钻研人员须要大量图像和相应的标签来训练模型。这激发了 ImageNet 的创立。
ImageNet 由斯坦福大学的人工智能研究员李飞飞老师构思和带头组建。2007 年,当她开始构思 ImageNet 的想法时,她会见了普林斯顿大学传授 Christiane Fellbaum(WordNet 的创建者之一),并探讨了该我的项目。WordNet 是用于名词、动词、形容词和副词之间语义关系的词汇自然语言解决 (NLP) 数据库。它有 155,327 个词,组织在 175,979 个同义词组中,称为同义词组(有些词只有一个同义词组,有些词有几个同义词组)。如果在 WordNet 中将图像附加到单词上不是很好吗?这就是 ImageNet 的起源。ImageNet 将成千盈百的图像与 WordNet 中的同义词集相关联。从那时起,ImageNet 在计算机视觉和深度学习的提高中施展了重要作用。这些数据可供钻研人员收费用于非商业用途。
ImageNet 数据库有超过 1400 万张图像 (14,197,122),分为 21,841 个子类别。数据集中的每张图像都由人工正文,并通过多年的工作进行品质管制。ImageNet 中的大多数同义词集是名词(80,000+),总共有超过 100,000 个同义词集。因而,ImageNet 是一个组织良好的层次结构,可用于监督机器学习工作。能够通过 ImageNet 网站注册本人收费拜访 ImageNet。
借助宏大的图像数据库,钻研人员能够随便开发他们的算法。驰名的 ImageNet 大规模视觉辨认挑战赛 (ILSVRC) 来了。这是 2010 年至 2017 年间举办的年度计算机视觉比赛。它也被称为 ImageNet 挑战赛。挑战中的训练数据是 ImageNet 的一个子集:1,000 个同义词集(类别)和 120 万张图像。这也就是咱们常看到的 ImageNet 1K 或者说为什么咱们看到的预训练模型的类别都是 1000,这就是起因。
什么是预训练模型?
这个比赛激励并处分了许多杰出的图像分类模型。这些模型的训练都须要十分大规模、耗时且 CPU/GPU 密集型的计算。每个模型都蕴含代表 ImageNet 中图像特色的权重和偏差。它们被称为预训练模型,因为其余钻研人员能够应用它们来解决相似的问题。
上面让我形容一些预训练模型的示例。
LeNet-5 (1989):经典的 CNN 框架
LeNet-5 是最早的卷积神经网络。该框架很简略,因而许多类将其用作引入 CNN 的第一个模型。
1989 年,Yann LeCun 等人。在贝尔实验室联合了一个由反向流传算法训练的卷积神经网络来读取手写数字,并胜利地将其利用于辨认美国邮政服务提供的手写邮政编码号码。所以此处应该有一张 LeCun 老师的照片
AlexNet (2012)
AlexNet 在 2012 年 ImageNet 挑战赛中下台,因为它以十分大的劣势获胜。它实现了 17% 的 top5 错误率,而第二名的错误率为 26%。它的架构与 LeNet-5 十分类似。它由 Alex Krizhevsky,Ilya Sutskever , 以及 Krizhevsky 的博士导师 Geoffrey Hinton 单干设计。该模型有 6000 万个参数和 500,000 个神经元。能够将他看作是一个大号的 LeNet。
GoogLeNet (2014)
它是由 Christian Szegedy 等人开发的。来自谷歌钻研。这个模型的参数比 AlexNet 少 10 倍,大概 600 万。
VGG-16 和 VGG-19 (2014)
在牛津大学的 K. Simonyan 和 A. Zisserman 的率领下,VGG-16 模型在他们的论文“Very Deep Convolutional Networks for Large-Scale Image Recognition”中提出。他们应用十分小的 (3×3) 卷积滤波器将深度减少到 16 层和 19 层。这种架构显示出显着的改良。VGG-16 名称中的“16”指的是 CNN 的“16”层。它有大概 1.38 亿个参数。显然 VGG-19 比 VGG-16 大。VGG-19 只提供比 VGG-16 略微好一些的精度,所以很多人应用 VGG-16。
ResNet-50 (2015)
深度神经网络的层通常旨在学习尽可能多的特色。Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun 在他们的论文“Deep Residual Learning for Image Recognition”中提出了一种新的架构。他们提出了一个残差学习框架。这些层被公式化为参考层输出的学习残差函数,而不是学习未参考的函数。他们表明,这些残差网络更容易优化,并且能够从显着减少的深度中取得准确性。ResNet-50 中的“50”指的是 50 层。ResNet 模型在 ImageNet 挑战赛中仅以 3.57% 的错误率博得了较量。
VIT 等新技术,想必大家也都相熟了,这里就不多介绍了
迁徙学习技术
人类长于学习常识并将常识转移到相似的工作中。当咱们遇到新工作时,咱们会辨认并利用以前学习教训中的相干常识。迁徙学习技术是一项平凡的创造。它“转移”在先前模型中学习的常识,以改良以后模型中的学习。
思考任何具备数百万个参数的预训练模型。他们在模型参数中学习了图像的特色。如果其余的工作类似,那么利用预训练模型中的常识(参数)。迁徙学习技术不须要反复训练大型模型的轮子,能够利用预训练模型来实现相似的工作,并且能够依赖更少的数据。如果有一组新图像并且须要构建本人的图像识别模型,能够在神经网络模型中蕴含一个事后训练好的模型。因而,迁徙学习技术成为近年来的热门话题。能够预感两个钻研前沿:(i)预训练模型将持续倒退,(ii)将产生越来越多的迁徙学习模型以满足特定需要。
应用预训练模型辨认未知图像
在本节中,将展现如何应用 VGG-16 预训练模型来辨认图像,包含 (i) 如何加载图像,(ii) 如何格式化预训练模型所需的图像,以及 (iii) 如何利用预训练模型。
在图像建模中,PyTorch 或 TensorFlow 或 Keras 已被钻研人员宽泛应用。PyTorch 是 Facebook 的 AI 钻研实验室基于 Torch 库开发的基于 Python 的开源机器学习库。因为其最大的灵活性和速度,它以深度学习计算而闻名。其利用包含图像识别、计算机视觉和自然语言解决。它是 NumPy 的替代品,能够应用 GPU 的弱小运算能力。Google 的 TensorFlow 是另一个驰名的开源深度学习库,用于跨一系列工作的数据流和可微分编程。PyTorch 或 TensorFlow 都非常适合 GPU 计算。
PyTorch 在其库中蕴含了许多预训练模型。从这个长长的 Pytorch 模型列表中抉择一个预训练模型。上面我抉择 VGG-16 并称之为“vgg16”。
import io
import torch
from PIL import Image
import requests
from torch.autograd import Variable
import torchvision.models as models
import torchvision.transforms as transforms
# You can get all the pre-trained models here: https://pytorch.org/vision/stable/models.html
vgg16 = models.vgg16(pretrained=True) # This may take a few minutes.
vgg16
下面的第 10 行加载了 VGG-16 模型。能够将其打印进去以查看其架构,如下所示:
如前所述,VGG-16 在 ImageNet 挑战赛中应用了 1,000 个类别和 120 万张图像的训练。上面我将它保留到本地目录“/downloads”并加载到一个名为“labels”的列表中。
with open("/Downloads/imagenet_classes.txt", "r") as f:
labels = [s.strip() for s in f.readlines()]
在上面的第 2 行中,我用搜寻了“金鱼”,并从图片中随机抉择了一张金鱼图片。在第 3 行中,我还搜寻了老鹰,并随机抉择了一张带有图片地址的老鹰图片。
import urllib
#url, filename = ("https://github.com/dataman-git/codes_for_articles/blob/master/pic/tesla.png?raw=true", "tesla.jpg")
url, filename = ("https://cff2.earth.com/uploads/2022/01/06080341/Goldfish.jpg?raw=true", "goldfish.jpg")
url, filename = ("https://cdn.britannica.com/92/152292-050-EAF28A45/Bald-eagle.jpg?raw=true", "eagle.jpg")
try: urllib.URLopener().retrieve(url, filename)
except: urllib.request.urlretrieve(url, filename)
# sample execution (requires torchvision)
from PIL import Image
from torchvision import transforms
input_image = Image.open(filename).convert('RGB')
print(input_image.size)
input_image.show()
图像能够由 Python Imaging Library(缩写为 PIL,或称为 Pillow 的较新版本)加载。
第 12 行:加载老鹰图像
第 13 行:图像的大小为 (1600,1071)。这意味着图像是一个 1,600 x 1,071 像素的文件。
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_tensor.shape # = torch.Size([3, 224, 224])
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
input_tensor.shape # = torch.Size([1, 3, 224, 224])
# move the input and model to GPU for speed if available
if torch.cuda.is_available():
input_batch = input_batch.to('cuda')
model.to('cuda')
所有预训练模型都冀望输出图像以雷同的形式归一化,即形态为 (3 x H x W) 的 3 通道 RGB 图像的小批量,其中 H 和 W 至多为 224。
第 2、3 行:将图像尺寸标准化为 [3,224,224]。
第 5 行:应用 mean = [0.485, 0.456, 0.406] 和 std = [0.229, 0.224, 0.225] 对图像进行归一化。
output = vgg16(input_batch) # Returns a Tensor of shape (batch, num class labels)
# Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
#print(output[0])
# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
probabilities = torch.nn.functional.softmax(output[0], dim=0)
#print(probabilities)
第 1 行是最重要的一步。它预测图像是什么。输入是蕴含 1,000 个 ImageNet 同义词集的 1,000 个值的列表。
第 6 行:将 1,000 个值转换为概率。
# Show top categories per image
top5_prob, top5_catid = torch.topk(probabilities, 5)
for i in range(top5_prob.size(0)):
print(labels[top5_catid[i]], top5_prob[i].item())
下面的代码打印前五个概率和标签。咱们输出了一个鹰的形象。VGG-16 模型将图像识别为“鹰”的概率为 0.9969。
总结
这篇文章总结了图像与训练模型的起源并且蕴含了一个应用的入门级示例,如果你对代码感兴趣,请在这里下载:
https://www.overfit.cn/post/63db6dc2267c499bb5c106edf0c61d9d
作者:Dr. Dataman