有啥tricks

  • 13

    获得赞
  • 0

    发布的文章
  • 2

    答辩的项目

手写英文字体识别

Batch大小为32,循环次数为10次,通过在线上环境完成训练,模型最优精度评分为86.28。

最后更新 2020/10/27 16:03 阅读 7488

手写英文字体识别(名企内推)

最后更新 2020/10/27 16:03

阅读 7488

CNN RNN

1. 数据说明  

该数据集包含通过慈善项目收集的超过40万个手写英文姓名。由于个人手写风格的差异化,对于机器识别手写字符来 说仍然构成困难的挑战. 说是有40万个手写英文, 实际上线上训练时, 只有20万, 其中16万用于训练, 4万用于测试.  

2. 模型介绍  

 我的代码是基于github上一个中文识别的项目修改而来.  

baseline代码链接:https://github.com/Sierkinhane/CRNN_Chinese_Characters_Rec.git       

image.png

上图来自https://zhuanlan.zhihu.com/p/43534801,  大致结构如上图, 只是把输入改为32x280x1, 

 为什么用灰度图呢? 我的理解是图片色彩单一(背景白,字体黑), 跟色彩关系不大. 好吧,我也尝试过用彩色图, 但效果跟用灰度图效果差不多, 所以还是采用灰度图,这样还能减少计算量.

 3. 图片处理:: 

预处理: 通过对数据集的查看, 发现有些图片除了手写字外,还有印刷体   

image.png

image.png

 像上面这种高,宽比较大的图片, 可以经过粗略裁剪,裁掉一部分印刷体  

image.png

image.png

 当然, 这只是一种粗略裁剪, 注意:测式部分也进行这种裁剪, 最后发现涨了0.3点左右. 

 裁剪代码: 

img = cv2.imread(os.path.join(self.root, img_name)) 
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_h, img_w = img.shape 
if img_h >= 60:  
  img = img[25:,:] 
if img_w >= 350:     
  img = img[:,65:] 

 数据增广方式: 

  1.  调整(resize)图像 (32,280);
  2.  填充(pad); 
  3.  调整图像的亮度,对比度,饱和度;   
  4.  中心裁剪(center crop) (32, 280) 
  5.  归一化(Normalize), mean=0.588, std=0.193  

在训练时,通过以上方法进行数据增强, 最终发现能涨点,具体多少(0.2左右吧),记不清了.

transform = T.Compose([T.Resize((32,280)),                           
             T.Pad(20,fill=255),                            
             T.ColorJitter(brightness=0.2, contrast=0.5, saturation=0.5, hue=0.2)]) 
img = transform(img) 
img = T.functional.center_crop(img, (32,280))
img = img.astype(np.float32) / 255. 
img = (img - self.mean) / self.std  

超参数设置:  

  1.   优化器Adam, lr=1e-3,  betas=(0.8, 0.999); 
  2.  Epochs=25, batch_size=256;  
  3.  训练集:验证集 = 9.9 : 0.1;

 字典设置(dict): 对16万训练集的label进行统计, 统计结果:C --> 34115E --> 135526I --> 87163L --> 80646A --> 134526P --> 14748U --> 48264M --> 41983R --> 74414T --> 50672N --> 83781K --> 6988O --> 68384S --> 45651Y --> 15367D --> 30327F --> 9132B --> 22963G --> 19653J --> 7850--> 5390- --> 3282H --> 30978V --> 12531Q --> 2618X --> 5690Z --> 7102W --> 2786' --> 107l --> 3e --> 5m --> 2o --> 5n --> 1t --> 1s --> 3y --> 1u --> 1c --> 3r --> 5i --> 2b --> 1a --> 4f --> 2z --> 1p --> 1,    发现还有一些小写字母, 但占的比例很少, 所以对label进行处理, 把小写变成大写.  

最终字典: alphabet = "~'-ABCDEFGHIJKLMNOPQRSTUVWXYZ空格", 第一个字符表示空白(占位符) 

其它尝试(没有提升): 

1. 在cnn中增加了注意力模块, 空间注意力和通道注意力模块 

2. 采用广义池化

 3. 使用resnet50作为骨干网络

 4. 使用ranger优化器 

本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://flyai.com/n/153514
立即参加 手写英文字体识别(名企内推)
代码展示

CNN RNN

选择查看文件
$vue{codeKeys}
  • $vue{ix}
赞赏贡献者还可以查看和下载优质代码内容哦!
赞赏 ¥37.99元
©以上内容仅用于在FlyAI平台交流学习,禁止转载、商用;违者将依法追究法律责任。
讨论
500字
表情
每日优质讨论奖励 20FAI
发送
每日优质讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除
感谢您的关注
该篇内容公开后我们将会给你推送公开通知
好的
发布成功!
您的公开申请已发送至后台审核,
通过后将公开展示本详情页!
知道了
向贡献者赞赏
¥37.99
微信支付
支付宝

请先绑定您的微信账号 点击立即绑定

立即支付
温馨提示:
支付成功后不支持申请退款,请理性消费;
支付成功将自动解锁当前页面代码内容,付款前请确认账号信息。
微信扫码支付
请前往Web网页进行支付

敬请谅解,如有疑问请联系FlyAI客服

知道了
举报
请选择举报理由
确定
提示
确定要删除?
取消删除

今日签到成功

获得 $vue{sianData.sign_fai} FAI的GPU算力积分

知道了