GENZITSU / UsefulMaterials

34 stars 0 forks source link

weekly useful materials - 08/24 - #110

Open GENZITSU opened 1 year ago

GENZITSU commented 1 year ago

Efficient, accurate object detection for hundreds of uncommon object classes

Masked Autoencoderによる事前学習ViTのfeature map を利用してい物体認識させてみたら、階層構造を作らなくてもそこそこの精度でましたよというMetaからの報告。

背景

object detectionではfeature pyramidを構成する際にbackboneの各stageの特徴からそれぞれ物体認識用の特徴マップを作成するフローになっているが、この構成だとbackboneからどのようにfeature pyramidを作成するかを都度探索する必要がある。

たとえばConvNetsベースのバックボーンではfeature mapのサイズがだんだん小さくなるが、ViTベースだとfeature mapのサイズは変わらないのでstageごとに特徴を抽出する意味...?となったり。

スクリーンショット 2022-08-10 23 49 53

自然言語処理ではBERTやGPT-3のような汎用エンコーダーの出力をダウンストーリムタスクにfine-tuningすることで、大きな成果を上げてきたが、画像認識系のタスクではいまだに、汎用エンコーダーは出てきておらず、ダウンストリームタスク毎にエンコーダーをちょっといじるみたいなことが行われている。 (ex. sifted window attetionとか)

報告された結果

画像の右側のようなbackboneの出力をスケールだけ変更する形で物体認識タスクに利用したら、そこそこの精度が出たとのこと。

スクリーンショット 2022-08-11 0 00 52

スクリーンショット 2022-08-11 0 00 43

その利用として論文では以下が指摘されていた

We hypothesize that this is because ViT can rely on positional embedding [54] for encoding locations and also because the highdimensional ViT patch embeddings do not necessarily discard information.4

また、MAEで事前学習した重みを用いて学習するのも効果があったとのこと

スクリーンショット 2022-08-11 0 04 42

その他のモデルと比べてもcompetitiveな結果を出している。

スクリーンショット 2022-08-11 0 05 36

スクリーンショット 2022-08-11 0 06 47

コメント

segmentationとかだとbackboneの特徴そのまま使うのが多いけど、object detectionだけ特徴マップ設計大変だよなーと感じていたが、今回の研究報告によって、特徴マップ設計が緩和されると物体検出ライブラリの実装がかなりスマートになると思うので期待したい。

stageごとの特徴マップサイズが変化しないViT系限定の話だとは思うが、そこはConvNetsを駆逐してもらって...笑

出典

GENZITSU commented 1 year ago

noteの機械学習フローを共通化してレコメンデーションで成果をあげた話

noteの記事に対する分類やレコメンデーションなどの複数の機械学習システムで利用する記事の分散表現を共通化することで、各パイプラインの実行時間を大幅に短縮し、結果的にCTRの改善に寄与した事例の紹介。

背景

スクリーンショット 2022-08-10 23 19 05

各々の機械学習タスクごとに記事の分散表現を作成することのデメリット

  • 基本的に分散表現の獲得はタスク間で共通な処理であることが多く,タスクごとに推論するのは非効率である
  • 分散表現のモデルサイズと文章のデータサイズが大きく,一度に扱える記事の数に制約が発生する
  • ユーザの行動データと記事の内容を同時に扱う処理では,タスクの実行時間が非常に長くなり,施策として実施しづらい

→ これらを解決するために、記事の分散表現を事前に計算する仕組みを導入し後続のタスクでは共通の分散表現をもとに推論を行うように変更。

構築したシステム図

スクリーンショット 2022-08-10 23 22 16

スクリーンショット 2022-08-10 23 23 22

Glue Catalogは記事のidを指定した分散表現のアップデートができないので、永続テーブルと一時テーブルを作成して、用途に分けて分散表現の出し訳を行っている。

スクリーンショット 2022-08-10 23 25 16

結果

その結果類似記事のレコメンド性能が向上したのだが、これは分散表現の質の向上によるものではなく、
分散表現取得にかかるコストが低減したことによって、より多くの記事郡からレコメンドを行えるようになったからとのこと。

スクリーンショット 2022-08-10 23 25 43

コメント

