stMind

about Tech, Computer vision and Machine learning

Composed Image Retrieval on Real-life images(CIRR)

cuberick-orion.github.io

https://arxiv.org/pdf/2108.04024.pdf

Composed Image RetrievalもしくはImage Retrieval conditioned on Language Feedbackは、従来の単一のモダリティを用いた画像検索と異なり、画像とテキストのペアを与えて検索を行うComposed Image Retrievalのタスクです。ICCV2021でコードとデータセットが公開されました。

f:id:satojkovic:20210829144304p:plain

上図のように、参照画像と修正文をペアとして与えて、ターゲット画像が得られるようにするためには、画像中のどこに着目し、どこは無視していいのか、またどの属性を維持し、どれを変更すべきかに関して、モデルが推論し、視覚的かつ言語的にユーザが合意できる結果を返すようにしなければなりません。

従来のデータセットでは、ファッション画像に限定されていたり、人工的に生成された比較的シンプルな画像であったため、上記のような研究には不十分であり、NLVRデータセットをベースにしたCIRRデータセットが提案されました。

また、大規模なVision and Language(V&L)モデルを利用したCIRPLANT(Composed Image Retrieval using Pretrained LANguage Transformers)という手法も提案しています。著者によると、これまでにもV&Lモデルが様々な視覚言語系タスクに適用され有効性が確認されているが、Composed Image Retrievalのタスクに適用された例はありませんでした。

CIRRデータセットでは、TIRG以前ブログにまとめたもの)やMAAFを超えるスコアを実現し、従来のファッションのデータセットではスコアは劣るものの、MAAFはCIRRデータセットで大幅な性能低下が見られ、汎用的なモデルとなっていると結論づけています。

データセットとコードはGithubで公開されています。

github.com

github.com

Chapter 3.2.3 of Efficient Deep Learning: Self-Supervised Learning

Self-Supervised Learning(SSL)は、pretext taskを解くことで、ラベル付きデータなしに汎用的な表現を獲得する手法。ターゲットタスクに適用するには、SSLでpre-trainingした後に、fine-tuningによりターゲットのラベル空間へのマッピングを学習する。

ラベルなしデータでpre-trainingして、ラベル付きデータでfine-tuningするtwo stepの方法は、NLPでよく使われている。ULMFitのpre-trainingでは与えられたセンテンスにおいて次の単語を予測するタスクを解く。WikiText-103のような大規模コーパス(100 million以上のトークンを含む)を使うことで、IMDbのニクラス分類タスク用にfine-tuningするのは100個のラベルデータだけで十分であった(SSLを使わない場合より、10xほど少ない)。 Pre-trainingの後にfine-tuningを行う方法は、BERTでも使われている。BERTでは、以下の、二つのpretext taskを解いている。

  1. 与えられたセンテンスの15%のトークンをマスクし、マスクしたトークンを予測させる
  2. 二つのセンテンスAとBが与えられ、Aの後にBが続くかどうかを予測する

BERTは、発表当時、9つのNLPタスクでSOTAを記録した。

ビジョン分野では、図に示すようなパッチの相対位置を推測する、また回転角度を予測するようなタスクを解くSSLが提案されている。

f:id:satojkovic:20210801141325p:plain

別の異なる方法として、Contrastive Learningがある。SimCLRでは、同じ画像を異なるように変換した入力の特徴表現の一致度を最大にすることと、異なる画像を変換した入力の特徴表現の一致度を最小にすることを同時に行うことで学習される。この論文では、1%のラベル付きデータで、ResNet50を10%のラベル付きデータで学習したベースラインモデルを超え、Top1-Accで73.9%を達成している。

Chapter 3.2.2 of Efficient Deep Learning: Data Augmentation

複雑なタスクを解く大規模なモデルを教師あり学習するとき、モデルの汎化性能は学習データ量に影響される。 しかしながら、高品質なラベル付き学習データを入手するにはコストがかかるという問題がある。 このような課題に対し、既存のデータに様々な変換手法を用いてデータセットを水増しすることで、ラベル付きデータの不足を解消するData augmentationが広く用いられている。

