Baseline | 2019 DCIC《 文化傳承—漢字書法多場景識別》
- 2019 年 10 月 8 日
- 筆記
2019 DCIC已經開賽一個月了,據說華為賽題比較有難度,小編特此搜羅到一位妹子大佬的Baseline,為各位參賽者提供思路~
本文在OCR模型上花6個小時,僅訓練了10個epoch,在排行榜A榜得到0.42的F1,筆者目測再訓練久一點F1>0.80是肯定有的。
作者 | 小阿呂
來源 | 一碗數據湯
大賽介紹
2019數字中國創新大賽(Digital China Innovation Contest, DCIC 2019)由福建省數字福建建設領導小組辦公室、福建省工業和信息化廳、福州市人民政府、中國電子信息產業發展研究院和數字中國研究院聯合主辦,第十二屆全國政協副主席王欽敏擔任大賽總顧問。作為第二屆數字中國建設峰會的重要組成部分,本屆賽事分為大數據、人工智能、工業互聯網三大類算法題,旨在解決數字經濟建設發展中的痛點、難點,推動新一代信息技術和傳統產業的深入融合,助力數字中國建設。
賽題名稱
文化傳承 – 漢字書法多場景識別
(Cultural Inheritance – Recognizing Chinese Calligraphy in Multiple Scenarios)
賽題背景
法是漢字的書寫藝術,是中華民族對人類審美的偉大貢獻。從古至今,有大量照亮書法藝術星空的經典之作,是中華文明歷經漫長歲月留下的藝術精華。這些書法作品現在仍以各種形式呈現給世人:博物館裏的字畫作品、旅遊景點裏的碑刻、建築上的題詞、對聯、牌匾、甚至尋常家居里也會懸掛帶有書法藝術的字畫。在全球化、電子化的今天,書法的外部環境有了非常微妙的變化,對於年輕一代,古代書法字體越來越難以識別,一些由這些書法文字承載的傳統文化無法順利傳承。 所以利用先進的技術,實時、準確、自動地識別出這些書法文字,對於記錄整理書法藝術和傳播書法背後的中國文化有着重要的社會價值。
賽題任務
書法是中華民族文化傳承的瑰寶,希望此次大賽能夠通過人工智能算法實現書法文字的自動識別,解決實際場景中有些書法文字難以識別的問題。要求參賽者給出測試數據集中每張圖片中文字的位置及對應的內容。推薦參賽者在華為雲ModelArts開發平台上完成訓練和預測任務。
本次大賽會提供已標註的訓練圖片集供參賽者開發訓練生成模型和算法,參賽者用開發&訓練生成的模型和算法識別測試圖片集中每張圖片書法文字的內容以及文字對應的位置並提交競賽平台,以參賽者提交的結果準確率作為競賽排名成績的依據。
寫在前面
本文使用EAST模型作為文字框檢測模型https://github.com/argman/EAST , 在文字識別OCR模型上使用西安交通大學人工智能實踐大賽第一名@ yinchangchang 的方案https://github.com/yinchangchang/ocr_densenet
本文代碼均已開源在且已經修改成了可以在ModelArts訓練的格式,可以對比開源的EAST和OCR代碼,查看修改了哪些地方。 本文在OCR模型上花6個小時,僅訓練了10個epoch,在排行榜A榜得到0.42的F1,筆者目測再訓練久一點F1>0.80是肯定有的。
在ModelArts上訓練的注意事項: 1.需要修改文件保存、修改、讀取的方法,具體請看1.2節; 2.訓練是將OBS上的啟動文件所在目錄下載到GPU機器上運行,GPU機器用戶路徑為/home/work/,如需要下載數據到機器上,推薦下載到/cache/目錄下(機器上的所以數據在一次訓練作業完成後,都會清空); 3.請及時查看作業運行狀態,以免造成代金券浪費;
EAST
EAST數據處理
為了節省優惠券以及線上操作時間,在上ModelArts之前,先將數據處理完成後再上傳。解壓所有下載的數據包。

EAST需要一張圖對應一個.txt格式的數據,代碼里的convert_to_txt.py可以將訓練集方便地轉換成需要的格式,其中convert_to_txt.py里的數據路徑需要改成自己的數據路徑,

將得到的數據上傳到在OBS上創建的路徑如