似たようなデータに対して似たような機能を複数提供する場合には今回の例のような共通化を施すことで、ソフトウェアコストが下がり結果として性能が上がるなんてことがあるんだなぁというのが勉強になった。

ここのタスク性能は上がっていないけど、コストが下がったから使える武器が増える的な。

出典

noteの機械学習フローを共通化してレコメンデーションで成果をあげた話

GENZITSU commented 1 year ago

RadImageNet: An Open Radiologic Deep Learning Research Dataset for Effective Transfer Learning

135万枚のCT, MRI, エコー画像からなる医療画像版ImageNetが公開。
フォームから利用を申し込めば研究用途はもちろんのこと商用利用も可能とのこと。

データセットの概要は以下

スクリーンショット 2022-08-15 17 46 35

スクリーンショット 2022-08-15 17 52 27

imagenet pretrainedから学習したInception v3モデルよりも、RadImageNetで事前学習をしたモデルの方がAUCベースで0.9 ~ 9.4%精度が高くなる(1枚目については5fold cvの結果)

スクリーンショット 2022-08-15 17 56 19

スクリーンショット 2022-08-15 17 56 31

また、RadImageNetから学習したモデルの方がCAMの解釈性が医学的な知見と整合しやすいとのこと

スクリーンショット 2022-08-15 17 53 09

スクリーンショット 2022-08-15 17 56 42

コメント

医療AI界隈の今年一番のインパクトになりそうな論文。
このデータを元にした事前学習モデルが今後公開されていきそうだが、公開されているうちに元データを共有してもらったホほうがいいので、医療系プロジェクトに携わる人はとりあえず申し込んでみるのが良さそう。

出典

GENZITSU commented 1 year ago

ディープフェイクの弱点を突いて偽物によるビデオ通話を見破る方法とは?

ビデオ通話相手がディープフェイクを使っているかどうかを判別方法として、横顔を見せてもらうという手法を提案している記事の紹介。

テクノロジー系メディアのMetaphysic.aiによると、よほど有名な俳優出ない限り精巧なディープフェイクを作成するための横顔データが足りていないので、見分けが簡単であるらしい。

スクリーンショット 2022-08-15 23 18 06

ただし、技術の発展は早く

しかし、台北大学が公開した論文(PDFファイル)では、ほとんど横顔が見られない正面の写真から、横顔のデータを違和感の少ない形で生成したサンプルが公開されています

スクリーンショット 2022-08-15 23 20 54

であったり、NeRFの台頭であったり、本当に悪意のある集団がお金をかければ横顔のデータも集められるなど、今後も横顔が判定基準として使えるかは微妙という見解だそうだ

コメント

こういう見分けテクが発見されてはまた使えなくなるを繰り返していくうちに、スパムAIフィルターツールみたいなのが登場するのだろうな

出典

GENZITSU commented 1 year ago

OCR-free Document Understanding Transformer

OCRなしを挟まずE2Eで文書画像から情報抽出やquation answeringタスクを解くことができる手法の提案 from NAVER @ECCV2022

背景

一般的なDocument Understangindパイプラインは以下のようにOCRで検出された領域や文字情報を用いて、情報抽出を実施するが、以下のような問題点がある。

手法

Donutが提案するパイプラインは以下のようにOCRモジュールをなくすことで、上記問題点の回避を試みている

スクリーンショット 2022-08-16 22 29 06

ただしDocument Understanding用にTransformer (今回はSwin Transformer)の事前学習が必要になるので、それは以下のように実施する。

SynthDogという方法で、文書画像に擬似的に文字を載せた画像生成する

  • Background: Backgroung images are sampled from ImageNet [7]. Gaussian blur is randomly applied to the background image to represent out-of-focus effects.
  • Document: Paper textures are sampled from the photos that we collected. The texture is applied to an white background. In order to make the texture realistic, random elastic distortion and Gaussian noise are applied. To represent various view angles in photographs, a random perspective transformation is applied to the image.
  • Text Layout and Pattern: To mimic the layouts in real-world documents, a heuristic rule-based pattern generator is applied. The main idea is to set multiple squared regions to represent text paragraphs. Each squared text region is then interpreted as multiple lines of text. The size of texts and text region margins are chosen randomly.
  • Text Content and Style: We prepare the multi-lingual text corpora from Wikipedia.We use Noto fonts since it supports various languages. SynthDoG samples texts and fonts from these resources and the sampled texts are rendered in the regions that are generated by the layout pattern generator. The text colors are randomly assigned.
  • Post-processing Finally: In this process, the color, brightness, and contrast of the image are adjusted. In addition, shadow effect, motion blur, Gaussian blur, and JPEG compression are applied to the image.