画像タスクであれば、画像を回転したり(下図左)、二つのクラスの画像をミックスしたり(下図中央)、回転とミックスを組みわせる(下図右)などの方法が使われる。この時、回転だけの場合であれば画像変換前と同じクラスのラベルで、ミックスと組み合わせの場合はミックスする二つのクラスを重み付けして使用する。

f:id:satojkovic:20210724144622p:plain

NLPのタスクでは、ソースからターゲットへ翻訳するモデルと逆方向で翻訳するモデルを用いて、異なる入力文を生成するBack translationや、入力文の単語をランダムにゼロにするWord Dropoutなどが用いられる。

Data augmentationでは、どのような手法を用いるのかは事前に決めることが多いが、RLで適用する手法およびハイパーパラメータを学習するAutoAugmentや、さらに効率的な探索が可能なRandAugmentを用いて自動的に手法を決定することも行われる。(下の図は、RandAugmentの論文に記載されている精度の改善率の表)

f:id:satojkovic:20210724151647p:plain

Chapter 3.2.1 of Efficient Deep Learning: Distillation

Distillationは、事前学習済みの大規模ネットワーク(教師モデル)を用いて、小規模ネットワーク(生徒モデル)を学習する仕組み。教師モデルと、生徒モデルは同じ入力を受け取り、教師モデルの方は生徒モデルのためのSoft labelを生成する。Soft labelは、正解もしくは不正解のクラスの情報を含むHard labelと異なり、例えばトラックは猫よりも車クラスの方が近いといったようなクラス間の関係の知識を含むと考えられ、これはHard labelによる学習だけでは得られない知識と言えます。

生徒モデルは、Hard labelに対するCross entropy lossと、Soft labelに対するDistillation loss(こちらもCross entropy loss)を用いて学習していきます。このプロセスにおいて、通常は教師モデルのパラメータは更新せず、生徒モデルのパラメータのみ更新を行います。

f:id:satojkovic:20210718172250p:plain

Distilling the Knowledge in a Neural Networkでは、音声認識タスクで、単一のdistillation modelが10個のアンサンブルモデルと同等精度になったと報告されている。また、DistilBERT, a distilled version of BERTでは、BERT-baseの97%程度の精度を保ちつつ、40%小規模なモデルで、かつCPU実行が60%高速化されたそうです。(DistillBERTはhuggingfaceのチームが著者)

以上の基本的なDistillationの派生系として、Softmax後の値ではなく、中間の特徴マップを使ってDistillationしたり(Paying more attention to attention / Mobilebert)、Unlabeled dataに対して教師モデルで推論した結果のPseudo labelを用いて生徒モデルを学習し、生徒モデルの精度を向上するアプローチもある。

Efficient Deep Learning: A Survey on Making Deep Learning Models Smaller, Faster, and Better

論文のURL:https://arxiv.org/pdf/2106.08962.pdf

深層学習は、ビジョンや自然言語処理音声認識など様々な分野で飛躍的な進歩をもたらしましたが、モデルの改良が進むにつれてパラメータ数やレイテンシー、学習に必要なリソースなどが大幅に増えており、単にモデルの品質だけでなく、これらの指標にも注目する必要があります。

この論文は、深層学習における効率性の問題に対し、モデルの効率性に関する5つの主要素のサーベイ論文になっています。

f:id:satojkovic:20210704181435p:plain

5つのそれぞれを要約すると、

  1. Compression techniques
    • 例えば、量子化(32bit floatではなく8bit intに精度を削減)
  2. Learning techniques
    • 例えば、distillation
      • 教師モデルの知識をパラメータ数の少ない生徒モデルが学習
  3. Automation
    • 例えば、ハイパーパラメータ最適化(HPO)
    • 他にはarchitecture searchなど
  4. Efficient architectures
    • 例えば、画像分類におけるConv layerは画像全体でパラメータ共有する仕組み
    • 他にはseq2seq modelにおけるattention layer
  5. Infrastructure & Hardware
    • TFやPytorchなどのフレームワーク
      • TF LiteやPytorch mobileのような効率的なモデルのDeployに使われる