ModelArts使用注意點
ModelArts使用注意點:
1.如果發現沒有某個python庫,需要在訓練腳本里加上「os.system(『pip install xxx』)」,系統會自動安裝這個庫;
2.無法直接使用open方法讀寫OBS上的文件,需要使用moxing.Framework.file.File代替open,如open(『input.txt』,』r』)-> moxing. Framework.file.File(『input.txt』,』r』);
3.Glob也需要moxing.Framework.file.glob;
4.一般情況下,ModelArts的每個引擎都對保存checkpoint方法做了對OBS路徑的適配,如果發現不能保存也可以將checkpoint路徑設置為」./xxx」或者「/cache/xxx」,然後再使用mox.file.copy('./model.ckpt', 's3://ckpt/model.ckpt') 將EAST代碼上傳到OBS:

使用ModelArts創建訓練作業,注意不能使用notebook創建,notebook里沒有GPU資源,而且使用notebook也只能暫時保存數據,一旦關閉後,數據都會清空,而且不關閉notebook,會消耗大量代金券。但是使用OBS存儲的數據不會清空,使用創建作業方式訓練可以節省代金券。
使用ModelArts訓練EAST

之後選擇數據存儲路徑和使用的引擎,啟動文件等,

再輸入使用腳本需要的相應參數

參數列表:
gpu_list=0
input_size=512
batch_size_per_gpu=14
checkpoint_path_obs=s3://tcd_public/ckpt
text_scale=512
training_data_path_obs=s3://tcd_public/data/east/
geometry=RBOX
learning_rate=0.0001
num_readers=24
選擇計算資源,並保存作業參數,以便下次使用,就可以開始運行了(18塊錢真的貴)。

點擊運行,

最終在ckpt文件夾下面會生成幾個模型,如圖所示(只訓練了一個step) ,

推理測試
在訓練到一定精度後,就可以測試了。同樣創建作業,選擇test數據集,使用EAST里的eval.py腳本,輸入必要參數,就可以開始運行。


之後在OBS的data目錄下會出現output.txt文件,裏面的每行包含測試圖片的名字和4個x和y的點。

OCR
生成ocr數據
數據主要包含以下要求:
- 1.開源的第一名代碼需要使用一個train.csv,包含name和content兩個字段的文件
- 2.訓練OCR需要截取原圖的數據中的每一列文字,這裡只簡單使用最大的xy坐標截取;
- 3.生成測試數據集;
- 4.所有數據集均保存到data/dataset/train/和test/下,可以少改些代碼;
本文只使用了訓練數據集,沒有將驗證集加入訓練,如要取的更高的精度,應該將驗證集也加入訓練。 在線下使用ocr中的makedata.py生成訓練所需要的數據格式,替換makedata.py里數據的相關路徑。其中目標路徑最好填寫為ocr/data/dataset/train/和ocr/data/dataset/test/,input_file是指文字檢測模型的推理輸出output.txt,output_file是作品樣例提交文件。


再在code中的preprocessing下運行map_word_to_index.py和analysis_dataset.py對數據做分析和文字提取,這個操作會在ocr/file/下生成訓練的文字和圖片的相關文件。
處理完數據就可以將ocr下所有代碼和數據都上傳OBS了。
當然如果覺得線下數據上傳到OBS速度較慢,可以選擇使用ModelArts的notebook,此時需要先下載原數據到notebook的機器上,如data_path=』/cache/data』, from moxing.framework import file file.copy_parallel(data_path_obs, data_path) 處理完數據後,再上傳到OBS上, file.copy_parallel(你在/cache/下處理完後的數據路徑, ocr需要的數據路徑如/ocr/data/dataset/train/)
創建OCR訓練作業
訓練策略幾乎與開源的方案一樣,但是比賽使用的數據是豎排的,這裡簡單在dataloader.py里使用transpose轉置成橫向的。 創建作業,輸入參數:

之後點擊確定開始運行,幾個step之後可以看到,loss在下降了,等到差不多十個epoch,花了大概6小時。(本人只訓練了10個epoch,訓練更多個epoch以及如果再加上源碼中的hard mining可以得到更高的分數)。

這裡設置每一個epoch保存一次ckpt,在save-dir-obs路徑下可以看到ckpt文件。

推理預測
用main.py做預測,設置phase為test,設置resume參數使用的ckpt路徑,設置為GPU機器上的/cache/路徑,參數如圖,

最終可以在OBS路徑上看到predict.csv的文件,下載就可以上傳到比賽官網了。

