社群計算機視覺課程文件
MobileViT v2
並獲得增強的文件體驗
開始使用
MobileViT v2
前面討論的視覺Transformer架構計算密集,難以在移動裝置上執行。以前最先進的架構使用CNN進行移動視覺任務。然而,CNN無法學習全域性表示,因此其效能不如Transformer。
MobileViT架構旨在解決移動視覺任務所需的問題,例如低延遲和輕量級架構,同時提供Transformer和CNN的優勢。MobileViT架構由蘋果公司開發,並基於Google研究團隊的MobileNet。MobileViT架構透過新增MobileViT塊和可分離自注意力機制,在之前的MobileNet架構基礎上進行了改進。這兩個功能使得在資源受限的裝置上部署視覺ML模型能夠實現閃電般快速的延遲、引數減少和計算複雜性降低。
MobileViT架構
Sachin Mehta和Mohammad Rastegari的論文“MobileViT: 輕量級、通用和移動友好視覺Transformer”中提出的MobileViT架構如下:
其中一些內容應該與前一章類似。MobileNet塊、nxn卷積、下采樣、全域性池化和最終的線性層。
從全域性池化層和線性層可以看出,這裡展示的模型用於分類。然而,本文中引入的相同塊可以用於各種視覺應用。
MobileViT塊
MobileViT塊結合了CNN的區域性處理和Transformer中的全域性處理。它結合了卷積和Transformer層,使其能夠捕獲資料中的空間區域性資訊和全域性依賴關係。
MobileViT塊的圖表如下所示:
好的,這有很多內容。讓我們分解一下。
- 該塊接收具有多個通道的影像。假設對於RGB影像有3個通道,因此該塊接收一個三通道影像。
- 然後,它對這些通道執行N x N卷積,並將它們附加到現有通道。
- 該塊然後建立這些通道的線性組合,並將其新增到現有的通道堆疊中。
- 對於每個通道,這些影像被展開成平坦的塊。
- 然後,這些平坦的塊透過一個Transformer進行投影,以生成新的塊。
- 然後將這些塊重新摺疊在一起,以建立具有d維的影像。
- 之後,在拼接的影像上疊加一個逐點卷積。
- 然後,拼接的影像與原始RGB影像重新組合。
這種方法允許感受野為H x W(整個輸入大小),同時透過保留塊的位置資訊來建模非區域性依賴關係和區域性依賴關係。這可以從塊的展開和重新摺疊中看出。
這種複合方法使MobileViT的引數比傳統CNN更少,甚至具有更好的準確性!
原始MobileViT架構中的主要效率瓶頸是Transformer中的多頭自注意力,它對輸入令牌需要O(k^2)的時間複雜度。
多頭自注意力還需要昂貴的操作,如批次矩陣乘法,這會影響資源受限裝置上的延遲。
這些相同的作者撰寫了另一篇論文,專門探討如何使注意力操作更快。他們將其稱為可分離自注意力。
可分離自注意力
在傳統的多頭注意力中,輸入令牌的大O複雜度是二次的(O(k^2))。本文引入的可分離自注意力對輸入令牌具有O(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}"