Kaggle金牌方案分享!圖表內(nèi)容識別大賽baseline
賽題名稱:Benetech - Making Graphs Accessible
賽題鏈接:https://www.kaggle.com/competitions/benetech-making-graphs-accessible
賽題背景
數(shù)以百萬計的學生有學習、身體或視力障礙,導(dǎo)致人們無法閱讀傳統(tǒng)印刷品。這些學生無法訪問科學、技術(shù)、工程和數(shù)學 (STEM) 領(lǐng)域的大多數(shù)教育材料。存在使書面文字易于訪問的技術(shù)。但是,對于圖形等教育視覺對象執(zhí)行此操作仍然很復(fù)雜且需要大量資源。因此,只有一小部分教育材料可供具有這種學習差異的學習者使用——除非機器學習可以幫助彌合這一差距。
賽題方向
計算機視覺、圖文描述
賽題任務(wù)
本次競賽的目標是提取由STEM教科書中常見的四種圖表表示的數(shù)據(jù)。參賽者將開發(fā)一個在圖形數(shù)據(jù)集上訓練的自動解決方案。
參賽者的工作將有助于數(shù)百萬有學習差異或殘疾的學生能夠閱讀圖表。
評價指標
單個圖形的數(shù)據(jù)系列包含兩個用于評估的實例:沿 x 軸的一系列值和沿 y 軸的相應(yīng)值系列。每個數(shù)據(jù)系列可以是數(shù)字類型,也可以是分類類型,具體取決于圖表類型。
圖形約定參閱:https://www.kaggle.com/competitions/benetech-making-graphs-accessible/overview/graph-conventions
預(yù)測數(shù)據(jù)系列通過兩個指標的組合進行評估:分類(即字符串)數(shù)據(jù)類型的 Levenshtein 距離和數(shù)值數(shù)據(jù)類型的 RMSE,圖表類型和序列中的值數(shù)具有初始完全匹配標準。這些距離中的每一個都通過 S 形變換重新縮放并映射到公共相似性尺度,其最佳值為 1:

提交文件
提交文件中的每一行都應(yīng)該包含測試集中圖形的一個軸的預(yù)測序列。例如,abc123 x將給出圖abc123中x軸的預(yù)測。系列的值應(yīng)該在單個字符串內(nèi),并由;分隔。參賽者還必須為軸所屬的圖表提供適當?shù)念愋汀?/p>
該文件應(yīng)包含標頭并具有以下格式:
數(shù)據(jù)描述
本次比賽的數(shù)據(jù)集包括約65,000個綜合注釋的科學圖形,分為垂直條形圖、水平條形圖、點圖、折線圖和散點圖五種。
文件和字段說明:
train/annotations/ 描述圖形的JSON圖像注釋集合
train/images/ JPG格式的數(shù)字集合,用作訓練數(shù)據(jù)
test/images/ 收集用作測試數(shù)據(jù)的數(shù)據(jù)
sample_submission.csv 格式正確的提交文件
賽題獎金
第一名 - 15,000 美元
第二名 - 10,000 美元
第三名 - 8,000 美元
第四名 - 7,000 美元
第五名 - 5,000 美元
第六名 - 5,000 美元
金牌方案
第一名
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418786

我的解決方案由兩步組成:第一步使用分類模型對圖表類型進行分類,第二步對數(shù)據(jù)系列進行推斷。
在數(shù)據(jù)系列推斷階段,條形圖、折線圖和散點圖通過為每個圖表類型單獨訓練的Deplot進行端到端預(yù)測,而散點圖則通過基于目標檢測的方法預(yù)測。
最終得分如下:

