OCR文本检测模型—pixel_link

一、PixelLink理论讲解

基于目标检测的文字检测模型:CTPN、SegLink、EAST等这些模型主要依赖于深度学习,可应用于自然场景中进行文字检测,其主要的实现步骤是判断是不是文本,并且给出文本框的位置和角度,如下图:
在这里插入图片描述
现在:文字检测的经典模型:PixelLink(像素连接)只需要利用“分类”,就能实现对文本/非文本的判断,并同时给出文本框的位置和角度。

1、PixelLink整体框架

PixelLink的整体框架如下图:
在这里插入图片描述
从模型的名称PixelLink(像素连接)可以看出,该模型主要有两个关键部分:Pixel(像素)、Link(连接)。
PixelLink主要是基于CNN网络,做某个像素(pixel)的文本/非文本的分类预测,以及该像素的8个邻域方向是否存在连接(link)的分类预测(即上图中虚线框内的八个热图,代表八个方向的连接预测)。然后基于OpenCV的minAreaRect(最小外接矩形)这种基于连通域的操作,获取不同大小的文本连通域,再进行噪声滤除操作,最后通过“并查集”(disjoint-set data structure)并出最终的文本边界框。

2、PixelLink网络结构

PixelLink的网络结构如下图所示:
PixelLink网络结构
PixelLink网络结构的骨干(backbone)采用VGG16作为特征提取器,将最后的全连接层fc6、fc7替换为卷积层,特征融合和像素预测的方式基于FPN思想(feature pyramid network,金字塔特征网络),即卷积层的尺寸依次减半,但卷积核的数量依次增倍,这种思想跟EAST模型的网络结构很像。
该模型结构有两个独立的头,一个用于文本/非文本预测(Text/non-text Prediction),另一个用于连接预测(Link Prediction),这两者都使用了Softmax,输出1x2=2通道(文本/非文本的分类)和8x2=16通道(8个邻域方向是否有连接的分类)。
在论文中作者给出了两种网络结构:PixelLink+VGG16 2s和PixelLink+VGG16 4s 。其中conv2_2的feature map(特征图)大小为原图1/2,而conv3_3的feature map(特征图)大小为原图1/4,如果最后的输出部分是从conv2_2中汇聚出来,则为PixelLink+VGG16 2s,如果是从conv3_3中汇聚出来,则为PixelLink+VGG16 4s。

3、PixelLink实现过程

(1)Pixel定义

Pixel(像素)分为正像素(positive)、负像素(negative)。所有落在文本区域内的像素标记为正像素(positive),文本区域以外的像素标记为负像素(negative),多个文本交叠区域也标记为负像素(negative)。

(2)Link定义

Link是由两个Pixel双向决定的,对于一个给定的像素以及其临近的八个像素点,如果:
两个像素都是正像素(positive),则它们之间的Link为正连接(positive)
如果一个像素是正像素,另一个是负像素,则它们之间的Link也为正连接(positive)
如果两个像素都是负像素,则它们之间的Link为负连接(negative)

(3)实例分割

对于Pixel(像素)、Link(连接)的预测结果,通过设定两个不同的阈值得到pixel positive集合和link positive集合(如超过指定阈值,则判为positive,否则为negative),使用正连接将正像素分组在一起,产生CCs(conected compoents,连通域)集合,集合中的每个元素代表的就是文本实例,每个CC就表示检测到的文本实例,这就实现了文本的实例分割,如下图:

img
(4)提取文本框

通过对CC(连通域)集合使用OpenCV的连通域方法minAreaRect获得最终的连通域,此时每个连通域都有自己的最小外接矩形,最后使用disjoint-set(并查集)方法形成最终的文本框,并查集主要用于将具有某种关联关系的集合进行合并的操作方法,如下图对集合的合并处理:

img

从这一步可以看出,文本边界框是直接从实例分割获得的,并不是通过位置回归获得的,这是跟其它检测方法的区别。另外,对文本的方向没有限制,也即可实现多角度的检测。

(5)去除噪声

由于使用基于连通域的方法进行文本像素汇聚,该方法对噪声比较敏感,最终会产生一些比较小的错误连通域,因此,通过对长度、宽度、面积、长宽比等信息,根据一定的阈值进行去除处理。具体方法是,选择训练数据集中排在99%位的作为阈值,例如在IC15数据集中99%的文本实例短边≥10像素,99%的文本域面积≥300像素,因此,将短边小于10像素或面积小于300像素的当作错误连通域进行去除。

4、PixelLink检测效果

基于IC15数据集的检测效果,如下表所示:
img
可以看出,PixelLink在召回率(R)、准确率(P)、F分值(F)都要比EAST、SegLink、CTPN等方法的效果要好
PixelLink的检测效果,如下图所示,支持多角度的文本检测:

img

5、总结

(1)PixelLink采用纯分割的思路,完全没有利用目标检测的方法,放弃了采用边界框回归的方法,而是进行实例分割,再直接生成边界框。PixelLink全部转化为分类任务,这样做的优势是训练更容易学习,训练速度更快,效果更好。

(2)PixelLink方法,只需对feature map(特征图)上的像素以及它相邻的像素进行预测,即每个神经元只负责检测自己及其邻域内的状态,这就不需要大的感受野就能把这些信息学到,对感受野的要求少,因此也就更加容易学习,减少迭代次数。但也导致不能检测字与字之间相隔太远的文本(因为太远了Link不到)。

