社区计算机视觉课程文档

MobileViT v2

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

MobileViT v2

前面讨论的视觉Transformer架构计算密集,难以在移动设备上运行。以前最先进的架构使用CNN进行移动视觉任务。然而,CNN无法学习全局表示,因此其性能不如Transformer。

MobileViT架构旨在解决移动视觉任务所需的问题,例如低延迟和轻量级架构,同时提供Transformer和CNN的优势。MobileViT架构由苹果公司开发,并基于Google研究团队的MobileNet。MobileViT架构通过添加MobileViT块和可分离自注意力机制,在之前的MobileNet架构基础上进行了改进。这两个功能使得在资源受限的设备上部署视觉ML模型能够实现闪电般快速的延迟、参数减少和计算复杂性降低。

MobileViT架构

Sachin Mehta和Mohammad Rastegari的论文“MobileViT: 轻量级、通用和移动友好视觉Transformer”中提出的MobileViT架构如下:MobileViT架构

其中一些内容应该与前一章类似。MobileNet块、nxn卷积、下采样、全局池化和最终的线性层。

从全局池化层和线性层可以看出,这里展示的模型用于分类。然而,本文中引入的相同块可以用于各种视觉应用。

MobileViT块

MobileViT块结合了CNN的局部处理和Transformer中的全局处理。它结合了卷积和Transformer层,使其能够捕获数据中的空间局部信息和全局依赖关系。

MobileViT块的图表如下所示:MobileViT块

好的,这有很多内容。让我们分解一下。

  • 该块接收具有多个通道的图像。假设对于RGB图像有3个通道,因此该块接收一个三通道图像。
  • 然后,它对这些通道执行N x N卷积,并将它们附加到现有通道。
  • 该块然后创建这些通道的线性组合,并将其添加到现有的通道堆栈中。
  • 对于每个通道,这些图像被展开成平坦的块。
  • 然后,这些平坦的块通过一个Transformer进行投影,以生成新的块。
  • 然后将这些块重新折叠在一起,以创建具有d维的图像。
  • 之后,在拼接的图像上叠加一个逐点卷积。
  • 然后,拼接的图像与原始RGB图像重新组合。

这种方法允许感受野为H x W(整个输入大小),同时通过保留块的位置信息来建模非局部依赖关系和局部依赖关系。这可以从块的展开和重新折叠中看出。

感受野是输入空间中影响特定层特征的区域的大小。

这种复合方法使MobileViT的参数比传统CNN更少,甚至具有更好的准确性!MobileViT CNN性能

原始MobileViT架构中的主要效率瓶颈是Transformer中的多头自注意力,它对输入令牌需要O(k^2)的时间复杂度。

多头自注意力还需要昂贵的操作,如批次矩阵乘法,这会影响资源受限设备上的延迟。

这些相同的作者撰写了另一篇论文,专门探讨如何使注意力操作更快。他们将其称为可分离自注意力。

可分离自注意力

在传统的多头注意力中,输入令牌的大O复杂度是二次的(O(k^2))。本文引入的可分离自注意力对输入令牌具有O(k)的复杂度。

此外,这种注意力方法不使用任何批次矩阵乘法,这有助于减少移动电话等资源受限设备上的延迟。

这是一个巨大的改进!

还有许多其他形式的注意力,其复杂性范围从O(k)、O(k*sqrt(k))、O(k*log(k))不等。

可分离自注意力并非第一个实现O(k)复杂度的论文。在可分离自注意力之前,Linformer也实现了O(k)复杂度的注意力,详见Linformer

然而,它仍然使用批次矩阵乘法等代价高昂的操作。

Transformer、Linformer和MobileViT之间的注意力机制比较如下所示:注意力比较

上图对比了Transformer、Linformer和MobileViT v2架构中各种类型的注意力。

例如,在Transformer和Linformer架构中,注意力计算都执行两次批量矩阵乘法。

然而,在可分离自注意力的情况下,这两个批量乘法被替换为两个独立的线性计算。这进一步提高了推理速度。

结论

MobileViT块在开发全局表示的同时保留了空间局部信息,结合了Transformer和CNN的优势。它们提供了一个涵盖整个图像的感受野。

将可分离自注意力引入现有架构进一步提升了准确性和推理速度。推理测试

如上所示,在iPhone 12s上使用不同架构进行的测试显示,引入可分离注意力后性能大幅提升!

总而言之,MobileViT架构是一种非常强大的架构,适用于资源受限的视觉任务,提供快速推理和高精度。

Transformers库

如果你想在本地尝试MobileViTv2,你可以使用HuggingFace的transformers库,以下是使用方法:

pip install transformers

下面是一个简短的代码片段,展示了如何使用MobileViT模型对图像进行分类。

from transformers import AutoImageProcessor, MobileViTV2ForImageClassification
from datasets import load_dataset
from PIL import Image

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

image_processor = AutoImageProcessor.from_pretrained(
    "apple/mobilevitv2-1.0-imagenet1k-256"
)
model = MobileViTV2ForImageClassification.from_pretrained(
    "apple/mobilevitv2-1.0-imagenet1k-256"
)

inputs = image_processor(image, return_tensors="pt")

logits = model(**inputs).logits

# model predicts one of the 1000 ImageNet classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])

推理API

为了更轻量级的计算机视觉设置,您可以使用Hugging Face推理API和MobileViTv2。推理API是一个与Hugging Face Hub上许多模型交互的API。我们可以通过Python像下面这样查询推理API。

import json
import requests

headers = {"Authorization": f"Bearer {API_TOKEN}"}
API_URL = (
    "https://api-inference.huggingface.co/models/apple/mobilevitv2-1.0-imagenet1k-256"
)


def query(filename):
    with open(filename, "rb") as f:
        data = f.read()
    response = requests.request("POST", API_URL, headers=headers, data=data)
    return json.loads(response.content.decode("utf-8"))


data = query("cats.jpg")

我们也可以通过JavaScript进行同样的操作,如下所示。

import fetch from "node-fetch";
import fs from "fs";
async function query(filename) {
    const data = fs.readFileSync(filename);
    const response = await fetch(
        "https://api-inference.huggingface.co/models/apple/mobilevitv2-1.0-imagenet1k-256",
        {
            headers: { Authorization: `Bearer ${API_TOKEN}` },
            method: "POST",
            body: data,
        }
    );
    const result = await response.json();
    return result;
}
query("cats.jpg").then((response) => {
    console.log(JSON.stringify(response));
});

最后,我们可以通过curl查询推理API。

curl https://api-inference.huggingface.co/models/apple/mobilevitv2-1.0-imagenet1k-256 \
        -X POST \
        --data-binary '@cats.jpg' \
        -H "Authorization: Bearer ${HF_API_TOKEN}"
< > 在 GitHub 上更新