數(shù)據(jù)集
1.比賽數(shù)據(jù)集(comp_extracted_dataset/comp_generated_dataset)
使用了提取數(shù)據(jù)集(comp_extracted_dataset)和生成數(shù)據(jù)集(comp_generated_dataset)。
對生成的數(shù)據(jù),通過簡單檢查去除了注釋中存在噪聲的數(shù)據(jù)(約100張圖片)。
2.ICDAR數(shù)據(jù)集(ICDAR_dataset/ICDAR_manualannot_dataset)
我使用了提供了注釋的數(shù)據(jù)1406件(ICDAR_dataset)和沒有提供注釋的數(shù)據(jù)1903件(ICDAR_manualannot_dataset)。
對于提供了注釋的數(shù)據(jù),我視覺重新檢查了注釋內(nèi)容,并手動修正了所有沒有遵循比賽注釋規(guī)則(例如%表示法)或包含噪聲的數(shù)據(jù)。
對于沒有提供注釋的數(shù)據(jù),我首先視覺檢查了所有數(shù)據(jù)的外觀,選擇了可以在本次比賽中使用的數(shù)據(jù)。接下來,我使用Deplot模型推斷并賦予偽標簽,再次視覺檢查所有結(jié)果,并手動修正所有不正確的注釋。
3.生成的合成數(shù)據(jù)集(synthetic_dataset)
在檢查了比賽數(shù)據(jù)集中的圖像后,確定comp_generated_dataset本身的變化不足以實現(xiàn)魯棒性,因此我又自行生成了約65k個合成數(shù)據(jù)。
我主要生成了comp_generated_dataset沒有的特征的合成數(shù)據(jù)。
直方圖
標簽包含換行
帶誤差棒的條形圖
包含數(shù)據(jù)系列中沒有的x標簽的折線圖
第二名
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418430
我的解決方案完全基于從google/matcha-base
骨干微調(diào)得到的圖像文本模型。如下圖所示,訓練流程包含兩個階段。在第一階段,我利用大量合成圖表來適配當前任務(wù)的骨干模型。在第二階段,我使用過采樣的提取/非生成圖表來使流水線專門適應(yīng)真實世界的圖表。在這個階段,我為散點圖和非散點圖創(chuàng)建了獨立的模型,主要是為了緩解預(yù)測散點數(shù)據(jù)點的難度。
第一階段使用合成數(shù)據(jù)對骨干模型進行預(yù)訓練,第二階段使用真實數(shù)據(jù)進行微調(diào),最終獲得一個適合真實世界圖表的圖像文本模型。兩階段訓練使模型既能從合成數(shù)據(jù)中獲取概括能力,也能從真實數(shù)據(jù)中獲取針對真實圖表的擬合能力。獨立處理散點圖也是提高性能的一個關(guān)鍵決策。

1.模型
所有模型共享相同的架構(gòu)(圖像到文本的transformer)和輸入輸出模式。模型輸入直接是圖表圖像本身,沒有任何提示。輸出文本遵循以下模板:
一些細節(jié):
數(shù)值被轉(zhuǎn)換為科學計數(shù)法,使用 val = "{:.2e}".format(float(val))。
增加了直方圖作為額外的圖表類型,在后處理中將其轉(zhuǎn)換為垂直條形圖。
2.數(shù)據(jù)
合成數(shù)據(jù)集
我花費了大部分時間來創(chuàng)建合成數(shù)據(jù)集。合成圖表中的基礎(chǔ)數(shù)據(jù),我使用了:
維基表格數(shù)據(jù),即來自維基百科的表格(25%)
合成XY數(shù)據(jù)(75%)
合成數(shù)據(jù)集包括:
10萬個橫向條形圖
10萬個垂直條形圖+直方圖
10萬個散點圖
20萬個折線圖
20萬個散點圖
合成數(shù)據(jù)集 - Bartley
從@brendanartley分享的合成數(shù)據(jù)集中隨機選擇了2.5萬個數(shù)據(jù)點:https://www.kaggle.com/datasets/brendanartley/benetech-extra-generated-data
偽標記(Pseudo Labelling):我從維基共享資源(wikimedia commons)截取了大約700張圖片。我使用了偽標記,并進行了手動修正,以生成注釋。
ICDAR數(shù)據(jù)集:我使用了約1100張來自ICDAR的圖片,只使用那些有1個XY系列的(250條水平條形圖 + 450條垂直條形圖 + 250條折線圖 + 150個散點圖)。我還進行了后處理,以確保注釋與比賽圖表慣例匹配(例如處理百分比、插值線圖數(shù)據(jù)以匹配刻度標簽等)。
3.數(shù)據(jù)混合(Datamix)
數(shù)據(jù)混合1:用于域適應(yīng)

數(shù)據(jù)混合2:散點圖專用

