paint-brush
2022年的图像分类经过@joshini
3,814 讀數
3,814 讀數

2022年的图像分类

经过 Joshini Lobo13m2022/08/10
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

基于 Transformer 的模型会成为计算机视觉领域的下一件大事吗?随着 Transformer 成为语言任务的成功解决方案,它会统一各种 AI 子领域并为更复杂的问题提供强大的解决方案吗?所以卷起袖子来评估他们在分类任务上的表现如何。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 2022年的图像分类
Joshini Lobo HackerNoon profile picture


基于转换器的视觉模型正在逐渐发展,据报道在分类、分割和动作识别任务上与卷积模型一样好。我们拥有一整套用于视觉任务的卷积模型,并且比基于 Transformer 的模型更受欢迎。本博客深入探讨了 Microsoft 研究团队在 2021 年计算机视觉国际会议 (ICCV) 上提出的 SWin Transformer Vision 模型。它在狗品种图像分类任务中针对几个基于 SOTA 卷积的模型对其性能进行了基准测试。


基于 Transformer 的模型会成为计算机视觉领域的下一件大事吗?随着 Transformer 成为语言任务的成功解决方案,它会统一各种 AI 子领域并为更复杂的问题提供强大的解决方案吗?所以卷起袖子来评估他们在分类任务上的表现如何。


选择的数据及其问题陈述:

无数的犬种在外观上都有细微的变化,这对兽医、狗主人、动物收容所工作人员和潜在的狗主人来说是一个挑战,以确定它们的正确品种。他们需要识别品种,以便提供适当的培训、治疗和满足他们的营养需求。数据来自斯坦福狗数据集,其中包含全球 120 种狗的约 20K 图像。这些数据几乎均等地分成了 Kaggle Competition Dog Breed Identification的训练集和测试集。


该解决方案的目标是建立一个犬种识别系统,能够以最少的数据正确识别犬种,并正确识别甚至相似的犬种。这是一个多类分类任务,对于每张图像,模型必须预测所有 120 个品种的概率。概率最高的是图像中最可能的狗品种。

探索性数据分析

  • 对于一个品种,训练数据最多有 120+ 张图像,最少有 66 张图像。每个班级平均预计有 85 张图像。查看条形图,可以得出结论,不存在类不平衡。


  • 尽管没有类别不平衡,但数据可能不足以训练神经网络。使用随机图像扰动和预训练模型的图像增强将能够规避这个问题。


  • 图像最多的前 5 个品种是 scottish_deerhound、maltese_dog、afghan_hound、entlebucher 和 bernese_mountain_dog。图像最少的后5个品种是golden_retriever、brabancon_griffon、komondor、eskimo_dog和briard。


  • 对训练图像的空间维度进行快速分析,以了解图像高度、宽度及其纵横比的分布。

  • 具有非常低 (<0.5) 和非常高 (>2.3) 纵横比的图像被认为是异常图像。 1.5被认为是一个很好的纵横比。

  • 在分析各种犬种时,通常发现以下几对犬种看起来很相似。

    • “波士顿公牛”,“法国斗牛犬”
    • '小猎犬','english_foxhound'
    • 'bernese_mountain_dog'、'greater_swiss_mountain_dog'
    • “雪橇犬”、“西伯利亚哈士奇”
    • 'basenji','ibizan_hound'
    • 'vizsla','rhodesian_ridgeback'
    • “拉萨”、“西施”
    • 'whippet','italian_greyhound'
    • “布列塔尼猎犬”、“威尔士斯普林格猎犬”、“布伦海姆猎犬”
    • “玛利诺犬”、“德国牧羊犬”
    • “边境牧羊犬”,“牧羊犬”
    • “诺福克梗”、“诺维奇梗”

相似品种 - 诺福克梗(上)诺里奇梗(下)


相似品种 - 雪橇犬(上)西伯利亚雪橇犬(下)


评估指标

  • LogLoss 通过将预测概率与真实概率进行比较,严格评估所有 120 个类别的模型预测的置信度,是关键指标。
  • N*N 混淆矩阵用于研究预测的结果,以分析是否存在任何一对被模型混淆并错误预测的类。


SWIN - 基于变压器的模型

