Thursday 竞赛分享
2019 DCIC已经开赛一个月了,据说华为赛题比较有难度,小编特此搜罗到一位妹子大佬的Baseline,为各位参赛者提供思路~
本文在OCR模型上花6个小时,仅训练了10个epoch,在排行榜A榜得到0.42的F1,笔者目测再训练久一点F1>0.80是肯定有的。
赛题名称
文化传承 – 汉字书法多场景识别
(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代码,查看修改了哪些地方。
baseline的GitHub链接:https://github.com/DataFountainCode/huawei_code_share
本文在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的文件,下载就可以上传到比赛官网了。