中文手写验证码识别

项目目标:

从一张图片中的8个手写汉字中,找到两个一样的汉字,并给出位置

图片示例:

中文手写验证码识别_第1张图片

数据存储

为了更好的对数据进行保存,将数据统一存放在baidu网盘上,Projects/captcha下

工程实现

整体思路

针对此类数据,采用传统方法分割,再分类的方法去识别

整个工程链接

https://github.com/JiangYongYu1/captcha

详细介绍

  • Code
    • ModelTf
      基于tensorflow1.14,实现的单字分类算法
      • backbone
        • resnet.py
          基于tensorflow的slim实现了resnet网络,
          为了适配onnx格式(tensorflow的pad默认是最优最少的pad,
          如3*3 stride=2的话右下pad就行,而pytorch和onnx都是
          四周padding),对stride=2的卷积进行了拆分,先pad再卷积
      • losses
        • loss.py
          loss文件
      • cfg.py
        配置文件,如字典、训练数据地址、验证数据地址等
      • classify.py
        分类模型实现
      • data_generator.py
        训练过程中的数据生成,实现了一个迭代器,不断生成训练数据,以及一个多进程的数据生成
      • train.py
        模型训练脚本,实现了模型搭建、优化器配置、训练、验证
      • ckpt_slim.py
        训练保存的模型ckpt文件存在优化器的信息,比较大,这边处理后得到的只有模型结构和权重
    • ModelPaddle
      • 基于paddlepaddle实现了整个工程,并完成了onnx转换及trt动态输入和推理的过程,复现了2019年tf1的结果
    • DataGenerator
      此项目只提供几百张测试图片,未提供训练图片,所有都需要自己去生成,因为是手写体,
      常规字体不能使用,爬虫了部分手写字体
      生成过程:
      1. python image_generator.py --data_path=/data/yujiangyong/Projects/products/rec_data1
        –font_path=/data/yujiangyong/baiduocr/ocr_font1
      2. python image_generator.py --data_path=/data/yujiangyong/Projects/products/rec_data2 --font_path=/data/yujiangyong/mathocr/mathhaoweilai/shou_font3
      • util
        • font_util.py
          字体文件解析,得到每个字体文件包含的文字数
        • gen_text_util.py
          根据文字生成图片
        • transform_util.py
          图像变换脚本
      • image_generator.py
        生成文字脚本
      • jian_cha_dict.pkl
        字符字典
    • PreviewsDemo
      2019年交付的模型demo,熟悉一下之前怎么做的,效果如何
      • models
        训练好的模型文件
      • demo.py
        使用的demo脚本,效果是直接识别出两个相同的字的精度是67.2%,使用余弦相似度来进行相同字的比较,精度是96.5%,但是里面求余弦距离好像存在问题,
        当时是这么做的,8_c的特征,进行点成,变成8 _8 *c的特征,然后取max,可以得到那两个特征在那个字符上的概率最大,而且差不多
      • demo_advance.py
        demo.py计算距离的时候,范数计算是有问题的,直接计算的是8*c的范数,并不是8个c的范数,这个demo脚本测试范数单独计算时的精度,此时的精度是95.99%
      • demo_debug.py
        采用正常的余弦相似度的计算方法来计算余弦距离,再进行精度统计,采用的softmax之后的特征来做的余弦距离计算,然后取max,此时的精度是95.8%,
        比上一种方法低
      • server.py
        在demo的基础上做了一些策略,当识别出两个一样的字的时候采用识别结果,当识别不出的时候采用余弦距离
      • read_ckpt_value.py
        读取ckpt里面的key和value,加载meta,再加载data,再打印variable
      • ckpt_show.py
        读取meta,然后写入log,tf.train.import_meta_graph()读取meta,tf.summary.FileWriter()写入log
      • cpkt_to_pb.py
        将ckpt模型转换为pb,由于模型既用了keras又用了tf,导致无法导出pb
  • images

你可能感兴趣的:(ocr,深度学习,人工智能)