Giter Site home page Giter Site logo

senlinuc / caffe_ocr Goto Github PK

View Code? Open in Web Editor NEW
1.3K 96.0 537.0 29.83 MB

主流ocr算法研究实验性的项目,目前实现了CNN+BLSTM+CTC架构

C++ 86.97% Cuda 12.05% C 0.07% CMake 0.10% Batchfile 0.01% Python 0.72% Shell 0.09%
ocr lstm ctc res-lstm densenet

caffe_ocr's Introduction

简介

caffe_ocr是一个对现有主流ocr算法研究实验性的项目,目前实现了CNN+BLSTM+CTC的识别架构,并在数据准备、网络设计、调参等方面进行了诸多的实验。代码包含了对lstm、warp-ctc、multi-label等的适配和修改,还有基于inception、restnet、densenet的网络结构。代码是针对windows平台的,linux平台下只需要合并相关的修改到caffe代码中即可。

caffe代码修改

 1. data layer增加了对multi-label的支持
 2. lstm使用的是junhyukoh实现的lstm版本(lstm_layer_Junhyuk.cpp/cu),原版不支持变长输入的识别。输入的shape由(TxN)xH改为TxNxH以适应ctc的输入结构。
 3. WarpCTCLossLayer去掉了对sequence indicators依赖(训练时CNN输出的结构是固定的),简化了网络结构(不需要sequence indicator layer)。
 4. densenet修改了对Reshape没有正确响应的bug,实现了对变长输入预测的支持。
 5. 增加transpose_layer、reverse_layer,实现对CNN feature map与lstm输入shape的适配