该架构基于微软研究团队开发的“Swin Transformer: Hierarchical Vision Transformer using Shifted Windows” 。本文讨论了一种改进的 ViT 架构,它产生了特征图的分层表示,将自注意力机制的计算复杂度从二次降低到线性。事实证明,它与 SOTA 卷积网络(如 EfficientNet)在 Imagenet 分类问题上的结果相同。


该架构的构建块在以下注释中进行了解释:

图像修补:

在 NLP 中,作为模型处理元素的标记是句子中的单词,其中 1 个标记的大小为 1(仅 1 个单词)。 ViT (视觉转换)将“图像块”视为标记,其中每个块是由一组相邻像素组成的图像的一个分区。每个图像补丁都是一个令牌。任何 ViT 中 1 个令牌的大小为 patch_height * patch_width * 通道数。根据补丁尺寸,我们得到单个图像的多个补丁或标记。如果图像大小 (H*W*3) 为 224 * 224 * 3 像素,补丁大小为 4 * 4,那么我们从图像中得到 224/4 * 224/4 = 56 * 56 个补丁或 3136 个令牌。每个令牌或补丁的大小为 4*4*3 = 48 个维度或 48 个像素的数据。因此,该图像的架构输入由 3136 个令牌组成,每个令牌大小为 48 维。


SWIN 变换器的底层机制类似于任何基于 CNN 的架构,其中图像的空间维度减少并且通道数量增加。在分层架构中的每个阶段,SWIN 转换器也减少了图像块的数量或令牌的数量,同时增加了令牌的维度。考虑到这种机制,更容易理解 SWIN 架构。


在架构的每个阶段,我们都可以看到令牌数量在减少,而令牌大小却在增加。

图片:来自 SWIN 论文并已编辑


SWIN-T 架构除了“ Patch Partitioner”外,还由其他 3 个构建块组成——Linear Embedding、Swin Transformer Block、Patch Merging。这些构建块是重复的,它以分层方式处理特征图。


线性嵌入:

来自“Patch Partitioner”的 48 个维度中的 3136 个令牌被馈送到前馈层,以将 48 个特征向量的令牌嵌入到大小为“C”的特征向量中。这里的“C”作为变压器的容量,SWIN 架构有 4 个基于它的变体。

  • 小 (Swin-T) - C 是 '96'
  • 小 (Swin-S) - C 是 '96'
  • 基数(Swin-B)- C 是 '128'
  • 大(Swin-L)- C 是 '192'


图像补丁和线性嵌入在单个卷积中联合实现,其内核大小和步长与补丁大小相同。卷积中的通道数将为“C”。


SWin 变压器块:

SWin 变压器模块不同于 ViT 架构中的标准变压器模块。在 SWin 变形金刚中,多头自我注意 (MSA)层被替换为窗口 MSA (W-MSA) 模块或者移位窗口 MSA (SW-MSA) 模块.


Image: From SWIN paper
Stage1 由 2 个 SWIN-T 变压器模块(参考图片)组成,其中第一个变压器模块具有窗口 MSA (W-MSA),第二个变压器模块具有移位窗口 MSA (SW-MSA) 模块。在 SWin Transformer 模块中,W-MSA 和 SW-MSA 层的输入和输出通过归一化层传递。然后,它受到具有高斯误差线性单元 (GELU) 激活的 2 层前馈网络的影响。每个块内和这两个块之间都有残差连接。


窗口 MSA (W-MSA) 和移位窗口 MSA (SW-MSA) 模块

为什么 ViT 中的标准注意力层被 Windowed MSA 层取代?

ViT 中的标准注意力层是一个全局注意力层,计算一个补丁与图像中所有其他补丁的注意力,从而导致与图像尺寸成正比的二次复杂度。对于高分辨率图像,这不能很好地缩放。

W-MSA 或 SW-MSA 模块中的自注意力机制是一种本地机制,仅在图像的同一窗口内而不是窗口外的补丁之间计算自注意力。

窗口就像图像的更大分区,其中每个窗口由 M*M 个补丁组成。用局部自注意力代替全局自注意力将计算复杂度从二次降低到线性。


为什么要使用 W-MSA 和 SW-MSA 来进行局部自注意力?它们之间有什么区别?