スクリーンショット 2022-08-17 0 26 47

② 生成した画像になんらかのOCRモジュールを噛ませて、認識結果を左上から右下の順に結合 (pseudo-OCR)

③ 生成画像をモデルに入れ込むとpseudo OCRの文章を出力するという事前学習を解かせる

事前学習したモデルは所望のデータセットやタスクに応じてfine-tuningさせれば、いい感じの精度が出る。

結果

以下のデータセット及びタスクで精度を検証 IEに関連するところだと

Business Card (In-Service Data). This dataset is from our active products that are currently deployed. The dataset consists of 20K train, 0.3K valid, 0.3K test Japanese business cards. The number of fields is 11, including name, company, address, and so on. Receipt (In-Service Data). This dataset is also from one of our real products. The dataset consists of 40K train, 1K valid, 1K test Korean receipt images. The number of unique field is 81, which includes store information, payment information, price information, and so on.

スクリーンショット 2022-08-17 0 37 28

IEについては精度、実行時間ともにDonutが良好

スクリーンショット 2022-08-17 0 40 03

文書分類についてはわかりやすい比較図が載っており、OCR検出結果を利用する手法はOCRにどのモデルを使うかで大きく精度が変わることも確認されている。

スクリーンショット 2022-08-17 0 49 32

その他の議論

事前学習の手法の比較

スクリーンショット 2022-08-17 0 47 39

コメント

OCR検出結果を経由しないでここまで精度の高い情報抽出ができるのは意外。
実際にサービスに落とし込む際は、OCRモデルの精度も時間と共に変わっていくのでそこに依存関係を持たせるべきではないという観点もありそうなのでE2Eも有力候補かなと思った。

出典

GENZITSU commented 1 year ago

AI開発時に、あるClassのデータを集中的に追加する時のTipsと注意点

後付けで分類モデルに新クラスを追加する際に注意しないといけない点と、データ作成を省力化するためのテクニックの紹介。

MLシステムの実運用が進むと認識対象に新規クラスを追加する必要が度々出てくるが、その際には色々な方法が考えられる。

以下はテキスト分類の例で説明。

スクリーンショット 2022-08-21 12 03 57

① キーワードでひっかけてデータを作成する。

ここ最近、本当に辛いから運動して気分転換しよ のように「味」としての意味ではなく、「つらさ」を意図したものが含まれてしまう可能性があります。

→ 同音異義語などがあったりするのでちょっと使いづらい。

② 該当データぽいdataかどうかを判別するフィルタを作成した後に人力でラベリングする。

スクリーンショット 2022-08-21 12 08 23

同音異義語問題については例えば機械翻訳を用いることで、「辛い」がspicyになったりhardになったりするので、英単語から判別することができたりする。
また少量のデータを用いて上記のフィルタリング機能を持ったAIを作成するアプローチもあり得る。

③ 新規クラスの負例も追加する。

上記の手順で新規クラスの正例ばかり集めてしまうと、偽陽性が増えてしまうので、負例のデータもちゃんと追加する。

スクリーンショット 2022-08-21 12 12 52

④ 負例のデータを作成する際に、既存のモデルを活用する。

該当データではないデータや、人でフィルタして新規クラスではないと判別されたデータ達に人手で一個一個ラベルをつけていくのはつらいので、負例となったものは既存のモデルを活用して半教師あり的にデータを作成する方法もある。
半教師ありでラベルをつくって人手でチェックするというのも良さそう。

スクリーンショット 2022-08-21 12 15 13

コメント

新クラス追加にまつわる実用的なテクニックがまとまっている良記事。
基本的なことだが実運用時と同じような分布となるようなサンプリング方法であるかも気をつけたほうがよさそう。

出典

AI開発時に、あるClassのデータを集中的に追加する時のTipsと注意点

GENZITSU commented 1 year ago

深層学習の量子化に入門してみた 〜BERTをIntel Neural CompressorでStatic Quantization〜

