人脑可以很容易地识别和区分图像中的物体。例如,给定猫和狗的图像,在纳秒之内,我们就能区分它们,我们的大脑也能感知到这种差异。如果一台机器模仿这种行为,它就和我们能得到的人工智能一样接近。随后,计算机视觉领域的目标是模仿人类视觉系统——在这方面,已经有许多里程碑突破了障碍。
此外,如今的机器可以轻松区分不同的图像,检测物体和人脸,甚至生成不存在的人的图像!很迷人,不是吗?当我开始使用计算机视觉时,我的第一次经历是图像分类。机器区分物体的能力带来了更多的研究途径——比如区分人。
迁移学习的出现进一步加速了计算机视觉和图像分类的快速发展。简单地说,迁移学习允许我们使用一个预先存在的模型,在一个巨大的数据集上训练,用于我们自己的任务。因此,降低了训练新深度学习模型的成本,而且由于数据集已经过审查,我们可以保证质量。
在图像分类中,有一些非常流行的数据集用于研究、工业和黑客活动。以下是一些突出的问题:ImageNet、CIFAR、MNIST等等。
在本文中,我将介绍用于图像分类的前4个预训练模型,它们是最先进的(SOTA),并且在行业中也广泛使用。可以对各个模型进行更详细的解释,但我仅限于在本文中概述它们的体系结构并在数据集上实现它。
目录
配置系统环境、准备数据集、图像分类的预训练模型、VGG-16、ResNet50、Iceptionv3、EfficientNet。
配置系统环境
因为我们从猫和狗开始,所以让我们来研究猫和狗的图像数据集。Kaggle上的原始训练数据集有25000张猫和狗的图像,测试数据集有10000张未标记的图像。因为我们的目的只是理解这些模型,所以我使用了更小的数据集。可以直接在GoogleColab上运行这段代码和其他代码——让我们开始吧!
让我们也导入基本库。此外,我将根据模型需要来做import:
准备数据集
我们将首先准备数据集并分离图像:
1、我们首先将文件夹内容划分为train和validation目录;
2、然后,在每个目录中,为只包含猫图像的猫创建单独目录,为只包含狗图像的狗创建单独的控制器。
下面的代码将让我们检查图像是否已正确加载:
现在我们已经准备好了数据集,让我们进入模型构建阶段。我们将在此数据集上使用4种不同的预训练模型。
图像分类的预训练模型
在本节中,我们将介绍用于图像分类的4个预训练模型,如下所示
1.用于大规模图像识别的超深卷积网络(VGG-16)
VGG-16是用于图像分类的最流行的预训练模型之一。在著名的ILSVRC 2014年会议上介绍,它过去是,现在仍然是击败对手的典范。VGG-16在牛津大学的Visual Grand小组开发,击败了当时的AlxNEt标准,并迅速被研究者和业界采纳,用于他们的图像分类任务。
以下是VGG-16的体系结构:
以下是VGG-16型号的更直观布局。
以下是模型的层:
卷积层=13
池层=5
密集层=3
让我们详细探讨各层:
输入:尺寸的图像(224,224,3)
卷积层Conv1:
Conv1-1:64个滤波器
Conv1-2:64个滤波器和最大池
图像尺寸:(224,224)
卷积层Conv2:现在,我们将滤波器增加到128
输入图像尺寸:(112,112)
Conv2-1:128个滤波器
Conv2-2:128个滤波器和最大池
卷积层Conv3:再次将滤波器加倍到256,现在添加另一个卷积层
输入图像尺寸:(56,56)
Conv3-1:256个滤波器
Conv3-2:256个滤波器
Conv3-3:256个过滤器和最大池
卷积层Conv4:与Conv3类似,但现在有512个滤波器
输入图像尺寸:(28,28)
Conv4-1:512滤波器
Conv4-2:512滤波器
Conv4-3:512滤波器和最大池
卷积层Conv5:与Conv4相同
输入图像尺寸:(14,14)
Conv5-1:512滤波器
Conv5-2:512滤波器
Conv5-3:512滤波器和最大池
这里的输出尺寸是(7,7)。此时,我们将该层的输出展平以生成特征向量
全连接/密集FC1:4096个节点,生成大小为(1,4096)的特征向量
完全连接的节点FC2:4096个节点,生成大小为(1,4096)的特征向量
完全连接/密集FC3:4096个节点,为1000个类生成1000个通道。然后将其传递给Softmax激活功能
输出层
如上所见,该模型本质上是连续的,并且使用了大量滤波器。在每个阶段,使用小的3*3过滤器来减少参数数量。所有隐藏层都使用ReLU激活功能。即便如此,参数的数量仍高达1380亿——这使得它比其他模型更慢、更大。
此外,VGG16模型还有一些变化,基本上是对它的改进,比如VGG19(19层)。你可以找到详细的解释。
现在让我们探讨如何在数据集上训练VGG-16模型:
步骤1:图像增强
因为我们之前使用了更小的图像数据集,所以我们可以通过增加这些数据和增加数据集的大小来弥补。如果使用的是原始较大的数据集,则可以跳过此步骤,直接继续构建模型。
骤2:训练和验证集
步骤3:加载基础模型
我们将只使用基本模型,仅对最后一层进行更改。这是因为这只是一个二进制分类问题,而这些模型的构建可以处理多达1000个类。
由于我们不必训练所有层,因此我们使它们不可训练:
第4步:编译和拟合
然后,我们将构建最后一个完全连接的层。我刚刚使用了基本设置,但可以随意尝试不同的dropOut、不同的优化器和激活函数。
现在,我们将根据前面创建的训练和验证集构建最终模型。请注意使用原始目录本身,而不是我在下面使用的扩充数据集。我进行了10次epochs,但你也可以增加它们以获得更好的结果:
令人惊叹的正如您所看到的,我们能够在10次epochs内实现93%的验证准确率,并且没有对模型进行任何重大更改。这就是我们认识到迁移学习是多么强大以及预训练的图像分类模型是多么有用的地方。不过这里有一个警告——与其他模型相比,VGG16需要很长的训练时间,这在我们处理大型数据集时可能是一个缺点。
话虽如此,我真的很喜欢这个模型是多么简单和直观。在ImageNet语料库上进行训练,VGG-16的另一个显著成就是它在ImageNet ILSVRC-2014中获得了第一名,从而巩固了它在图像分类顶级预训练模型列表中的地位。
参考链接:
https://www.analyticsvidhya.com/blog/2020/08/top-4-pre-trained-models-for-image-classification-with-python-code/?utm_source=blog&utm_medium=18_open-Source_computer_vision_projects
微信公众号:
下载对应的论文,在公众号中回复:paper