第九屆軟體杯(第二批)基於深度學習的企業實體識別
本賽題分為三個模組:文字檢測、文字識別、命名實體識別。
賽題要求將圖片中的所有文字檢測並識別出來,並從識別出的文字中提取出企業名稱。
文字檢測模組
資料準備
ICDAR2019-LSVT資料集,下載並解壓後的資料集如下:
~/train_data/LSVT/text_localization
└─ LSVT_train_imgs/ LSVT訓練集
└─ LSVT_test_images/ LSVT測試集
└─ train_LSVT_label.txt LSVT訓練標註
└─ test_LSVT_label.txt LSVT測試標註
模型選擇
文字檢測使用的方法是DB-ResNet-50。
通過下載預訓練模型,在LSVT資料集上進行finetune。
# 執行以下命令,生成的檢測結果在detect_results資料夾中
python3 predict_det.py --image_dir="./testImages" --det_model_dir="./inference/det/"
檢測效果
文字識別模組:
資料準備
文字識別選擇的資料是ICDAR2019-LSVT行識別任務資料集,共包括29萬張圖片,其中21萬張圖片作為訓練集(帶標註),8萬張作為測試集(無標註)。資料集採自中國街景,並由街景圖片中的文字行區域(例如店鋪標牌、地標等等)截取出來而形成。所有影象都經過一些預處理,將文字區域利用仿射變化,等比對映為一張高為48畫素的圖片,如圖所示:
(a) 標註:魅派整合吊頂
(b) 標註:母嬰用品連鎖
模型選擇
模型選擇的是端到端的CRNN模型,CRNN的思想就是通過CNN網路提取文字影象的特徵,然後轉化這些特徵用於RNN(LSTM)識別具體的文字內容。一般處理文字資料時最先想到的就是LSTM模型,這是因為文字的理解和處理必須在特定的語境(上下文)中進行,LSTM模型的輸入通常都是學習到或者人工設定的詞向量,CRNN的一個最大的優點就是通過預訓練的CNN網路直接從影象中學習文字的表達向量,在最大程度上保證輸入到LSTM的序列是最好的表達。如下圖是CRNN的網路結構。
# 執行以下命令可以生成一個result.txt檔案,內容是圖片中識別到的所有文字,列印的內容可以看到每張圖片的檢測+識別時間 python3 predict_det_rec.py --image_dir="./testImages" --det_model_dir="./inference/det/" --rec_model_dir="./inference/rec/"
識別效果
命名實體識別模組:
資料準備
-
該模組的難點在於資料的準備,從初賽到決賽我們試了很多種方法去搭建資料集,但都沒有得到一個非常令人滿意的資料集。
-
我們採取的方法是首先從LSVT資料集的train_weak_labels.json標籤檔案中提取圖片中的企業店鋪名稱,初賽通過爬蟲建立語料庫,但資料量極大,資料清理工作難以進行,故決賽時我們嘗試利用MSRA資料集,將企業店鋪名稱替換掉MSRA資料集中的NT實體類別。雖然在邏輯上語義略顯滑稽,但該模組的任務並不是在一個具有上下文語義的環境下完成,故做此嘗試。
-
如何處理一張圖片識別出的所有文字,用以進行命名實體識別也是一個問題,我們嘗試將所有文字以逗號句號等字元連線,作為一條語料進行識別,效果因字元的不同而變化,且非常不穩定,最終我們選擇將一張圖片中識別到的每一個文字框中的文字作為一條語料進行識別,效果較之前有所提高。
-
同時我們使用了面積作為輔助識別,如果一張圖片中沒有提取出企業名,那麼就選擇文字檢測+識別時目標框最大的文字作為企業名。
模型選擇
- 模型選擇的是albert模型,這個模型相比於bert,體積更小,效果更好。
# 執行一下命令可以提取企業實體名稱
python predict_ner.py
做的並不好,只是單純記錄下軟體杯經歷。