kaggle Benetechコンペ 上位解法まとめ
はじめに
与えられたグラフチャート画像からデータ系列の読み取りを行うBenetech - Making Graphs Accessible というkaggleコンペが2023/6/20まで開催されていました。
コンペ終了後に公開された上位チームの解法からたくさん学びがあったので、備忘録も兼ねてまとめていきたいと思います。
コンペ概要
-
STEM分野の教科書、論文で使用されるグラフチャート画像から、チャートタイプとデータ系列を予測するモデルの精度を競うコンペでした。
-
チャートタイプは全部で5種類(VerticalBar、HorizontalBar、Line、Dot、Scatter)あり、それぞれのチャートタイプごとに決まったルールでデータ系列を読み取る必要があります。
- 詳細はコンペページにまとまっているので、気になる方はそちらを参照してください。
-
コンペデータとして約60000枚の画像が提供されていますが、そのうち本当の論文から抽出されたデータは1000枚程度しかなく、他は全て擬似的に生成されたデータとなっています。
- Dataタブにて、PublicLBで使用されるデータは学習データと同じデータソースから集められた実際の抽出データ、PrivateLBで使用されるデータは学習データとは異なるデータソースから集められた実際の抽出データであることが明言されていたため、ロバスト性を保ちつつ精度を上げることが要求されます。
上位チーム解法まとめ
1. Approach
- このコンペタスクに対するアプローチ方法は、大きく2通りの方針があります。
1. Pix2Structモデルを用いてEnd-to-Endで系列を予測する
2. いくつかのDetectionモデルとOCRモデルを組み合わせて系列を予測する - 1の方法は画像エンコーダと自然言語デコーダを組み合わせた深層学習モデルを学習させて、データ系列をE2Eで予測するアプローチです。
- 2の方法は、Detectionモデルでラベル位置や目盛り、プロットデータなどチャート要素の位置を検出し、OCRモデルでラベルテキストを読み取り、それらを対応づけることでデータ系列を予測するアプローチです。
- コンペ中はそこまで活発に議論されている印象はありませんでしたが、一定数こちらのアプローチを取っている人もいました。
- E2Eの方法と比べると処理は多段で複雑になり、人の知識ルールを適用する必要などもあるためパイプラインは複雑になりますが、未知データに対するロバスト性という観点ではこちらの方法にも大きなメリットはあったのかなと思います。
- 前述した通り、1の方法はscatterに対して弱いという欠点があるため、それを補うためscatter以外はE2Eモデル、scatterのみDetection+OCRを用いるハイブリッドアプローチを取っているチームも多かったです。
- ソリューション公開している上位チームのアプローチ方法をまとめると以下のような感じで、トップ層はハイブリッドアプローチが多かったようです。
Approach | Teams |
---|---|
E2E | 2nd, 6th |
Detection+OCR | 7th, 8th, 13th |
ハイブリッド | 1st, 3rd, 4th, 5th, 14th |
2. Dataset
合成データセット
- 今回のコンペで提供されたデータセットのうち、擬似生成されたデータはあまり多様性が無く、多くのチームが自作で合成データを作成して学習に使用していました。特に上位チームはちゃんと与えられたデータセットを確認して、提供された生成データセットに含まれない特徴(エラーバーを持つBar、凡例がプロットエリア内に含まれる、etc...)を持つデータを中心に多様性を意識した合成データセットを作成していました。(引用:1st, 4th, 5th, etc...)
- E2Eアプローチを取る場合、データの多様性が少ないと簡単にオーバーフィットしてしまうため、E2Eアプローチを選択したほぼ全ての上位チームは自作データセットを作成していたようです。
外部データセット
- (だいぶ紆余曲折はありましたが、)このコンペでは外部データセットの使用が認められていたため、外部データセットを活用しているチームも多くありました。
- コンペ主催者が紹介していたICDARデータセットがよく使用されていましたが、wikipedia commonsやPubMedなどの別な外部データセットを使用しているチームもありました。(引用:2nd, 6th)
- 外部データセットにはラベルがついていない場合もあり、多くのチームは擬似ラベル付与→手動修正という方法でアノテーションをしていました。
- 特にPrivateデータセットは新規のデータソースから抽出された実チャート画像であると提示されていたため、今回のコンペでは学習だけでなく検証に外部データセットを活用することも一つのキーだったように思います。
3. Train
マルチステップ学習
- まず全チャートタイプのデータを使って学習を行い、その学習結果を初期重みとして特定のチャートタイプのデータのみを使用して追加の学習を行うことでチャートタイプごとに特化させたモデルを学習するスキームを採用しているチームがいくつか見られました。(引用:1st, 2nd, 5th)
- ただし細かな部分は十人十色で、チームごと特徴がありました。
- 1stチームは全データで第一段階の学習を行い、VerticalBarとLineのみ抽出データを中心に追加で1~2回の学習を行い特化モデルを学習させています。
- 2ndチームも第一段階は全データで学習を行い、第二段階で「scatter以外」と「scatterのみ」に分けて追加学習を行っています。2ndチームはE2Eアプローチを採用していましたが、多くの合成/外部データセットを用いたマルチステップ学習でscatter特化のモデルを作成することで,上手くscatter対策を取っていたようです。
- 5thチームは3段階のマルチステップ学習を採用していました。第一段階では全データを使ってチャートタイプのみを予測するE2Eモデルを学習、第二段階ではそれをベースに全データでデータ系列を予測するモデルを学習、第三段階で各チャートタイプごとのデータのみを使用してチャートタイプに特化させたモデルを学習させています。
アップサンプリング
- 抽出データ(実データ)の割合が非常に少ないので、学習時にアップサンプリングすることでより効率的に学習させているチームもいました。(引用:2nd)
- 4thチームはアップサンプリングと似ていますが、各エポックでデータセットごとに一定の比率でランダムにサンプリングしたサブデータセットを用いて学習をする方針を採用していました。恐らくアップサンプリングと同様の効果を得られるとともに学習時間も短縮できるので、より効果的な方法だったのかなと思います。
Augmentation
- 今回のタスクでは画像の向きや文字領域が映っているかどうかが重要になるので、一般的な画像タスクで用いられるような回転や拡大・縮小といったaugmentationは使用されませんでしたが、代わりにNoiseやColor系などOCRを不可能にしないaugmentationがよく使用されていました。(引用:1st, 3rd, etc...)
- 特にアップサンプリングを行う場合、同じデータが何度も出現することになるため、Augmentationが非常に重要だったと述べられています。(引用:2nd)
- また、6thチームのソリューションではPixelDropoutと呼ばれるAugmentationが過学習を抑制するのに役立ったと述べられており、スコアアップの一つのキーだったようです。(引用:6th)
Aux Loss
- 3rdチームはデータ系列と同時にチャートタイプも出力し、分類問題として同時に扱い、Cross Entropy損失を補助損失として利用していました。
- 6thチームは既存のデコーダとは別に補助用デコーダを準備してエンコーダに連結させ、x軸とy軸の値を逆にしたGround Truthを出力し、その損失を補助損失として使用していたようです。計算量が非常に多くなりそうな気がしましたが、実際の計算量の大半を占めているのはエンコーダ部分であり、デコーダを増やしてもそこまで計算時間は増えなかったようです。
4. Predict
Detectionベース チャート要素検出
- E2Eアプローチは学習時に様々な工夫をして推論時にはスタンダードに推論を行っている印象でしたが、Detection+OCRアプローチは対照的に推論時にマニュアルルールを追加したり様々な検出モデルを組み合わせて工夫を行っている印象でした。
- 一例として、7thチームは下記のような工夫を行っていたようです。
- ラベルが斜めの場合があるので、ラベル検出時にはPolygonで検出する
- Lineチャートの線検出にはセマンティックセグメンテーションを使用する
- VerticalBarがヒストグラムかどうかの判定にセグメンテーションを利用する
- etc...
PostProcess
- 6thチームはScatterのみUnetを用いた後処理を活用して精度を上げていたようです。Unetで点の数をカウントし、E2Eモデルが出力した点の数と異なる場合に削除もしくは平均値で補完を行うことでデータ系列数のズレを軽減していたようです。(今回のコンペのメトリクスの特性上、データ系列数がGTと異なると無条件でスコア0となってしまうため、点の数を補正する処理が非常に有用だったと考えられます。)
- 6thチームもE2Eアプローチを採用していましたが、この後処理でscatter対策を行っていたようです。
アンサンブル
- 今回のコンペで使用されていたE2Eモデルは生成モデルのため、そもそもアンサンブルをすること自体が難しく、他コンペと比べてもあまりアンサンブルは有効ではなかったように思います。ですが、それでも上手くアンサンブルする方法を構築し、スコアアップを実現しているチームもいくつか見られました。
- 3rdチームは4つのE2Eモデルを使用し、それぞれの出力のデータ系列数から明らかな間違いを除外したり、カテゴリラベルの投票や数値ラベルの平均化を行うことでスコアアップを行っていたようです。
- 6thチームはE2Eモデルのデコーダの出力を平均化することで内部的にアンサンブルを行っています。
上位に入るためのキーポイント
あくまで実際に参加してみた所感とソリューションを読んだ私見になりますが、今回のコンペで上位に入るためには以下の点が重要だったんじゃないかなと考えています。
- Scatterの精度をいかに安定的に向上させられたか
- 汎化性能を十分に得られる量の外部/合成データを収集できたか
Scatterの精度をいかに安定的に向上させられたか
-
今回のコンペでは、学習データとPublicデータのチャートタイプ分布は比較的類似していましたが、Privateのチャートタイプ分布は大きく異なっておりScatterが約50%を占めるほど多く含まれていました。そのため、そもそもPrivateLBで上位へ行くためにはScatterの予測性能が高いことが絶対条件となっていました。
- ちなみにチャートタイプの分布の情報は公式に発表されていたわけではありませんが、LB Probingを行うことである程度、予想することは可能だったようです。
-
前述の通り、E2Eモデルは明らかにScatterが苦手な傾向にあるため、無対策でE2Eモデルを使用したチームはこの分布の影響を強く受けて大幅なシェイクダウンをしてしまったと思われます。
-
更にある程度上位のチームは当たり前のように何かしらの対策をしているので、その中でいかに精度を上げられる工夫ができたかどうかが重要だったように思われます。
汎化性能を十分に得られる量の外部/合成データを収集できたか
- 冒頭にも書いた通り、テストデータは全て実データ(抽出データ)ですが、コンペで提供された実データは非常に少ないため、いかに実データ(もしくは実データに限りなく類似した合成データ)を集められるかどうかで最終的な汎化性能に差が出たのではないかと思います。
- Detection+OCRアプローチの場合は、人の知識をルール化して組み込むことができるのでデータの少なさに対する影響を比較的抑えることも可能ですが、E2Eモデルの場合は完全にデータ依存で性能が決まるため、データの質の違いがスコアに出たように思います。
- 特にE2Eアプローチを採用したチームはほぼ必ずコンペデータではカバーできていない特徴を持ったオリジナルの合成データを大量に生成している、もしくはICDARデータセットだけでなく別の外部データセットを活用して大量の実データを収集・アノテーションしており、それらを正しく学習・検証に使用したことでPrivateでも大きくシェイクしないソリューションになったのではないかと思います。
まとめ
上位チームの解放を一通り読んで、上位にいくためには必要条件を満たしつつ、その中でいかに工夫をすることが出来るかが大事なんだなぁということを学びました。自分の場合は、その必要条件を直感と偶然で見つけることが多いので、ちゃんと論理的に考えてたどり着けるようになりたいです。。。
また、このコンペのタスクはシンプルながら非常に興味深く、様々なアプローチを考えることができて参加していてとても面白いコンペでした。(コンペの運営自体は色々と思うところはありましたが。。。)
多くの考え方を学ぶことが出来たので、これからのコンペや業務に活かしていきたいと思います。
Discussion