0. 背景

1. CTC原理



图 CTC结构图

CTC是看似和HMM有些联系,然后也采用DP来进行求解,将CTC结构图中<RNN输出,CTC层>单独拿出来,得到如下形式:



图 用前向-后向算法计算CTC

上图如CTC结构图,

  • 最开始只能以(-)或者标签序列中第一个字符开始,即这里的t=1时,是{(-),(C)};
  • 在结尾也只能以(-)或标签序列中最后一个字符结束,即这里的t=T时,是{(-),(T)};

所以,在所有的路径中,只有开始和结束的点算是确定的。不过值得注意的是,这里最开始和结束的空白符,分别是t=1的最开始空白符和t=T的结束空白符

训练tricks:

  • 1 - 标点符号:在建立数据集的时候,需要将中文的如[,.' ";:]等标点符号换成英文的,或者反过来,不要有两份一样的,因为目前不论是attention_ocr还是ctc都算是象形文字,所以模型看到中文分号和英文分号,总觉得是同一个东西,所以会分错;
  • 2 - 训练集:在建立数据集的时候,因为ctc_loss中有个sequence_length,所以,为了增加数据分布一致性和ctc的效率,最好先对图片对应的文字进行长度排序,比如前面100个样本的label都是小于5的字符串;后面100个都是小于10的字符串;后面100个都是小于15的字符串,等等。
  • 3 - batch间独立,batch内相等:在读取数据的时候,同一个batch中因为图片大小需要相同,而如果是全卷积网络,是可以让不同batch之间独立的。所以图片的缩放可以按照batch之间各自决定。比如第一个batch 读取长度小于5的label和图片,将其缩放到100*32;第二个读取长度小于10的label和图片,将其缩放到200*32;
  • 4 - 训练集双尾问题:为了数据的平衡性,需要将数据集中出现次数特别少的和出现次数特别多的label的样本删除,保证每个字符的频率都适中;

ps:字库可以去搜狗输入法上下载,然后将scel转换成txt,然后就能接着生成自己需要的了

ps:关于CRNN模型的训练集问题:

文字图片生成

'''在其中的colorize3_poisson.py中'''
l_out = blit_images(l_normal.color,l_bg.color.copy()) '''等同于http://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/
这里实现的泊松图像编辑中的混合模式,
所以整个项目中的poisson_reconstruct.py脚本可以删除'''
obj = l_normal.color
bgi = l_bg.color.copy()
mask = 255 * np.ones(obj.shape, obj.dtype)
width, height, channels = bgi.shape
center = (height//2, width//2)
mixed_clone = cv2.seamlessClone(obj, bgi, mask, center, cv2.MIXED_CLONE)
l_out = mixed_clone

在使用合成代码的时候,还是有一些问题的,如:

增加新背景图片用此合成的去做ocr

文字合成后属性问题

文本角度文本角度得到更大的文字更长的字调整字符间距

对比度问题

文本颜色渲染渲染问题调整生成的文字的对比度文字与背景对比度

图片分割问题

图片分割替换ucm

depth2xyz的bug生成裁剪的单词图片pt和px的问题文字在放置的时候区域的选择-lee平面上生成文字字符频率的意义

取消坡度粘贴:随机生成每个图片的depth即可,然后将plane2xyz中z = np.ones_like(z)*-0.1,使得该函数失效,每一个点的z轴高度一致,然后删除place_text中2个透视映射homography函数

整个图片都作为背景区域:将图片的seg修改为整个图片大小,然后计算其中的像素点,格式如原来。然后将get_text_placement_mask中place_mask前面加一句ROW=W;COL=H,使得每次都选取整个图片。

建议:可以在batch获取的时候,先统一高resize成32,然后取batch中最长的那个width为准,其他不足的以雪花点不全(先生成一个imgW*32的雪花点矩阵,且imgW很长)。从而防止图像失真。

猜测:上面的几个链接中,是先训练2个字的语料,然后逐渐上升到10个字的语料(虽然里面也有人说直接训练10个字的语料,这不是重点)。不过实际做inference的时候,该模型却能对应15甚至20个字的图片进行预测。所以个人猜测,是不是其实本身学习的也还是一种映射机制,即只是为了让整个模型能够将某些图像对应成某个字:



如上图中几个国字,因为“象形”,所以其实是为了学习不同背景,不同形状下的对应关系,所以其实背景的复杂程度加上字体本身的变化,颜色等等,才是数据集建立的关键,而lstm本身读取语料的语义虽然有纠错功能,不过却并不是识别的本质?

Recurrent Neural Network[CTC]的更多相关文章

  1. Recurrent Neural Network[survey]

    0.引言 我们发现传统的(如前向网络等)非循环的NN都是假设样本之间无依赖关系(至少时间和顺序上是无依赖关系),而许多学习任务却都涉及到处理序列数据,如image captioning,speech ...

  2. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  3. Recurrent Neural Network(循环神经网络)

    Reference:   Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...

  4. Recurrent Neural Network系列2--利用Python,Theano实现RNN

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  5. Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...

  6. Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM

    yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...

  7. 循环神经网络(Recurrent Neural Network,RNN)

    为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...

  8. Recurrent Neural Network[Content]

    下面的RNN,LSTM,GRU模型图来自这里 简单的综述 1. RNN 图1.1 标准RNN模型的结构 2. BiRNN 3. LSTM 图3.1 LSTM模型的结构 4. Clockwork RNN ...

  9. 【NLP】Recurrent Neural Network and Language Models

    0. Overview What is language models? A time series prediction problem. It assigns a probility to a s ...

随机推荐

  1. ionic 开发解决ios上qq客服链接不跳转或者跳转到appstore

    不能跳转的情况需要 在ionic项目根目录下,打开config.xml文件,在<access origin="*" />后添加<allow-navigation ...

  2. 安卓开发_浅谈AsyncTask

    现在就来学习一下AsyncTask. 一.先介绍一下AsyncTask: 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给 ...

  3. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 前台request 获取body的格式是正确的 (2018-03-23 16:44:22) 但是Java 后台却格式化成了yyyy-MM-dd的格式 巨坑(@InitBinder搞得贵)

    最近做项目时,同事写的功能总是格式化时间不正确,Java类属性明明注解了@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  但就是硬 ...

  4. json替换jsonp实现跨域请求

    最近遇到h5前端页面和web后端双方的请求存在跨域,普通的jquery.ajax请求已不能实现(因为js是不允许跨域的(如果可以跨域,那就能随便改别人的网页了),js的原理), 最后经过艰苦奋斗,终于 ...

  5. Python实现排列组合

    # -*- coding: utf-8 -*-"""Created on Sat Jun 30 11:49:56 2018 @author: zhen"&quo ...

  6. 洗礼灵魂,修炼python(27)--异常处理(1)—>了解异常

    python学到这,其实你应该是在入门到进阶的中间阶段了,但是还没有到进阶的阶段的,这是肯定的,因为进阶得可以从实际问题中解决问题的,比如写一个自动化的爬虫程序啊,对一件事物作大数据归纳分析,开发一个 ...

  7. 浅谈sql server聚集索引与非聚集索引

    今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...

  8. 【PAT】B1061 判断题(15 分)

    简单逻辑题, #include<stdio.h> #include<algorithm> using namespace std; int main(){ int N,M;// ...

  9. 第 16 章 C 预处理器和 C 库(预定义宏)

    /*------------------------------------- predef.c -- 预定义宏和预定义标识符 ------------------------------------ ...

  10. phpize安装php扩展CURL

    进入php源码包curl扩展目录 cd php-/ext/curl phpize ./configure --with-php-config=/usr/local/webserver/php/bin/ ...