项目目标:
从一张图片中的8个手写汉字中,找到两个一样的汉字,并给出位置
图片示例:
数据存储
为了更好的对数据进行保存,将数据统一存放在baidu网盘上,Projects/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_font12. 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