stMind

about Tech, Computer vision and Machine learning

姿勢推定の関節ヒートマップデコードと標準シフト処理の有効性

姿勢推定モデルにおいては、関節毎のヒートマップ表現がよく使われており、OpenPoseを始め、多くの論文で有効性が確認されています。さらに、関節毎のヒートマップから、オリジナル画像における座標へ変換するデコード処理は、これまで十分に考察が行われてこなかったのに対して、DarkPoseと呼ばれる新しいデコード処理を提案する論文がCVPR2020で発表されました。

arxiv.org

論文では、様々な姿勢推定モデルにDarkPoseのデコード処理をアドオンすることで、検出精度が向上したことが報告されていたのですが、注目したのは、デコード処理を比較した以下の結果です。

f:id:satojkovic:20211107180907p:plain

No shiftingは、ヒートマップの最大値の座標をそのまま関節座標とするもので、Standard shiftingは、最大値の座標mと次に大きい値の座標sを求め、mからsへ0.25だけシフトする処理のことで、Stacked Hourglassの論文で使われたものです。このようなサブピクセルレベルのシフト処理は、ダウンサンプリングされたヒートマップ画像における位置が、オリジナル画像の正確な位置とは一致しないことを補うことが目的で、経験的な値として0.25とされた様ですが、大変な効果があることに驚きました。経験的な固定値ではなく、分布を考慮してシフトするのがDarkPoseで、さらに向上が見られているのですが、データセットにおける有効性は確認した上で、シンプルな実装としてStandard shiftingを使っても良いのかもしれません。

TF OD APIのpipeline.configの読み方(概要編)

Tensorflow Object Detection API(TF OD API)では、Protocol Buffersを使用して学習と評価のプロセスを設定しています。学習と評価用のスキーマは、tensorflow/models/research/object_detection/protos/pipeline.configに定義されており、ハイレベルでは5つのパートに分かれています。

  1. 特徴抽出器の指定など、モデルの詳細設定(model)
  2. バッチサイズやデータ拡張オプションなど、モデルの学習用の設定(train_config)
  3. 学習用の入力画像、正解ラベル、正解BoundingBoxなどのテンソルを生成するinput readerの設定(train_input_reader)
  4. バッチサイズやデータ数など、モデルの評価用の設定(eval_config )
  5. train_input_readerと同様で、評価用のinput readerの設定(eval_input_reader)

それぞれの詳細は、別途まとめをするとして、ここでは基本的な設定について触れることにする。

1. model configuration

モデルの詳細設定は、メタアーキテクチャにより異なり、指定可能なアーキテクチャは3種類。

  1. faster_rcnn
  2. ssd
  3. center_net

それぞれのアーキテクチャの中で、feature_extractorや入力画像の前処理のimage_resizerの設定など、細かく指定ができるようになっている。これは、それぞれtensorflow/models/research/object_detection/protosの中に、faster_rcnn.proto、ssd.proto、center_net.protoにて定義されている。

2. train_config

学習の設定で、29種類の項目がある。基本的な項目としては、以下のようなものがある。

  • batch_size
  • num_steps
    • 学習ステップ数。0とすると上限なしとなる。
  • fine_tune_checkpoint
    • リストア対象のチェックポイントへのパス。Tensorflow2 Detection Model Zooからダウンロードしたpretrainedモデルなどを使用。

3. train_input_reader

学習用の入力データ生成に関する設定。基本は、検出対象クラス名とインデックスの対応を記述したlabel mapと、学習データを記録したtfrecordを使った学習をすることが多いので、それらを指定するところとなる。その他、30種類ほど指定可能な項目がある。

  • label_map_path
    • label mapファイルのパス
  • tf_record_input_reader もしくは external_input_reader
    • tfrecordの場合は、tf_record_input_readerの中で、input_pathとして指定する。

4. eval_config

evaluationのmetricsなど、評価用の設定(35種類)。

5. eval_input_reader

3のtrain_input_readerと同じで、こちらはevaluation用。こちらもtfrecordを使うことが多いので、3と同じ様にlabel_map_pathとtf_record_input_readerを指定する。加えて、データの処理順序をshuffleしないようにする(shuffle: false)、num_epochsは1回だけ(num_epochs: 1)、などもよく使う。

最後に

見てみると、それぞれの大項目には結構な数の設定項目があり、基本的にはmodel zooの設定をそのまま使うことが多いけれど、自分のデータセットでチューニングする時には知っておくと良さそうなので、それぞれまた詳しく調べてみることにする。

TF OD APIにおいてどのモデルを使うのかは、どのように判断されるのか?

tl;dr

pipeline configに含まれるmodelのアーキテクチャ名から判断され、アーキテクチャに応じたbuildメソッドが使われる。 例えば、以下はfaster_rcnn_resnet50_v1_640x640_coco17_tpu-8のpipeline.configファイル。 f:id:satojkovic:20211010212331p:plain

具体的なところ

configはobject_detection/protos/pipeline.protoに定義され、model以外に5つのフィールドがある。

f:id:satojkovic:20211010211715p:plain

また、modelは対応している有効なmeta architectureとしてfaster_rcnn、ssd、center_netの三種類がobject_detection/protos/model.protoに定義されている。 f:id:satojkovic:20211010212524p:plain

そして、model_main_tf2.pyを使って、引数のpipeline_config_pathで使いたいモデルのpipeline configファイルを指定して実行すると、model_lib_v2.pyのeval_continuously()からmodel_builder.pyのbuild()が呼ばれて、アーキテクチャ名に応じたbuildメソッドを実行するようになっている。 f:id:satojkovic:20211010213240p:plain

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を用いて生徒モデルを学習し、生徒モデルの精度を向上するアプローチもある。