chineseocr / darknet-ocr

darknet text detect and darknet cnn ocr
MIT License
1.13k stars 288 forks source link

关于crnn的迁移训练问题和一些测试得出的感悟 #65

Open wdr123 opened 4 years ago

wdr123 commented 4 years ago

作者你好 我想用你的crnn模型进行迁移训练 因为你的字符集好像缺少一些特殊符号 如黑五角星等,这在我的医学化验单识别的工作中需要 请问该怎么增加少量character进行迁移训练呢?而且得找一个有黑五角星等特殊字符的开源数据集吧?如果方便,能给一下完整训练代码吗?

另外,貌似这次ctpn的检测效果比chineseocr的yolo好一些,yolo会有一部分漏检,ctpn几乎没有(我的化验单都是水平文本行,可能ctpn比较擅长检测水平文本行也有可能)对于水平文本行的文档而言,我觉得你的后处理有时候会降低效果,get_boxes函数感觉有点多余,直接提取前一步的text_lines的前四项构成水平文本框就挺好,不用再拟合了。还有horizontal_gap直接取大一点也可以,这样不仅避免了小文本的漏检,对准确率影响不大,因为你的crnn对一整行文本的识别效果也超赞。

哦,还有一点想问,对于医学化验单这种带表格线的水平印刷体文档,有什么提升效果的特化建议吗?

wenlihaoyu commented 4 years ago

绝对水平的情况下,可以不用get_boxes。医学类,可以去检测图像上的某些关键字或者词语(三个四个不在同一直线的上的词语,或者多找几个,计算最优的一组),然后基于这些词的位置,建立仿射变换(某一类配置一张模板),这样的好处,可以做到非常高的准确率。或者启用二次检测。可以用现在字符集的不常用几个字符去替换你需要的字符,然后微调模型,再把微调的模型的权重与原模型权重进行线性组合。黑五角星这样的特殊字符,可以找相应的字体构造数据训练即可。

wdr123 commented 4 years ago

[现在我通过形态学算法已经达到了比较好的文本检测效果,如下 1_res 00013_res 是不是不用做仿射变换了?那个是提升文本检测效果的吧?二次检测等有空我尝试一下 现在在进行crnn的微调训练识别特殊字符,目前字符集除了原本的5000个汉字标点符号,还添加了希腊字母,某些特殊图形符号等。按照https://blog.csdn.net/Gavinmiaoc/article/details/83176507教程的附2进行微调迁移训练 还想问一下的是 按照教程中的训练集生成算法https://github.com/Belval/TextRecognitionDataGenerator 是不是在input_file里自由组合一下全部字符集比只用希腊字母和特殊字符自由组合生成input_file要好一些,因为可以让训练集分布更均匀,避免过拟合? 还有目前打算用https://github.com/JarveeLee/SynthText_Chinese_version项目去生成一些背景更真实的特殊字符训练集,但是我看这个项目是用来进行 text localization文本定位的?它有label信息吗?如果作者你用过的话麻烦告知下 十分感谢!

wdr123 commented 4 years ago

还有一件事 对于像素低的图片(经过测试height<1000) 即使文本定位感觉已经很准了,但是crnn识别还是错误率很高,这个问题怎么解决?(PS:对于像素高的图片问题不存在,crnn效果非常棒,是不是当时训练crnn的时候用的都是像素比较高的图片啊?)

wdr123 commented 4 years ago

还有一个问题 我之后要做化验单分列(即板式恢复的工作)所以希望把列之间的空格识别出来 以便后续分列(作者你的字符集里没有空格,而且ctc算法会把空格都省略掉) 这个是不是也是在字符集添加空格然后生成带空格符号的训练集迁移训练就行呢?用不用手工标注一些自然图片?还有模型识别出的空格会是什么情况,是任何间隔比较大的空白都会识别成一个空格吗,还是多个空格?

wdr123 commented 4 years ago

非常感谢!期待您的回复。

wdr123 commented 4 years ago

已经迁移训练成功 This question can be closed Thanks for attention.

wenlihaoyu commented 4 years ago

空格问题,要看你训练的时候怎么处理,如果按照字体大小把空白区域处理成多个字符,可能很难收敛,可以将字符间的空格只当成一个特殊字符,解码环节还原成多个空格(根据估算的字体大小)即可。如果要对以前未标注空格的数据,自动标注空格,可以采用如下方法,对一个文本行图片,步长在文本行的宽上面取8或者16的整数倍像素移动,然后输入模型,然后结合上次输出结果及每个字符的概率,某个字符概率小的舍弃(可以是移动的时候没有取到完整字符),就可以得到空格。

wenlihaoyu commented 4 years ago

目前我在其他模型中,字符间的空格,只处理成单个字符,然后微调模型最后一层参数,然后把原来的最后一层权重迁移到新模型,空格的权重用原来的blank的权重替代,其他字符你也可以这样处理,比如你要新增“黑五角星”字符,那么可以在原来字符中找一个相似的字符,用它的权重进行初始化,这样模型很快收敛了,所需的数据集也很少。测试结果如下: image

wdr123 commented 4 years ago

OK. Thanks for the instruction.

redgatech commented 4 years ago

[现在我通过形态学算法已经达到了比较好的文本检测效果,如下 1_res 00013_res 是不是不用做仿射变换了?那个是提升文本检测效果的吧?二次检测等有空我尝试一下 现在在进行crnn的微调训练识别特殊字符,目前字符集除了原本的5000个汉字标点符号,还添加了希腊字母,某些特殊图形符号等。按照https://blog.csdn.net/Gavinmiaoc/article/details/83176507教程的附2进行微调迁移训练 还想问一下的是 按照教程中的训练集生成算法https://github.com/Belval/TextRecognitionDataGenerator 是不是在input_file里自由组合一下全部字符集比只用希腊字母和特殊字符自由组合生成input_file要好一些,因为可以让训练集分布更均匀,避免过拟合? 还有目前打算用https://github.com/JarveeLee/SynthText_Chinese_version项目去生成一些背景更真实的特殊字符训练集,但是我看这个项目是用来进行 text localization文本定位的?它有label信息吗?如果作者你用过的话麻烦告知下 十分感谢!

方便请问你怎么进行微调迁移训练? 是在base on作者的model(model/ocr/chinese/ocr.weights)嗎? 感谢.

wdr123 commented 4 years ago

我进行的CRNN的微调迁移训练 base on的是作者的ocr-lstm model 使用这个项目进行迁移训练https://github.com/Aurora11111/crnn-train-pytorch 是替换最后的rnn.1层为新的字符集重新训练的 数据集是ChineseString DataSet 360w个文本行图片 github可以搜到 可以识别特殊字符 但是效果没作者的原版模型好 可能是数据源不太行 只有白底黑字的图片

redgatech commented 4 years ago

我进行的CRNN的微调迁移训练 base on的是作者的ocr-lstm model 使用这个项目进行迁移训练https://github.com/Aurora11111/crnn-train-pytorch 是替换最后的rnn.1层为新的字符集重新训练的 数据集是ChineseString DataSet 360w个文本行图片 github可以搜到 可以识别特殊字符 但是效果没作者的原版模型好 可能是数据源不太行 只有白底黑字的图片

感谢你的回覆.

luthorLI commented 4 years ago

检测图像上的某些关键字或者词语,请问这个有什么比较好的方法吗?