W-MSA 和 SW-MSA 注意力模块之间的主要区别在于图像窗口的配置方式。

在 W-MSA 模块中,遵循常规的窗口分区策略。图像从图像的左上角像素开始被均匀地划分为不重叠的窗口,每个窗口包含 M*M 或 M2 个补丁。

在 SW-MSA 模块中,窗口配置从 W-MSA 层的配置转移,通过将窗口从常规分区策略中替换为 (M/2, M/2) 个补丁。

图片:来自 SWIN 论文并已编辑


为什么在 SW-MSA 中使用移动的窗口分区策略?

由于注意力在 W-MSA 中的窗口内被局部限制,因此移位的窗口使跨窗口注意力仍然能够产生全局注意力的好处。这是可能的,因为 W-MSA 层中 window1 的边界与 SW-MSA 层中的窗口 W2、W4 和 W5 共享。因此,全局注意力通过“局部注意力转移窗口”间接发生。


补丁合并层

随着网络越来越深,补丁合并层减少了令牌的数量。第一个补丁合并层连接每组 2×2 相邻补丁的特征。

图片:来自 SWIN 论文

狗品种分类的 SWIN 变形金刚

PyPI 中的tfswin包预训练了 SWIN Transformers 的 TF-Keras 变体,并基于官方 pytorch 实现构建。它的代码在github中可用。 tfswin 用于训练狗品种图像。


 from tfswin import SwinTransformerBase224, preprocess_input def build_model1(swintransformer): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) outputs = Lambda(preprocess_input)(inputs) outputs = swintransformer(outputs) outputs = Dense(num_classes, activation='softmax')(outputs) swin_model = Model(inputs=inputs, outputs=outputs) return swin_model #build the model swintransformer = SwinTransformerBase224(include_top=False,pooling='avg') swin_model1 = build_model1(swintransformer) #set the layers of the pretrained model as non-trainable for layer in swin_model1.layers[2].layers: layer.trainable = False swin_model1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='categorical_crossentropy',metrics=['accuracy'])


基于卷积的模型

  • 首先,对各种 ResNet 变体进行了训练,对顶层进行了不同的替换,部分是为了完全冻结网络。
 #Logloss of the test set using various ResNet variants +------------+---------------+-------------------------+----------+ | Model Name | Retrained | Top Layers Replacement | Log_Loss | +------------+---------------+-------------------------+----------+ | ResNet50 | None | ConvBlock_FC_Output | 0.96463 | | ResNet50 | None | GlobalAvgPooling_Output | 0.58147 | | ResNet50 | last 4 layers | ConvBlock_FC_Output | 2.10158 | | ResNet50 | last 4 layers | GlobalAvgPooling_Output | 0.57019 | +------------+---------------+-------------------------+----------+


对应对数损失最小的 ResNet50 模型的代码

from tensorflow.keras.layers import Input,Conv2D,Dense,BatchNormalization,Flatten,Concatenate, Dropout,MaxPooling2D from tensorflow.keras.models import Model from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input def build_model(): tf.keras.backend.clear_session() inputs = Input(shape=(resize_height, resize_width, 3)) #added preprocess_input method as a layer to convert input images to those expected by Resnet processed_inputs = preprocess_input(inputs) #use the pretrained ResNet model (Parameter pooling = 'avg' will take care of the Gobal Average Pooling of the ResNet model features) base_model = ResNet50(weights="imagenet", include_top=False,pooling='avg')(processed_inputs) #output layer output = Dense(units=num_classes,activation='softmax',name='Output')(base_model) resnet_model = Model(inputs=inputs, outputs=output) return resnet_model #build the model resnet_model = build_model() #set the layers of the resnet pretrained model as non-trainable except for its last 4 layers which needs to be re-trained for this data for layer in resnet_model.layers[3].layers[:-4]: layer.trainable = False #compile the model resnet_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='categorical_crossentropy',metrics=['accuracy']) print(resnet_model.summary()) history = resnet_model.fit(train_ds, epochs=50, validation_data=val_ds, callbacks=callbacks_list)


  • 更复杂的预训练卷积模型,如 EfficientNet、NASNet、InceptionResNet、Xception 和 InceptionV3,也使用狗品种图像进行了独立训练和集成训练。这些模型的测试数据(由 10K 图像组成)的对数损失低于任何 ResNet 变体。
 #Logloss of the standalone model variants +----------------------------+-------------+ | Model Name | Log_Loss | +----------------------------+-------------+ | EfficientNetV2M | 0.28347 | | Inception ResNet | 0.28623 | | NasNetLarge | 0.33285 | | Xception | 0.34187 | | Inception_V3 | 0.54297 | | EfficientNetV2M_GlobalAveg | 0.50423 | | InceptionV3_GlobalAveg | 0.46402 | +----------------------------+-------------+


  • 对于独立模型,预训练模型的层被冻结,它们的顶层被替换为
    • 卷积层后跟 MaxPooling 层
    • 全局平均池化层