數(shù)據(jù)混合3:非散點圖專用

4.訓練
訓練的主要超參數(shù)是max_patches
和max_length
。我在不同的訓練階段使用了以下設(shè)置:
第一階段訓練
max_patches: 2048
max length: 1024
lr: 5e-5
batch size: 2
gradient accumulation: 16
第二階段訓練 - 非散點圖
max_patches: 4096
max length: 512
lr: 2e-5
batch size: 4
gradient accumulation: 2
第二階段訓練 - 散點圖
max_patches: 3072
max length: 1024
lr: 2e-5
batch size: 8
gradient accumulation: 1
AWP
作為小細節(jié),我在訓練過程中使用了模型權(quán)重的指數(shù)移動平均(EMA)、梯度截斷和線性熱身的余弦調(diào)度器。
5.數(shù)據(jù)增強
由于我重復(fù)使用了多次提取的圖像,所以我決定包括以下增強:
第三名
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418420

我們的解決方案是一個兩步流水線,第一步是一個簡單的分類任務(wù),第二步針對不同的圖表類型解決任務(wù)。對于散點圖,我們使用了檢測方法。對于折線圖和條形圖,Matcha的表現(xiàn)非常強勁。下面是我們的LB分數(shù):

驗證與見解
第一步 - 分類:在這一步中沒有太多花哨的東西,我們在(benetech + theo + crodoc)生成的數(shù)據(jù)上訓練模型。

主要參數(shù):
2個周期對88k張圖像進行訓練。
學習率3e-4或5e-4(混合使用2個學習率,我們也用了2個隨機種子))。
使用Mixup和一些顏色增強。
圖像尺寸為256x384。
NfNet-l2并添加0.2的dropout。
第二步.a - 散點圖

對于散點圖,我們依賴于YoloX來檢測所有標記。Cached被用來處理其他有用的元素。如果所有點都被正確檢測,推斷目標并不復(fù)雜:檢測刻度線和標簽,讀取標簽值,并插值。
更多細節(jié):
集成YoloX-m和YoloX-l,使用NMS,有助于減少假陰性。
模型在散點圖和點圖的benetech生成數(shù)據(jù)上訓練了10個epoch,以及我生成并偽標注的一堆繪圖。
內(nèi)部驗證集0.67,公開LB約0.09,私有LB 0.29 - 性能下降幾乎完全來自重疊/難以檢測的標記。
大量后處理來使流水線更具魯棒性,抵御OCR錯誤和檢測錯誤。
我們最初使用Yolo-v7,但由于第一次規(guī)則更改,不得不切換到Y(jié)oloX。我們花了一個星期的時間用YoloX匹配Yolo-v7的性能。
第二步.b - 點圖
點圖流水線類似于散點圖,但更簡單一些。我們檢測點并進行聚類,然后將它們映射到檢測到的x軸標簽。沒有分配簇的標簽被賦值為目標0,其他的給定檢測到的點數(shù)。由于點數(shù)對檢測錯誤不太穩(wěn)健,我們改為使用最高點的高度并進行插值。
第二步.c - 條形圖和折線圖
Matcha在這里非常強大。我們使用了matcha-base
,并將is_vqa
設(shè)置為False,以避免將文本作為輸入給模型。
我們訓練Matcha為一張圖像預(yù)測圖表類型、x軸和y軸。ground truth看起來與@nbroad用于他的donut方法相同(除了我們刪除了提示符號)。我們嘗試了其他方法,但這個效果最好:
我們獲得的最有價值的提升是使用matplotlib生成額外的圖表。我們重用了訓練集的數(shù)據(jù)值和文本來生成刻度線和值,使用不同的樣式/模式/字體/顏色來增加多樣性。生成額外圖像的代碼有大約1000行,基本上覆蓋了模型在“提取”數(shù)據(jù)集上驗證時的大多數(shù)失敗情況(例如負值、線條邊緣、缺失的條形、多行文本、文本旋轉(zhuǎn)等)。
第四名:?
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418604
第五名:?
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418477
第六名:?
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418466
第七名:?
https://www.kaggle.com/competitions/benetech-making-graphs-accessible/discussion/418510
掃碼添加小享,回復(fù)“圖表識別”
獲取金牌方案baseline代碼合集
