0
点赞
收藏
分享

微信扫一扫

AIWIN OCR比赛总结

星河出山 2022-02-22 阅读 78

前段时间(2021.12)参加了AIWIN OCR比赛,也是学AI以来参加的第一场比赛。总结一下吧:baseline采用CRNN+CTC的方法,不少同学改成了CRNN+Attension方式,最后取得很好的成绩。CTC自然有弊端,但是百度也是采用这种方法,训练的不错。所以我还是采用CTC的方式,最后竟然达到99.98%(baseline号称是70%)。

我的结果飞桨AI Studio - 人工智能学习与实训社区

我主要做了下面几点优化:

1.baseline有个错误被我发现了,即将所有文字生成字典那里。此处第一位已给留给padding的。(要搞清楚算法真正设计思路)我改的代码:char_list = ['<EOS>'] + list(set(list(s)))。因为CTC算法遇到blank(默认为0)会结束,所以 要把'<EOS>'对应vocabulary的0。同时图片长短和label的长短不同,会进行padding操作,padding的也是0.这样恰好解决了原来字典0的元素无法出现的问题。

2.backbone的layer有些改动,relu改成swish,添加SENET,使得输出的特征图更好些

3.对训练集和验证集进行处理,baseline是所有的shuffle后进行分。但是忽视了样本原来分两类。所以我改成两组分别shuffle,然后再分训练集和验证集

4.图像增强的处理,增加了图像随机锐化的方法,同时提升了原图输入的比例,即把原来的两分类改成三分类,留了10%的原图概率

def data_enhance(img):
    prob = np.random.uniform(0, 1)
    img = random_crop(img)
    if prob > 0.55:
        img = random_brightness(img)
        img = random_contrast(img)
        img = random_saturation(img)
        img = random_hue(img)
        img = random_sharpness(img)
    elif prob > 0.1:
        img = random_brightness(img)
        img = random_saturation(img)
        img = random_hue(img)
        img = random_contrast(img)
        img = random_sharpness(img)
    return img

5.经过训练(batch=32)后,发现打新出来的日志准确率很高,进行4张图片一起验证,结果也可以,但进行单张图片验证,结果很不理想。我估计应该是batchnorm之类的问题,或图片及label长度不一致,导致的互相之间有影响。我进行了调整batch=32训练完后,改为batch=4再训练,然后改为batch=2进行训练。最终结果非常好。

为什么模型的输出层是字典的长度?因为后面会有softmax函数算每一位是哪个字的概率

最后验证才用的Levenshtein距离,实际上结果不是很准,按照修改的位来计算,准确率会偏高。应该是只要和label不符就认为错。

举报

相关推荐

0 条评论