使用 InceptionResNet 的独立模型




EfficientNet、NASNet、InceptionResNet、Xception 和 InceptionV3 的集成



  • EfficientNet 架构是在所有 3 个维度(深度、宽度和分辨率)上正确缩放的模型。
  • NASNet-Large 是使用各种超参数搜索算法、优化算法和强化学习算法完成的模型架构搜索的结果。
  • InceptionV3 将较大的卷积分解为较小的异步卷积,还包括辅助分类器以提高模型收敛性。
  • Xception 架构执行深度可分离卷积,而不是 Inception 架构中的初始模块。
  • 集成模型的对数损失比性能最佳的独立模型减少了 > 0.1。
 +--------------------------------------------------------------------------+-----------+ | Model Name | Log_Loss | +--------------------------------------------------------------------------+-----------+ | Ensemble1 - EfficientNEt,InceptionResNet,NasNet,Xception) | 0.17363 | | Ensemble2 - EfficientNEt,InceptionResNet,NasNet,Xception and InceptionV3 | 0.16914 | | Ensemble3 - Ensemble2 with 50% dropout. | 0.16678 | | Ensemble4 - Ensemble of various EfficientNet Architecture | 0.16519 | +--------------------------------------------------------------------------+-----------+

Each of these models accepts varied input formats and in Keras they have their own preprocessing functions.


基准测试结果


+----------------------------------+------------+----------------------+----------+ | Model Name | Parameters | Train time (seconds) | Log_Loss | +----------------------------------+------------+----------------------+----------+ | EfficientNet_ConvBlock_Output | 54.7M | ~260s | 0.28347 | | InceptionResNet_ConvBlock_Output | 56.1M | ~260s | 0.28623 | | NASNetLarge_ConvBlock_Output | 89.6M | ~330s | 0.33285 | | XCeption_ConvBlock_Output | 23.3M | ~240s | 0.34187 | | InceptionV3_ConvBlock_Output | 24.2M | ~225s | 0.54297 | | EfficientNet_GlobalAvg | 53.3M | ~260s | 0.50423 | | InceptionV3_GlobalAvg | 22M | ~215s | 0.46402 | | swin_base224 | 86.8M | ~550s | 0.47289 | | swin_base384 | 87M | ~600s | 0.41902 | | swin_large384 | 195M | ~1000s | 0.42207 | +----------------------------------+------------+----------------------+----------+


  • SWIN Transformers 的性能优于所有 ResNet50 变体和 InceptionV3 模型。

  • 与 InceptionResNet、EfficientNet、Xception 和 NasNet 大型模型相比,当它们的输出随后由卷积层和 Maxpooling 处理时,SWIN Transformer 在该数据上的 Log-Loss 略高。

  • 然而,当 SWIN 的平均输出由输出层直接处理时,其性能与 EfficientNet 模型一样好。

  • 与任何卷积模型相比,SWIN 模型都更大,因此会影响系统吞吐量和延迟。


事实证明,这项研究有助于理解基于变压器的模型在计算机视觉中的应用。


您可以在我的Github上找到笔记本的代码,并在此处找到此用例的 GUI。

参考:

https://www.kaggle.com/competitions/dog-breed-identification

https://arxiv.org/pdf/2103.14030.pdf

https://www.youtube.com/watch?v=tFYxJZBAbE8&t=362s

https://towardsdatascience.com/swin-vision-transformers-hacking-the-human-eye-4223ba9764c3

https://github.com/shkarupa-alex/tfswin