(3)不需要采用预训练模型,直接使用通过xavier(一种很有效的神经网络初始化方法)随机初始化的VGG网络,在训练过程中也不需要太多的数据,迭代次数也比较少。

(4)该方法适合于进行端到端的文字检测,直接输入图片,然后得到检测结果。

二、代码演示

github项目地址: https://github.com/ZJULearning/pixel_link
软件配置:ubuntu16.04+Anaconda
权重下载地址:https://pan.baidu.com/s/1YW2QidlvRmmqNyI8pllbUA
测试数据集下载地址:
直接执行README.txt操作:

git clone --recursive git@github.com:ZJULearning/pixel_link.git

sudo vi /etc/profile
# 在文本末尾添加:
export PYTHONPATH=/home/`username`/PycharmProjects/pixel_link/pylib/src:$PYTHONPATH
# 执行生效
source /etc/profile

# 创建运行虚拟环境 
conda env create --file pixel_link_env.txt
source activate pixel_link

cd ~/PycharmProjects/pixel_link/
./scripts/test_any.sh 3 ~/PycharmProjects/pixel_link/conv2_2/model.ckpt-73018 ~/PycharmProjects/pixel_link/datasets/images

出现报错一:

./scripts/test_any.sh 3 ~/PycharmProjects/pixel_link/conv2_2/model.ckpt-73018 ~/PycharmProjects/pixel_link/datasets/images
-bash: ./scripts/test_any.sh: 没有那个文件或目录

'''
以下解决方案:
=====================================================
(pixel_link) `username`@`username`:~/PycharmProjects/pixel_link/scripts$ sudo apt-get install ia32-libs
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
没有可用的软件包 ia32-libs,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
然而下列软件包会取代它:
  lib32ncurses5 lib32z1

E: 软件包 ia32-libs 没有可安装候选
===========================================================
$sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 gcc-4.6-base:i386
E: 无法按照 glob ‘gcc-4.6-base’ 找到任何软件包
E: 无法按照正则表达式 gcc-4.6-base 找到任何软件包
===========================================================
'''

不知道为何,第二天又好了,我是一脸懵逼。执行又报以下的错误:

出现报错二:

: 无效选项test_any.sh: 第 1 行: set: -
set: 用法: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]
: 无效选项test_any.sh: 第 2 行: set: -
set: 用法: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]
Traceback (most recent call last):
  File "test_pixel_link.py", line 8, in <module>
    from datasets import dataset_factory
  File "/home/`username`/PycharmProjects/pixel_link/datasets/dataset_factory.py", line 2, in <module>
    from datasets import dataset_utils
  File "/home/`username`/PycharmProjects/pixel_link/datasets/dataset_utils.py", line 21, in <module>
    import util
ImportError: No module named util

下载文件pylib:https://codeload.github.com/dengdan/pylib/zip/e749559c9a4bcee3339081ec2d159a6dcf41636e
解压放置在/home/username/PycharmProjects/pixel_link/pylib/文件夹下。
出现报错三:

./scripts/test_any.sh 1 ~/PycharmProjects/pixel_link/model_path/conv2_2/model.ckpt-73018 ~/PycharmProjects/pixel_link/datasets/images
: 无效选项test_any.sh: 第 1 行: set: -
set: 用法: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]
: 无效选项test_any.sh: 第 2 行: set: -
set: 用法: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]
Traceback (most recent call last):
  File "test_pixel_link.py", line 176, in <module>
    tf.app.run()
  File "/home/`username`/anaconda3/envs/pixel_link/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "test_pixel_link.py", line 171, in main
    config_initialization()
  File "test_pixel_link.py", line 71, in config_initialization
    config.load_config(FLAGS.checkpoint_path)
  File "/home/`username`/PycharmProjects/pixel_link/config.py", line 218, in load_config
    if not util.io.is_dir(path):
  File "/home/`username`/PycharmProjects/pixel_link/pylib/src/util/io_.py", line 53, in is_dir
    path = get_absolute_path(path)
  File "/home/`username`/PycharmProjects/pixel_link/pylib/src/util/io_.py", line 80, in get_absolute_path
    if p.startswith('~'):
AttributeError: 'NoneType' object has no attribute 'startswith'
./scripts/test_any.sh: 行 5: --checkpoint_path=/home/`username`/PycharmProjects/pixel_link/model_path/conv2_2/model.ckpt-73018: 没有那个文件或目录
: 没有那个文件或目录  6: --dataset_dir=/home/`username`/PycharmProjects/pixel_link/datasets/images
./scripts/test_any.sh: 行 7: $'--gpu_memory_fraction=-1\r': 未找到命令
./scripts/test_any.sh: 行 8: $'\r': 未找到命令
./scripts/test_any.sh: 行 9: $'\r': 未找到命令

问了一下大神,说是由于shell脚本中运行时并没有进入虚拟环境中,导致找不到文件。
正确实现方法:

(pixel_link) `username`@`username`:export CUDA_VISIBLE_DEVICES=1
(pixel_link) `username`@`username`:python test_pixel_link_on_any_image.py \
                     --checkpoint_path=~/PycharmProjects/pixel_link/conv2_2/model.ckpt-73018 \
                     --dataset_dir=~/PycharmProjects/pixel_link/datasets/images \
                     --eval_image_width=1280\
                     --eval_image_height=768\
                     --pixel_conf_threshold=0.5\
                     --link_conf_threshold=0.5\
                     --gpu_memory_fraction=-1

效果并不是很好:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值