MAEでコラージュ画像作ってみる

# 概要
MAEのコラ画像生成の能力を測るため，軽い実験をしてみます．ちなみにMAEとはBERTのように入力画像のMASK部分を復元するようなモデルです．

# 用意
facebook research公式の[こちら](https://colab.research.google.com/github/facebookresearch/mae/blob/main/demo/mae_visualize.ipynb)のスクリプトを使います．

# ソース
- 元のソースコードでは入力画像をランダムマスクするため，これをマニュアルにしましょう．
- 今回は上に張り付ける画像の境界部分を手作業で指示します．

```python:
import types
def random_masking(self, x, mask_ratio):
    N, L, D = x.shape  # batch, length, dim

    ######## マスクするパッチを手作業で指示します．########
    mask_patch = [19,20,21,22,23,24,33,47,61,75,89,103,104,107,108,94,80,66,52,38,93,79,37,90]
    ####################################################
    len_keep = 14**2 - len(mask_patch)
    
    noise = torch.zeros(N, L, device=x.device)  # noise in [0, 1]
    noise[:, mask_patch] = 1.0
    
    # sort noise for each sample
    ids_shuffle = torch.argsort(noise, dim=1)  # ascend: small is keep, large is remove
    ids_restore = torch.argsort(ids_shuffle, dim=1)

    # keep the first subset
    ids_keep = ids_shuffle[:, :len_keep]
    x_masked = torch.gather(x, dim=1, index=ids_keep.unsqueeze(-1).repeat(1, 1, D))

    # generate the binary mask: 0 is keep, 1 is remove
    mask = torch.ones([N, L], device=x.device)
    mask[:, :len_keep] = 0

    # unshuffle to get the binary mask
    mask = torch.gather(mask, dim=1, index=ids_restore)

    return x_masked, mask, ids_restore

model_mae_gan.random_masking = types.MethodType(random_masking, model_mae_gan)
```
- マスクパッチの指示は以下のように番号を参照します．
<img width="600" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/94da1c28-2d57-0269-edba-b8134ae0431b.png">

<img width="600" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/4a0167fb-7fe0-ca6f-badf-52f5233c817b.png">

<img width="600" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/2187a6be-f9a2-ddd1-fce1-4fb12ba83b41.png">

- この場合は，「19, 20, 33, 47」みたいな境界のパッチをマスクしましょう．
- 画像は[朝日新聞デジタル様](https://www.asahi.com/articles/ASN9C7RLTN9CUTFK07C.html)と[マクドナルド様](https://www.mcdonalds.co.jp/burgerlove/static/people/731/index.html)からお借りしました．

# 結果
上記のコードを"Run MAE on the image"の直前に実行してから，"Run MAE on the image"を実行してみます．
グレーでマスクされた部分がモデルにより復元されています．

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/80cb501a-f64e-735f-ad56-3566abd51541.png)

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/4a0167fb-7fe0-ca6f-badf-52f5233c817b.png">

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/1a34313e-e911-b142-1262-9d8b5ac7b8ea.jpeg">

なんとも言えない結果ですね．別の画像でもやってみましょう．

![スクリーンショット 2022-03-07 182959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/c44be10c-3ee3-6aa4-8197-66414c98b40b.png)

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/0e570efb-90f7-f8a9-cd02-b6cc3157151e.jpeg">

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/062a26df-9b48-f75a-3ba3-178eaf3e2093.jpeg">

ちょっと位置調整をします．

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/fc5c6e9b-929b-6dbc-1997-dabaabce4539.png)

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/f1fece7b-12e7-6afc-02c8-b5619f20f223.jpeg">

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/02fabb8e-94d2-80ba-99ce-f50dba6b4a5e.jpeg">

waifu2xで超解像してみました．
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416490/0267062e-98b1-be01-000b-bb0c6c249150.png">

画像は[Diamond online様](https://diamond.jp/articles/-/297744)と[自由民主党様](https://www.jimin.jp/news/policy/141000.html)よりお借りしました．

# まとめ
本記事はfacebook research様が公開されているMAEの学習モデルのコラ画像生成の能力を見てみました．結果は...実用できるほどではありませんね...