FacebookのDeiT(Data-efficient image Transformers)

# 概要

Deitもtransformerベースの事前学習モデルだが、ViTやEfficientNetなどと比較すると、より少ないデータ・少ないパラメタで学習が行えるように「蒸留トークン」という考え方を導入している。詳細は、[原著](https://arxiv.org/abs/2012.12877)を参照のこと。


# 対象読者

* 人工知能・機械学習・深層学習の概要は知っているという方
* 理論より実装を重視する方
* Pythonを触ったことがある方

#目次
[1.31本目-ライブラリのセットアップ](#1-31本目-ライブラリのセットアップ)
[2.32本目-使用する画像データサンプルの取得](#2-32本目-使用する画像データサンプルの取得)
[3.33本目-事前学習モデルのロード](#3-33本目-事前学習モデルのロード)
[4.34本目-前処理](#4-34本目-前処理)
[5.35本目-推論（画像認識）](#5-35本目-画像認識)
[6.参考文献](#6-参考文献)
[7.著者](#7-著者)
[8.参考動画](#8-参考動画)

#1. 31本目 ライブラリのセットアップ

* 質問： ColabでDeiTを利用するために必要なモジュールをインストールせよ。

* 回答： huggingfaceのtransformersのみ入れれば、依存するものは入ってくる。ver.は結構大事なのでつけておくことを推奨する。

```Python
pip install transformers==4.6.1
```

#2. 32本目 使用する画像データサンプルの取得

* 質問： 猫画像のサンプルを取得しpillowのImageにロードせよ。

* 回答： https://cocodataset.org/#explore を利用する。pillowとrequestsを用いることでインターネット上に公開されている画像は簡単にpillowのimageにロード可能。

```Python
from PIL import Image
import requests

url = 'http://farm8.staticflickr.com/7250/7520201840_3e01349e3f_z.jpg'
image = Image.open(requests.get(url, stream=True).raw)
image
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/c1457276-6475-785d-e0f1-af0b85a72cb4.png)


#3. 33本目 事前学習モデルのロード

* 質問： DeiT(Data-efficient image Transformers)の事前学習モデル'facebook/deit-base-distilled-patch16-224'をDeiTFeatureExtractor, DeiTForImageClassificationを利用しロードせよ。

* 回答： feature_extractorとmodelにロードする。feature_extractorは、画像認識の前処理を担当させ、modelの方で推論（画像認識）タスクを解かせる。

```Python
from transformers import DeiTFeatureExtractor, DeiTForImageClassification
feature_extractor = DeiTFeatureExtractor.from_pretrained('facebook/deit-base-distilled-patch16-224')
model = DeiTForImageClassification.from_pretrained('facebook/deit-base-distilled-patch16-224')
```

#4. 34本目 前処理

* 質問： 32本目でロードした画像を前処理にかけ、DeiTの事前学習モデルへ渡せる形式に変換せよ。

* 回答： feature_extractorを利用する。

```Python

inputs = feature_extractor(images=image, return_tensors="pt")

```

前処理された後の画像はmatplotlibで簡単に確認できる。

```Python
import matplotlib.pyplot as plt
plt.imshow(inputs['pixel_values'][0][0])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409610/47842eff-343c-581d-596f-aaf9dca48377.png)


#5. 35本目 画像認識

* 質問： 34本目で前処理をしたinputsを入力し、DeiTForImageClassificationを利用して画像認識を行え。認識結果は索引を変換したテキスト(キャプション・ラベル）として出力せよ。

* 回答： 推論結果はlogitsで返却されるため、argmaxをとって、最も大きい値の索引を返却することで、キャプションに変換できる

```Python

outputs = model(**inputs)
logits = outputs.logits

predicted_class_idx = logits.argmax(-1).item()

print(f'Predicted Class:{model.config.id2label[predicted_class_idx]}')
```

* 結果

Predicted Class:car wheel

猫と認識してくれなかったのだが、横に置いてある自転車の車輪の方を車の車輪として
認識したようだ。個人的にはCLIPの方が実用的に思えた。

<a id="#reference"></a>
#11. 参考文献

- [Huggingface model hub](https://huggingface.co/models)

-[原著論文](https://arxiv.org/abs/2012.12877)

-[Facebook AI Blog](https://ai.facebook.com/blog/data-efficient-image-transformers-a-promising-new-technique-for-image-classification)

#12. 著者

ツイッターでPython/numpy/pandas/pytorch関連の有益なツイートを配信してます。

@keiji_dl

#13. 参考動画

- [直感！Pytorchで始める深層学習実装入門（実践編）](https://www.udemy.com/course/python_pytorch/)

- [7ステップで作るPython x Flask x Pytorch 人工知能Webアプリ開発入門](https://www.udemy.com/course/7step_python_vit/)