使用Python基于VGG/CTPN/CRNN的自然场景文字方向检测/区域检测/不定长OCR识别
GitHub:https://github.com/pengcao/chinese_ocr https://github.com/xiaofengShi/CHINESE-OCR
|-angle 基于VGG分类模型的文字方向检测预测|-bash 环境安装|----setup-python3.sh 安装python3环境|----setup-python3-cpu.sh 安装CPU环境|----setup-python3-gpu.sh 安装CPU环境|-crnn |-ctpn 基于CTPN模型的文本区域检测模型训练及预测|-model|----modelAngle.h5 文字方向检测VGG模型|----my_model_keras.h5 文本识别CRNN模型|-ocr 基于CRNN的文本识别模型预测|-result 预测图片|-test 测试图片|-train 基于CRNN的文本识别模型训练
环境要求:
python3.-cpu/gpugraphvizpydot(py)torchtorchvision
- 卸载旧版本的pytorch和torchvision
pip uninstall torchvision pip uninstall torch
- 安装pytorch
1)Anaconda搜索torch

2)选择标记处点开

3)Anaconda Prompt - conda install -c peterjc123 pytorch

- 安装torchvision
conda install torchvision -c pytorch # TorchVision requires PyTorch 1.1 or newer
离线安装pytorch1).whl安装
从pytorch官网https://pytorch.org/previous-versions/下载合适版本torch及torchvision的whl
# 直接对whl文件进行编译即可 pip install torch--cp36-cp36m-linux_x86_64.whl pip install torchvision--py2.py3-none-any.whl
2).tar.gz安装
下载对应版本的.tar.gz文件,并解压
# 进入解压目录,执行安装命令 python setup.py install
离线安装GCC(Tensorflow部分第三方模块需要GCC进行编译,所以在安装第三方的依赖包之前先安装GCC)
从https://pkgs.org/download/gcc下载gcc-4.8.5-28.el7_5.1.x86_64.rpm版本,并且在require部分下载所需要的rpm文件(根据报错缺失的rpm下载)
rpm -ivh gcc-4.8.5-28.el7_5.1.x86_64.rpm # 如果已经有旧的版本会报conflicts with错误 rpm -ivh gcc-4.8.5-28.el7_5.1.x86_64.rpm --force
模型
- 文本方向检测网络 - Classify(vgg16)
- 文本区域检测网络 - CTPN(CNN+RNN) - 支持CPU、GPU环境,一键部署 - 文本检测训练Github:https://github.com/eragonruan/text-detection-ctpn
- EndToEnd文本识别网络 - CRNN(CNN+GRU/LSTM+CTC)
文本方向检测
训练:基于图像分类模型 - VGG16分类模型,训练0、90、180、270度检测的分类模型(angle/predict.py),训练图片8000张,准确率88.23%
模型:https://pan.baidu.com/s/1Sqbnoeh1lCMmtp64XBaK9w(n2v4)
文本区域检测
基于深度学习的文本区域检测方法:http://xiaofengshi.com/2019/01/23/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-TextDetection/
CTPN(CNN+RNN)网路结构:

CTPN是一种基于目标检测方法的文本检测模型,在repo的CTPN中anchor的设置为固定宽度,高度不同,相关代码如下:
def generate_anchors(base_size=, ratios=[, ],
scales= ** np.arange(, )):
heights = [, , , , , , , , , ]
widths = []
sizes = []
for h in heights:
for w in widths:
sizes.append((h, w))
return generate_basic_anchors(sizes)
基于这种设置,CTPN只能检测水平方向的文本,如果想要CTPN可以支持垂直文本检测,可以在anchor生成函数上进行修改
对CTPN进行训练:
- 训练脚本 - 定位到路径:./ctpn/ctpn/train_net.py
- 预训练的VGG网络路径[VGG_imagenet.npy]:https://pan.baidu.com/s/1jzrcCr0tX6xAiVoolVRyew(a5ze) - 将预训练权重下载下来,pretrained_model指向该路径即可
- 模型的预训练权重[checkpoint]:https://pan.baidu.com/s/1oS6_kqHgmcunkooTAXE8GA(xmjv)
- CTPN数据集[VOCdevkit.zip]:https://pan.baidu.com/s/1NXFmdP_OgRF42xfHXUhBHQ - 下载解压后将.ctpn/lib/datasets/pascal_voc.py文件中的pascal_voc类中的参数self.devkit_path指向数据集的路径即可
端到端(EndToEnd)文本识别
OCR识别采用GRU+CTC[CRNN(CNN+GRU/LSTM+CTC)]端到端识别技术,实现不分隔识别不定长文字
CTC - CTC算法原理
CTC是一种解码机制,在使用CTPN提取到待检测文本行之后,需要识别提取到的区域内的文本内容,目前广泛存在两种解码机制。
- 一种是Seq2Seq机制,输入的是图像,经过卷积编码之后再使用RNN解码,为了提高识别的准确率,一般会加入Attention机制;
- 另一种就是CTC解码机制,但是对于CTC解码要满足一个前提,那就是输入序列的长度不小于输出序列的长度。CTC主要用于序列解码,不需要对序列中的每个元素进行标记,只需要知道输入序列对应的整个Label是什么即可,针对OCR项目,也就是输入一张图像上面写着“欢迎来到中国”这几个字,只需要是这几个字,而没必要知道这几个字在输入图像中所在的具体位置,实际上如果知道每个字所在的位置,就是单字符识别了,的确会降低任务的复杂多,但是现实中我们没有这么多标记号位置的数据,这个时候CTC就显得很重要了。
对CRNN进行训练:
- keras版本:./train/keras_train/train_batch.py(model_path-指向预训练权重位置,MODEL_PATH-指向模型训练保存的位置)
- pythorch版本:./train/pytorch-train/crnn_main.py
parser.add_argument(
'--crnn',
help="path to crnn (to continue training)",
default=预训练权重的路径)
parser.add_argument(
'--experiment',
help='Where to store samples and models',
default=定义的模型训练的权重保存位置)
模型:
keras模型预训练权重:https://pan.baidu.com/s/14cTCedz1ESnj0mM9ISm__w(1kb9)
pytorch预训练权重:https://pan.baidu.com/s/1kAXKudJLqJbEKfGcJUMVtw(9six)
预测测试
运行predict.predict(demo).py:写入测试图片的路径即可
如果想要显示CTPN的结果,修改文件./ctpn/ctpn/other.py的draw_boxes函数的最后部分,cv2.inwrite('dest_path',img),如此可以得到CTPN检测的文字区域框以及图像的OCR识别结果
使用Python基于VGG/CTPN/CRNN的自然场景文字方向检测/区域检测/不定长OCR识别的更多相关文章
- 【OCR技术系列之八】端到端不定长文本识别CRNN代码实现
CRNN是OCR领域非常经典且被广泛使用的识别算法,其理论基础可以参考我上一篇文章,本文将着重讲解CRNN代码实现过程以及识别效果. 数据处理 利用图像处理技术我们手工大批量生成文字图像,一共360万 ...
- OpenCV_contrib里的Text(自然场景图像中的文本检测与识别)
平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake 待解决!!!Issue说明:最近做一些字符识别的事情,想试一下opencv_contrib里的Text(自然场景 ...
- 【CV知识学习】【转】beyond Bags of features for rec scenen categories。基于词袋模型改进的自然场景识别方法
原博文地址:http://www.cnblogs.com/nobadfish/articles/5244637.html 原论文名叫Byeond bags of features:Spatial Py ...
- 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...
- python基于LeanCloud的短信验证
python基于LeanCloud的短信验证 1. 获取LeanCloud的Id.Key 2. 安装Flask框架和Requests库 pip install flask pip install re ...
- Python基于共现提取《釜山行》人物关系
Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...
- Python 基于Python实现的ssh兼sftp客户端(上)
基于Python实现的ssh兼sftp客户端 by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...
- Python基于socket模块实现UDP通信功能示例
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import ...
- Python基于正则表达式实现文件内容替换的方法
Python基于正则表达式实现文件内容替换的方法 本文实例讲述了Python基于正则表达式实现文件内容替换的方法.分享给大家供大家参考,具体如下: 最近因为有一个项目需要从普通的服务器移植到SAE,而 ...
随机推荐
- Count the Buildings
K - Count the Buildings 参考:Count the Buildings 思路可以借鉴,但是代码略有问题 写的时候 re 了 9 发,然后把变量定义的顺序换了一下居然 A 了,以为 ...
- mock的那点事
前言: Mock在GitHub上有12.9K的star可以看出,它在技术团队中是挺受欢迎的.这项技术被应用在不同领域的项目中. 适用场景: 下面我结合我们技术团队,列举最适合引入我们Mock服务的场景 ...
- postgresql-基础-1
概述 层状关系 网状关系 关系型数据库 关系型数据库 元祖:代表一行 属性:代表一列 主码:唯一确定一个元组的属性组,即主键 域:属性的取值范围 分量:元组中的一个属性值,即某一行 ...
- SRS之SrsRtmpServer::connect_app详解
1. connect('live') 2. SrsRtmpServer::connect_app 位于 srs_rtmp_stack.cpp.在 SRS 的 RTMP 连接处理线程 conn 中,当与 ...
- Python全栈开发第5天作业
作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 2) 将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加) 3) 将/1.txt. ...
- Python:百科
ylbtech-Python:百科 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越 ...
- props的写法
简写 props: ['demo-first', 'demo-second'] 带类型 props: { 'demo-first': Number, 'demo-second': Number } 带 ...
- Collapse 折叠面板
通过折叠面板收纳内容区域 基础用法 可同时展开多个面板,面板之间不影响 <el-collapse v-model="activeNames" @change="ha ...
- np.array()与np.asarray()区别
1. 数据源a是数组ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会.也就是说改变a的值,b不会. # 数据源a是列表时,两者没区别 a=[[1,2,3],[4 ...
- SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
问题描述: 已经安装了android-sdk 和gradle环境,并配置了环境变量,如下所示: android环境 root@wangju-HP--G4:/home/wangju/Desktop/5i ...