それぞれの分野を調べるのはそれなりに時間がかかるものですが、このサーベイ論文で概観を掴んで、必要なところだけ詳細に調べると良さそうです。これから、ちょっとずつ読んでみることにしようかな。

HRNetのQuick Start Guide

CVPR2019で提案されたDeep High-Resolution Representation Learning for Human Pose Estimationのオフィシャル実装をEC2上で実行するまでの記録です。

jingdongwang2017.github.io

EC2は、Deep Learning Base AMI (Ubuntu 18.04) Version 38.0 のP3インスタンスを起動しました。CUDA10.0からCUDA11.1までがプリインストールされていますが、全ては使わないし、容量も圧迫するので、10.0以外は削除しました。これで、32GBほど空きました。

基本は、オフィシャルのレポジトリREADME通りですが、pytorchやcocoapiも含めて全てpip経由でインストールしました。また、EasyDictのbuildが失敗するので、明示的にpip install wheelが必要でした。

github.com

$ git clone https://github.com/leoxiaobin/deep-high-resolution-net.pytorch.git
$ cd deep-high-resolution-net
$ python3 -m venv hrnet_env
$ source hrnet_env/bin/activate
$ pip install torch torchvision pycocotools
$ pip install wheel 
$ pip install -r requirements.txt
$ cd lib; make ; cd ..
$ mkdir log
$ mkdir output

あとは、データセットとモデルファイルの準備ですが、これが一番時間かかりますね。mpii_human_pose_v1.tar.gzの画像ファイルはimages以下に展開されます。

data/
└── mpii
    ├── annot
    │   ├── gt_valid.mat
    │   ├── test.json
    │   ├── train.json
    │   ├── trainval.json
    │   └── valid.json
    ├── images
    └── mpii_human_pose_v1.tar.gz
models/
└── pytorch
    └── pose_mpii
        └── pose_hrnet_w32_256x256.pth

最後に、test.pyを実行して、READMEと同じスコアが見れました。

$ python tools/test.py --cfg experiments/mpii/hrnet/w32_256x256_adam_lr1e-3.yaml TEST.MODEL_FILE models/pytorch/pose_mpii/pose_hrnet_w32_256x256.pth GPUS '(0,)'

Test: [0/93]    Time 9.480 (9.480)  Loss 0.0003 (0.0003)    Accuracy 0.958 (0.958)
| Arch | Head | Shoulder | Elbow | Wrist | Hip | Knee | Ankle | Mean | Mean@0.1 |
|---|---|---|---|---|---|---|---|---|---|
| pose_hrnet | 97.101 | 95.941 | 90.336 | 86.449 | 89.095 | 87.084 | 83.278 | 90.330 | 37.702 |

Natural Language Processing Specialization

www.coursera.org

CourseraのNLP Specialization、完走しました!

NLP Specializationは全部で4つのコース、各コースはさらに4週間分のサブコースで構成されている専門講座になります。最初のコースの終了が7月だったので、全4コースを終了するのに4ヶ月かかったことになります。約4ヶ月のコースと記述されているので、ほぼ標準通りの進捗でした。

また、Certificationを最後にもらうためにSubscriptionに入っていたので、4ヶ月で合計約2万円の出費でした。

一つ一つのビデオは短く(2分から3分くらいが主)、疲れている日は一つだけちょっと見るか、みたいな感じで続けられるのが良かったかな。後は、どちらかというと理論的に踏み込んだ内容というよりは、概念や問題を理解するためのIntuition重視の説明で、またプログラミング課題も理論的に難しいところはスキップされていたりするので、これだけでエキスパートになれるというわけではないけれど、深層学習登場以前の古典的な機械学習アルゴリズムから、NNベースのアルゴリズムに至る過程を体系的に学べるので、自然言語処理技術や関連ワードを知っている状態からもう一歩進んだ状態になるには良いコースだと思いました。