Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
[python3.6] 运用tf实现自然场景文字检测,keras/pytorch实现ctpn+crnn+ctc实现不定长场景文字OCR识别
| Date | Stars |
|---|---|
| 2026-07-24 | 2955 |
| 2026-07-25 | 2955 |
| 2026-07-28 | 2955 |
| 2026-07-30 | 2955 |
| 2026-08-06 | 2955 |
Today
— stars today
This week
— stars this week
This month
— stars this month
Momentum
0.0
growth rate 0.00%/day
# 本文基于tensorflow、keras/pytorch实现对自然场景的文字检测及端到端的OCR中文文字识别
# update20190706
- 为解决本项目中对数学公式预测的准确性,做了其他的改进和尝试,效果还不错,https://github.com/xiaofengShi/Image2Katex 希望能有所帮助,另外,这几月换了工作,并且转了方向,还是cv方向,不过不做ocr相关了,目前主要做显著目标检测以及搜索意图相关,对repo的提问回答较慢,请见谅。
# 实现功能
- 文字方向检测 0、90、180、270度检测
- 文字检测 后期将切换到keras版本文本检测 实现keras端到端的文本检测及识别
- 不定长OCR识别
## 环境部署
```
Bash
##GPU环境
sh setup.sh
## CPU环境
sh setup-cpu.sh
##CPU python3环境
sh setup-python3.sh
使用环境:python3.6+tensorflow1.7+cpu/gpu
```
# 模型训练
* 一共分为3个网络
**1. 文本方向检测网络-Classify(vgg16)**
* **2. 文本区域检测网络-CTPN(CNN+RNN)**
* **3. EndToEnd文本识别网络-CRNN(CNN+GRU/LSTM+CTC)**
# 文字方向检测-vgg分类
```bash
基于图像分类,在VGG16模型的基础上,训练0、90、180、270度检测的分类模型.
详细代码参考angle/predict.py文件,训练图片8000张,准确率88.23%
```
模型地址[BaiduCloud](https://pan.baidu.com/s/1zquQNdO0MUsLMsuwxbgPYg)
# 文字区域检测CTPN
关于ctpn网络,网上有很多对其进行介绍讲解的,算法是2016年提出的,在印书体识别用的很多,本人也写过一篇相应的博文[深度学习-TextDetection](http://xiaofengshi.com/2019/01/23/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-TextDetection/),在文章中结合本repo的代码对ctpn的原理进行了详细的讲解。CTPN网路结构如下

ctpn是一种基于目标检测方法的文本检测模型,在本repo的ctpn中anchor的设置为固定宽度,高度不同,相关代码如下:
```python
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2 ** np.arange(3, 6)):
heights = [11, 16, 23, 33, 48, 68, 97, 139, 198, 283]
widths = [16]
sizes = []
for h in heights:
for w in widths:
sizes.append((h, w))
return generate_basic_anchors(sizes)
```
基于这种设置,ctpn只能检测水平方向的文本,如果想要ctpn可以支持垂直文本检测,可以在anchor生成函数上进行修改。更详细的内容可以参考博客讲解。
# OCR 端到端识别:CRNN
## ocr识别采用GRU+CTC端到到识别技术,实现不分隔识别不定长文字
提供keras 与pytorch版本的训练代码,在理解keras的基础上,可以切换到pytorch版本,此版本更稳定
- 此外参考了了tensorflow版本的资源仓库:[TF:LSTM-CTC_loss](https://github.com/xiaofengShi/CTC_TF)
## 为什么使用ctc
ctc是一种解码机制,在使用ctpn提取到待检测文本行之后,我们要识别提取到的区域内的文本内容,目前广泛存在两种解码机制。
一种是seq2seq机制,输入的是图像,经过卷积编码之后再使用RNN解码,为了提高识别的准确率,一般会加入attention机制。
另一种就是ctc解码机制,但是对于ctc解码要满足一个前提,那就是输入序列的长度不小于输出序列的长度。ctc主要用于序列解码,我们不需要对序列中的每个元素进行标记,只需要知道输入序列对应的整个label是什么即可,针对ocr项目,也就是输入一张图像上面写着“欢迎来到中国”这几个字,我们只需要是这几个字,而没必要知道这几个字在输入图像中所在的具体位置,实际上如果知道每个字所在的位置,就是单字符识别了,的确会降低任务的复杂多,但是现实中我们没有这么多标记号位置的数据,这个时候CTC就显得很重要了。关于ctc解码机制,本人同样谢了一个对应的博客[CTC算法原理](http://xiaofengshi.com/2019/02/14/CTC%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86/),在文章中进行了详细的讲解,,如有疑问,请提交提问。
本repo中使用的是CNN+RNN+CTC的机制,实际上可以使用CNN+CTC的机制,CNN推荐选择densenet或者resnet
# 使用说明
## 使用预训练测试
```
运行demo.py 写入测试图片的路径即可,如果想要显示ctpn的结果,修改文件./ctpn/ctpn/other.py 的draw_boxes函数的最后部分,cv2.inwrite('dest_path',img),如此,可以得到ctpn检测的文字区域框以及图像的ocr识别结果
```
## 使用自己的数据训练
### 1 对ctpn进行训练
* 定位到路径--./ctpn/ctpn/train_net.py
* 预训练的vgg网络路径[VGG_imagenet.npy](https://pan.baidu.com/s/1JO_ZojA5bkmJZsnxsShgkg)
将预训练权重下载下来,pretrained_model指向该路径即可,
此外整个模型的预训练权重[checkpoint](https://pan.baidu.com/s/1aT-vHgq7nvLy4M_T6SwR1Q)
* ctpn数据集[还是百度云](https://pan.baidu.com/s/1NXFmdP_OgRF42xfHXUhBHQ)
数据集下载完成并解压后,将.ctpn/lib/datasets/pascal_voc.py 文件中的pascal_voc 类中的参数self.devkit_path指向数据集的路径即可
### 2 对crnn进行训练
* keras版本 ./train/keras_train/train_batch.py model_path--指向预训练权重位置
MODEL_PATH---指向模型训练保存的位置
[keras模型预训练权重](https://pan.baidu.com/s/1vTG6-i_bFMWxQ_7xF06usg)
* 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=模型训练的权重保存位置,这个自己指定)
```
[pytorch预训练权重](https://pan.baidu.com/s/1LEDNHEr3luloB7eZK6GOeA)
# 识别结果展示
## 文字检测及OCR识别结果

`===========================================================`

`===========================================================`

主要是因为训练的时候,只包含中文和英文字母,因此很多公式结构是识别不出来的
### 看看纯文字的

`===========================================================`

`===========================================================`

# 未完待续
### tensorflow版本crnExcerpt of 6,890 characters
Read on GitHub23
2
Would you bet a product on this? Bounded 0–100 and slow moving.
matched fp:984df8883d92cf8a, topic:ocr, name:ocr, desc:ocr
matched fp:984df8883d92cf8a, topic:tensorflow