Recurrent Neural Network[CTC]
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]的更多相关文章
- Recurrent Neural Network[survey]
0.引言 我们发现传统的(如前向网络等)非循环的NN都是假设样本之间无依赖关系(至少时间和顺序上是无依赖关系),而许多学习任务却都涉及到处理序列数据,如image captioning,speech ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network(循环神经网络)
Reference: Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...
- Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM
yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...
- 循环神经网络(Recurrent Neural Network,RNN)
为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...
- Recurrent Neural Network[Content]
下面的RNN,LSTM,GRU模型图来自这里 简单的综述 1. RNN 图1.1 标准RNN模型的结构 2. BiRNN 3. LSTM 图3.1 LSTM模型的结构 4. Clockwork RNN ...
- 【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 ...
随机推荐
- Docker 启动遇到 Error starting daemon: Error initializing network controller 错误
docker 版本 1.10.3 一台装有 docker 的机器重启后,没法启动,/var/log/messages 展示如下错误信息: May 17 11:11:14 gziba-hc03 syst ...
- React报错:Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix,
今天在开发时报了以下错误,记录一下 我们不能在组件销毁后设置state,防止出现内存泄漏的情况 出现原因直接告诉你了,组件都被销毁了,还设置个锤子的state啊 解决方案: 利用生命周期钩子函数:co ...
- 如何在服务器上搭建svn
svn现在依然是一个流行的版本控制工具,但是大多数的人员只会使用客户端,并且也知道可以进行权限控制, 那么今天,我们就来给大家梳理一下 1.如何搭建svn的服务器 2.如何进行svn的权限控制 === ...
- Apex的对象共享
Apex的对象共享 在Apex中,每个对象都有一个"共享"对象,其中存储了该对象的共享设定. 这种共享对象以"share"结尾.比如Account的共享对象是A ...
- loadrunner 脚本优化-关联设置
脚本优化-关联设置 by:授客 QQ:1033553122 关联的原理 关联也属于一钟特殊的参数化.一般参数化的参数来源于一个文件.一个定义的table.通过sql写的一个结果集等,但关联所获得的参数 ...
- eclipse显示代码行数
最近做的手机APP正在进行最后一部分了,在一个类中估计要写上千行代码,来回的拉动滚动条太麻烦了,于是发现为什么我得eclipse不显示代码行数呢 其他C什么的编译器都显示的. 于是百度了一下,一下子 ...
- Kotlin入门(4)声明与操作数组
上一篇文章介绍了基本变量类型在Kotlin中的用法,不过这只针对单个变量,如果要求把一组相同类型的变量排列起来,形成一个变量数组,那又该如何声明和操作呢? 在Java中声明数组,跟在C语言中声明是一样 ...
- 用PRODUCT_COPY_FILES拷贝文件夹
拷贝文件PRODUCT_COPY_FILES += device/qcom/msm8909/media/media_profiles_8909.xml:system/etc/media_profile ...
- Python笔记(十四):操作excel openpyxl模块
(一) 常遇到的情况 就我自己来说,常遇到的情况可能就下面几种: 读取excel整个sheet页的数据. 读取指定行.列的数据 往一个空白的excel文档写数据 往一个已经有数据的excel文档追加 ...
- 表单元素的required,autocomplete,list用法
required: 当在一个表单元素如:input中加上required属性时,点击提交表单按钮,针对input会弹出一个默认的警告信息,如下图: 代码如下: <form id="my ...