よくあるonnx runntimeではなく intel neural compressorを用いてBERTを量子化する方法の紹介

transformersの拡張ライブラリであるoptimumを利用することで量子化が可能。

手順は以下の通りで、入力に対して動的に量子化を行うdynamic quantizationと異なり、いくつかのテキストサンプルを用意しておく必要がある。
またinc特有のgraph moduleへの変換が必要と少々複雑。

  • データの準備および単語分割を行う
  • Trainerおよび精度の評価を行う処理を作成
  • 量子化のConfigを作成
  • 量子化したいモデルをGraph Moduleに変換
  • モデルを引数に受け取り、そのモデルの精度の評価結果を返す処理を作成
  • 量子化の実行

量子化した結果が下記で、量子化の理論と整合するようにdyanmicよりもstaicの方が早くなる。

推論はCPU上で行い、batch sizeは1で行っています。 またMARC-jaとJSTS、JNLIはmax lengthを512に設定し、JCommonsenseQAは64に設定しました。 また推論時間4は開発データそれぞれの平均としています。

スクリーンショット 2022-08-23 22 37 18

精度については似たり寄ったりだが、やはり量子化による悪化は見られる。 dynamicよりもstaticの方が精度がいいのは推論時に入力されるサンプルが、scale factorを決める際に使ったサンプルと似ているからであろうか? 理論的にはdyamicの方が良くなるらしいが...

スクリーンショット 2022-08-23 22 37 53

コメント

同じくレトリバのブログでonnx runtimeでstatic optimizationを行う実験であったり、各種ライブラリでdynamic optimizationを行う実験などがされているが、実装の難易度だったり、GPU利用、推論時間やモデルサイズとかを総合的にみるとonnx runtimeによるdynamic optimizationに軍配が上がるかなぁという感じ。

以下はそれら関連記事の実行速度などの比較

dynamic optimization

今回はLivedoorニュースコーパスを利用して、記事が与えられた時にその記事が属するカテゴリを分類するタスク(9クラス分類)で検証しました。 推論はCPU上で行い、batch sizeは1、max lengthは512で行いました。 また推論時間3はテストデータそれぞれの平均をとしています。

スクリーンショット 2022-08-23 22 44 08

スクリーンショット 2022-08-23 22 44 15

onnx runtimeでのstatic quantization

推論はCPU上で行い、batch sizeは1、max lengthは512で行いました。 また推論時間3はテストデータそれぞれの平均をとしています。

スクリーンショット 2022-08-23 22 45 37

出典

GENZITSU commented 1 year ago

Accelerate Vision Transformer (ViT) with Quantization using Optimum

transformersに実装されているViTをoptimumで量子化する方法の紹介。

やり方はBERTの時とほぼ同じでonnx モデルに変換後ORTQuantizerを用いて量子化を行うだけ。

記事中では精度の劣化はほぼなく、実行速度が2.6倍になったらしい。 (タスクが豆の葉の3分類ですが...)

スクリーンショット 2022-08-23 23 08 59

スクリーンショット 2022-08-23 23 09 09

この推論はcpu上での推論であることに注意。vit意外と早いんだなーという感想。

Note: dynamic quantization is currently only supported for CPUs, so we will not be utilizing GPUs / CUDA in this session. 参考issue

コメント

自然言語処理用のモデルも画像系のモデルも統一的に量子化できるのすごいなー

気になって調べてみたのだがoptimumでのquantizationはdynamic / staticともにCPUのみサポートらしいです

Note: Static quantization is currently only supported for CPUs, so we will not be utilizing GPUs / CUDA in this session. 参考

GPUを使う時はfloat16とかで推論させるとか、onnxruntime-gpuを使うとかになるのかなぁ。

出典

Accelerate Vision Transformer (ViT) with Quantization using Optimum

GENZITSU commented 1 year ago

Solafuneのマルチ解像度画像の車両検出コンペ - MMDetectionでやってみた

solafuneの車両検出コンペを題材にMMdetectionの使用方法、および最近CAから発表されたOptimal Correction Costの導入方法が紹介されている。

学習中に随時OC-costを算出できるようにするためには、専用のdatasetクラスを作成しないといけないのがちょっとめんどくささい。

コメント

メモ

出典