编译

  1. 安装opencv,boost,cuda,其它依赖库在3rdparty下(包含debug版的lib:http://pan.baidu.com/s/1nvIFojJ)
  2. caffe-vsproj下为vs2015的工程,配置好依赖库的路径即可编译,编译后会在tools_bin目录下生成训练程序caffe.exe
  3. 相关的依赖dll可从百度网盘下载(http://pan.baidu.com/s/1boOiscJ)

测试

  1. 编译caffe-vsproj/libClassification,修改自examples\cpp_classification,实现了模型加载、预测等基本功能。
  2. 编译caffe-vsproj/ocr_test,实现了中文、英文ocr模型的测试功能,英文ocr包含了直接预测和词典辅助预测(英文词典文件examples/ocr/lexicon.txt)

实验

  1. 数据准备
     (1)VGG Synthetic Word Dataset
     (2)合成的中文数据(链接:https://pan.baidu.com/s/1TXeZUcpVOUxrtfRtWKMSGg 提取码:ujjc )
  •   数据是利用中文语料库(新闻+文言文),通过字体、大小、灰度、模糊、透视、拉伸等变化随机生成的。
  •   字典中包含汉字、标点、英文、数字共5990个字符(语料字频统计,全角半角合并)
  •   每个样本固定10个字符,字符随机截取自语料库中的句子
  •   图片分辨率统一为280x32
  •   共生成约360万张图片,按9:1分成训练集、验证集,测试集约6万张
  1. 网络设计
      网络结构在examples/ocr目录下
  2. 主要实验结果
  • 英文数据集 VGG Synthetic Word Dataset:
网格结构 predict-CPU predict-GPU 准确率-no lexicon 准确率-lexicon-minctcloss 模型大小
crnn 67.13ms 10.28ms 0.8435 0.9163 32MB
inception-bn-res-blstm 41.62ms 8.68ms 0.7353 0.8609 15MB
densenet-res-blstm N/A 6.07ms 0.7548 0.893 11MB
  • 中文数据集:
网格结构 predict-CPU predict-GPU 准确率 模型大小
inception-bn-res-blstm 65.4ms 11.2ms 0.92 26.9MB
resnet-res-blstm 64ms 10.75ms 0.91 23.2MB
densenet-res-blstm N/A 7.73ms 0.965 22.9MB
densenet-no-blstm N/A 2.4ms 0.97 5.6MB
densenet-sum-blstm-full-res-blstm N/A 7.83ms 0.9805 15.5MB
densenet-no-blstm-vertical-feature N/A 3.05ms 0.9816 9.6MB

中文数据集上训练好的模型:http://pan.baidu.com/s/1i5d5zdN

说明:

  •   CPU是Xeon E3 1230, GPU是1080TI
  •   densenet使用的是memory-efficient版本,其CPU代码并没有使用blas库,只是实现了原始的卷积操作,速度非常慢,待优化后再做对比。
  •   “res-blstm”表示残差形式的blstm,“no-blstm”表示没有lstm层,CNN直接对接CTC
  •   准确率是指整串正确的比例,在验证集上统计,"准确率-no lexicon"表示没用词典的准确率,"准确率-lexicon-minctcloss"指先在词典中查找Edit Distance <=2的单词,再选择ctcloss最小的单词作为识别结果
  •   predict-CPU/GPU为单张图片的预测时间,predict-CPU的后端是openblas,MKL比openblas快约一倍。中文数据集上图片分辨率为280x32,英文数据集100x32
  •   densenet-sum-blstm-full-res-blstm相对于densenet-res-blstm有两点改动:(1)两个lstm结合成blstm的方式由concat改为sum;(2)两层blstm都采用残差方式连接(CNN最后的Channel数改为与blstm结点数相同),最后得到了最高的准确率。
  •   densenet-no-blstm-vertical-feature相对于densenet-no-blstm去掉了1x4的pooling层,使得CNN最后一层的feature maps的高度为4,更好的保留笔画在垂直方向的变化信息,再reshape BxCxHxW --> Bx(CxH)x1xW串成高度为1的feature maps, 最后准确率上略好于之前的最好结果,可见CNN feature方面还有很多可挖掘的地方。
  1. 一些tricks
     (1) 残差形式的blstm可显著提升准确率,中文数据集上0.94-->0.965,两层BLSTM都用残差后又提升到了0.9805
     (2) 网络的CNN部分相对于BLSTM部分可以设置更高的学习率,这样可以显著增加收敛速度
  2. 疑问
     (1)去掉blstm,直接用CNN+CTC的结构,在中文数据集上也可以取得很高的准确率(densenet-no-blstm),为什么?
         可能的原因:a)CNN最后一层得到的特征对于字符级别的建模已经具有很好表征,b)lstm收敛较慢,需要更长的时间才能达到相同的精度。
  3. 现存的问题
     (1)宽度较小的数字、英文字符会出现丢字的情况,如“11”、“ll”,应该是因为CNN特征感受野过大没有看到文字间隙的缘故。

提高准确率TODO

 1. 数据方面: 增大数据量,语料库均匀采样(https://yq.aliyun.com/articles/109555?t=t1)
 2. 网络方面:增大网络(train、test loss很接近,现有网络没有过拟合),Attention,STN,辅助loss

引用

  1. crnn(https://arxiv.org/abs/1507.05717)
  2. multi-label的支持(http://blog.csdn.net/hubin232/article/details/50960201)
  3. junhyukoh实现的lstm版本(https://github.com/junhyukoh/caffe-lstm)
  4. caffe-warp-ctc(BVLC/caffe#4681)
  5. memory-efficient densenet(https://github.com/Tongcheng/caffe/)
  6. 语料库(http://www.sogou.com/labs/resource/cs.php)

caffe_ocr's People

Contributors

senlinuc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

caffe_ocr's Issues

英文模型训练

你好,我想请问一下,我用英文数据训练模型,更改了image_data_layer.cpp中数据读取的部分,使list中的label基于lexion转换成每个字母的label序列,网络结构中label数由5990改为37,另外设置new_width:100,new_height:32。
这样修改完,直接运行,但loss一直不降,请问我上面的过程哪里是有问题的吗?谢谢~~

Accuracy Drop on Inception and DenseNet

Hi senlinuc,

Thanks for your kindly sharing:).
I noticed that you've tried many improvements based on standard crnn. But there is a significant accuracy drop(especially no lexicon case) with more powerful cnn structures such as inception net and densenet. Do you have some analysis on this? Is it caused by parameter reduction or some thing else? It will be great if you could share your configs for mjsynth experiments. I'm very curious about the 3 models' cnn settings.

Thanks.

网格结构 predict-CPU predict-GPU 准确率-no lexicon 准确率-lexicon-minctcloss 模型大小
crnn 67.13ms 10.28ms 0.8435 0.9163 32MB
inception-bn-res-blstm 41.62ms 8.68ms 0.7353 0.8609 15MB
densenet-res-blstm N/A 6.07ms 0.7548 0.893 11MB

训练脚本

方法做的挺全的,能不能放个小样本和训练脚本给熟悉下啊

关于网络

中文的网络只能是280*32么 我自己修改了尺寸 caffe就跑不起来了 需要注意写什么 ?

可否公开一下生成中文训练数据的代码?

三百多万的中文数据集是从新闻语料中自动生成的
说真的,生成的真不错,加入的噪音和模糊与真实条件下的噪音模糊非常相似
能否公开一下生成数据的代码呢?不胜感激

为什么把中英文实验分开做呢?

在中文实验上很明显backbone(特征提取网络)增强之后,结果变好了。但是真是情况应该是中英文混合,或者整个测试集里面既有英文也有中文,以我的经验来看,感受野大了之后,对英文来说未必是好事。所以backbone的那一栏实验结果,不知道在混合数据集上表现如何?

方便透漏下个人邮箱吗?希望和你通过邮箱有进一步交流。

关于no-blstm的一些疑惑

你好!我看了cnn+blstm+ctc的网络结构,cnn最后输出的是一系列的向量,经过blstm转换成每个向量的预测分布,最后由ctc得到结果。
README中提到“no-blstm”表示没有lstm层,CNN直接对接CTC。这样是如何将向量序列得到预测分布呢?
或者请给我一篇相关论文,不胜感激!

关于训练样本中的label的制作

您好,我看了example/ocr下的例子,对label.txt看不太懂,你的label限定是列文本吗?是不是“label1 ;text1;label2;text2”这种形式?

大数据的训练问题

请问作者在360万图片下是怎么训练的?也是采用小批次一点一点训练的么?如果是的话大概训练多久?

Multilabel

你好,修改代码支持mulitilabel的时候按照你发的链接就可以么?因为我发现你的代码跟这个链接的还不太一样.

增加新样本不收敛了

按照您的样本标签重新生成了一批彩色样本,很快就收敛了,可是又增加了100w样本后,无论重新训练还是加载原来的作初始值都不收敛了,大神有什么建议吗,谢谢

30248421_451177396

关于样本生成的一些疑问

您的数据集上都使用了哪些字体?是否每个字在不同字体中都要生成?
如果我要加入一些带下划线的数据,在您的数据集上,应该加多少合适?
噪声是用的什么方法?感觉加的不够,自己想多加点。

你好,windows下加载你的sln出错

senlinuc,你好
我clone下来你的代码,用vs15打开sln,显示caffe.vcxproj加载错误,暂时没有找到原因,请问你那里工程师可以正常打开的吗

想问下验证集训练的识别率是多少

你好,从合成的中文数据(https://pan.baidu.com/s/1dFda6R3 )百度网盘下载的图片中有个train.txt里面有
3279606张图,还有个test.txt有364400张,你那张中文数据集的6种不同网络结构的识别率的表格是用了测试集约6万张的数据吗?这个是不是没有在百度网盘的那个图片集合里。
想问下这个“共生成约360万张图片,按9:1分成训练集、验证集,测试集约6万张” 你说的训练集、验证集和测试集的图片都是用同样的方法生成的吗?如果是同样方法生成,那验证集的识别率和测试集应该差不多的吧,想问下你这个6个验证集训练的识别率是多少?

测试程序,开启ONLY_CPU,运行不正常,结果为空;CUDNN下运行正常.

ONLY_CPU结果:
I1120 15:23:28.928501 5788 net.cpp:270] This network produces output result
I1120 15:23:28.928501 5788 net.cpp:283] Network initialization done.
I1120 15:23:28.942502 5788 net.cpp:761] Ignoring source layer data
I1120 15:23:28.946501 5788 net.cpp:761] Ignoring source layer ctcloss
[1/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436312_168344715
2.jpg:
[2/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436328_800384098
.jpg:
[3/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436765_255613035
7.jpg:
[4/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20437703_937698549
.jpg:

CUDNN模式 下运行正常:
I1120 16:06:40.445502 6980 net.cpp:228] input does not need backward computatio
n.
I1120 16:06:40.445502 6980 net.cpp:270] This network produces output result
I1120 16:06:40.445502 6980 net.cpp:283] Network initialization done.
I1120 16:06:40.460501 6980 net.cpp:761] Ignoring source layer data
I1120 16:06:40.464501 6980 net.cpp:761] Ignoring source layer ctcloss
[1/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436312_168344715
2.jpg: 美国人不愿意与朝鲜人
[2/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436328_800384098
.jpg: 姻缘也许在以前就已经
[3/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20436765_255613035
7.jpg: 35机队使用的技术风
[4/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20437703_937698549
.jpg: 业(**)公司是亚洲
[5/5]F:\paper\caffe\caffe_package\caffe_package\tools\ch_test\20440484_212718063
0.jpg: ?”已而大悟,她坚持

语料库

你好,能否提供一下你的中文语料库呢,不胜感激

在VS2015+win10配置上,编译出现cundnn错误。

Severity Code Description Project File Line Suppression State
Error (active) declaration is incompatible with "const char *__stdcall cudnnGetErrorString(cudnnStatus_t status)" (declared at line 102 of "c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include\cudnn.h") caffe d:\DeepLearning\caffe_ocr\include\caffe\util\cudnn.hpp 20

我目前电脑的配置是win10+cuda8.0+cudnn5.0,请问原文中的cudnn的版本是?

测试程序出错Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Input (known types: )

网络现在有些问题,无法上传完整日志文件,日志文件开头及结尾:

WARNING: Logging before InitGoogleLogging() is written to STDERR
I1120 08:55:48.745501 7100 net.cpp:58] Initializing net from parameters:
name: "ResNet"
state {
phase: TEST
level: 0
}
layer {
name: "data"
type: "Input"
top: "data"
input_param {
shape {
dim: 1
dim: 1
dim: 32
dim: 280
}
}
}
................
..............
layer {
name: "result"
type: "CTCGreedyDecoder"
bottom: "fc1x"
top: "result"
}
I1120 08:55:48.745501 7100 layer_factory.hpp:77] Creating layer data
F1120 08:55:48.745501 7100 layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Input (known types: )

请教这个问题原因可能会在哪个地方?谢谢.
看日志应该是input层有问题,我的protobuf版本为3.3.

你好

senlinuc你好,感谢你的repo。
(1)请问有基于VGG Synthetic Word Dataset数据集的预训练模型可以提供下载么,
我现在测试了基于中文数据的Denseblock网络的识别效果,发现几乎只能识别印刷体的中文字符,这是由于训练样本造成的么

how to use only DenseBlock_layer

Hi, senlinuc, I want to use only your DenseBlock_layer, since I want to integrate it into caffe SSD branch. I know I should add include/caffe/layers/DenseBlock_layer.hpp, src/caffe/layers/DenseBlock_layer.cpp, src/caffe/layers/DenseBock_layers.cu, /src/caffe/test/test_DenseBlock_layer.cpp into the SSD branch of caffe. But this is not enough, because I suffer from error during compilation, Tongcheng's original git also gives on more detail. Can you help to figure out how to do this correctly? Thanks.

关于整合入linux版本caffe

您好,关于整合进linux版本caffe,目前卡在warp-ctc相关的几个层(编译总是报错),不知道是否需要特殊处理?

关于字符长度的问题

如果确定我的数据中只有7位和6位的,同时我的train.txt是按着顺序来的,这样每个batch里的就都是6位或者7位,那么还需要补blank么?

ocr_test densenet-no-blstm cpu模式前向识别报错: Trying to copy blobs of different sizes.

大家好,我这里应用ocr_test项目(densenet-no-blstm网络)测试多张图片识别效果时,当用gpu模式是可以顺利进行。但是,当我应用cpu模式时,会报错:Trying to copy blobs of different sizes.

简单分析以后,发现识别第一张图片时没有问题,但是识别第二张图片时,在DenseBlock_layer层会出现:source.count() != count_ 问题,进而引发报错信息!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.