精华内容
下载资源
问答
  • 自然场景中的文字检测与识别是图像理解中的重要部分,在大部分的系统设计中,检测识别被看成是孤立的两部分进行处理,本文提出使用多类霍夫森林建立一个统一的检测识别框架。同时为了解决霍夫森林在类别增多时识别...
  • 基于darknet框架实现CTPN版本自然场景文字检测与CNN+CTCOCR文字识别 本项目基于darknet框架实现CTPN版本自然场景文字检测与CNN + CTCOCR文字识别 实现功能 CPU版本最短边608时,检测速度小于1秒; 支持darknet...
  • 文字检测文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检测的场景主要分为两种,...

    文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。

    文字检测的场景主要分为两种,一种是简单场景,另一种是复杂场景。其中,简单场景的文字检测较为简单,例如像书本扫描、屏幕截图、或者清晰度高、规整的照片等;而复杂场景,主要是指自然场景,情况比较复杂,例如像街边的广告牌、产品包装盒、设备上的说明、商标等等,存在着背景复杂、光线忽明忽暗、角度倾斜、扭曲变形、清晰度不足等各种情况,文字检测的难度更大。如下图:

    本文将介绍简单场景、复杂场景中常用的文字检测方法,包括形态学操作、MSER+NMS、CTPN、SegLink、EAST等方法,并主要以ICDAR场景文字图片数据集介绍如何使用这些方法,如下图:

    1、简单场景:形态学操作法

    通过利用计算机视觉中的图像形态学操作,包括膨胀、腐蚀基本操作,即可实现简单场景的文字检测,例如检测屏幕截图中的文字区域位置,如下图:

    其中,“膨胀”就是对图像中的高亮部分进行扩张,让白色区域变多;“腐蚀”就是图像中的高亮部分被蚕食,让黑色区域变多。通过膨胀、腐蚀的一系列操作,可将文字区域的轮廓突出,并消除掉一些边框线条,再通过查找轮廓的方法计算出文字区域的位置出来。主要的步骤如下:

    • 读取图片,并转为灰度图
    • 图片二值化,或先降噪后再二值化,以便简化处理
    • 膨胀、腐蚀操作,突出轮廓、消除边框线条
    • 查找轮廓,去除不符合文字特点的边框
    • 返回文字检测的边框结果

    通过OpenCV,便能轻松实现以上过程,核心代码如下:

    # -*- coding: utf-8 -*-
    
    import cv2
    import numpy as np
    
    # 读取图片
    imagePath = '/data/download/test1.jpg'
    img = cv2.imread(imagePath)
    
    # 转化成灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 利用Sobel边缘检测生成二值图
    sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
    # 二值化
    ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
    
    # 膨胀、腐蚀
    element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9))
    element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6))
    
    # 膨胀一次,让轮廓突出
    dilation = cv2.dilate(binary, element2, iterations=1)
    
    # 腐蚀一次,去掉细节
    erosion = cv2.erode(dilation, element1, iterations=1)
    
    # 再次膨胀,让轮廓明显一些
    dilation2 = cv2.dilate(erosion, element2, iterations=2)
    
    #  查找轮廓和筛选文字区域
    region = []
    contours, hierarchy = cv2.findContours(dilation2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for i in range(len(contours)):
        cnt = contours[i]
    
        # 计算轮廓面积,并筛选掉面积小的
        area = cv2.contourArea(cnt)
        if (area < 1000):
            continue
    
        # 找到最小的矩形
        rect = cv2.minAreaRect(cnt)
        print ("rect is: ")
        print (rect)
    
        # box是四个点的坐标
        box = cv2.boxPoints(rect)
        box = np.int0(box)
    
        # 计算高和宽
        height = abs(box[0][1] - box[2][1])
        width = abs(box[0][0] - box[2][0])
    
        # 根据文字特征,筛选那些太细的矩形,留下扁的
        if (height > width * 1.3):
            continue
    
        region.append(box)
    
    # 绘制轮廓
    for box in region:
        cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    该图像处理过程如下图所示:

    可以看到最终成功将图像中的文字区域检测出来了。

    这种方法的特点是计算简单、处理起来非常快,但在文字检测中的应用场景非常有限,例如如果图片是拍照的,光线有明有暗或者角度有倾斜、纸张变形等,则该方法需要不断重新调整才能检测,而且效果也不会很好,如下图。例如上面介绍的代码是针对白底黑字的检测,如果是深色底白色字则需要重新调整代码,如果有需要,可再私信我交流

     

    2、简单场景:MSER+NMS检测法

    MSER(Maximally Stable Extremal Regions,最大稳定极值区域)是一个较为流行的文字检测传统方法(相对于基于深度学习的AI文字检测而言),在传统OCR中应用较广,在某些场景下,又快又准。

    MSER算法是在2002提出来的,主要是基于分水岭的思想进行检测。分水岭算法思想来源于地形学,将图像当作自然地貌,图像中每一个像素的灰度值表示该点的海拔高度,每一个局部极小值及区域称为集水盆地,两个集水盆地之间的边界则为分水岭,如下图:

    MSER的处理过程是这样的,对一幅灰度图像取不同的阈值进行二值化处理,阈值从0至255递增,这个递增的过程就好比是一片土地上的水面不断上升,随着水位的不断上升,一些较低的区域就会逐渐被淹没,从天空鸟瞰,大地变为陆地、水域两部分,并且水域部分在不断扩大。在这个“漫水”的过程中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。在一幅有文字的图像上,文字区域由于颜色(灰度值)是一致的,因此在水平面(阈值)持续增长的过程中,一开始不会被“淹没”,直到阈值增加到文字本身的灰度值时才会被“淹没”。该算法可以用来粗略地定位出图像中的文字区域位置。

    听起来这个处理过程似乎非常复杂,好在OpenCV中已内置了MSER的算法,可以直接调用,大大简化了处理过程。

    检测效果如下图:

    检测后的结果是存在各种不规则的检测框形状,通过对这些框的坐标作重新处理,变成一个个的矩形框。如下图:

    核心代码如下:

    # 读取图片
    imagePath = '/data/download/test2.jpg'
    img = cv2.imread(imagePath)
    
    # 灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    vis = img.copy()
    orig = img.copy()
    
    # 调用 MSER 算法
    mser = cv2.MSER_create()
    regions, _ = mser.detectRegions(gray)  # 获取文本区域
    hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]  # 绘制文本区域
    cv2.polylines(img, hulls, 1, (0, 255, 0))
    cv2.imshow('img', img)
    
    # 将不规则检测框处理成矩形框
    keep = []
    for c in hulls:
        x, y, w, h = cv2.boundingRect(c)
        keep.append([x, y, x + w, y + h])
        cv2.rectangle(vis, (x, y), (x + w, y + h), (255, 255, 0), 1)
    cv2.imshow("hulls", vis)
    

    从上图可以看出,检测框有很多是重叠的,大框里面有小框,框与框之间有交叉,有些框只是圈出了汉字的偏旁或者某些笔划,而我们期望是能圈出文字的外边框,这样便于后续的文字识别。为了处理这些很多重叠的大小框,一般会采用NMS方法(Non Maximum Suppression,非极大值抑制),也就是抑制非极大值的元素,即抑制不是最大尺寸的框,相当于去除大框中包含的小框,达到去除重复区域,找到最佳检测位置的目的。

    NMS算法的主要流程如下:

    • 将所有框按置信度得分进行排序(如果边框没有置信度得分,也可以按坐标进行排序)
    • 取其中得分最高的框出来
    • 遍历该框与其余框的重叠面积(IoU)
    • 删除IoU大于某个阈值的框(阈值可按需设定,例如0.3、0.5、0.8等)
    • 取下一个得分最高的框出来,重复以上过程

    经过以上步骤,最后剩下的就是不包含重叠部分的文本检测框了。核心代码如下:

    # NMS 方法(Non Maximum Suppression,非极大值抑制)
    def nms(boxes, overlapThresh):
        if len(boxes) == 0:
            return []
    
        if boxes.dtype.kind == "i":
            boxes = boxes.astype("float")
    
        pick = []
    
        # 取四个坐标数组
        x1 = boxes[:, 0]
        y1 = boxes[:, 1]
        x2 = boxes[:, 2]
        y2 = boxes[:, 3]
    
        # 计算面积数组
        area = (x2 - x1 + 1) * (y2 - y1 + 1)
    
        # 按得分排序(如没有置信度得分,可按坐标从小到大排序,如右下角坐标)
        idxs = np.argsort(y2)
    
        # 开始遍历,并删除重复的框
        while len(idxs) > 0:
            # 将最右下方的框放入pick数组
            last = len(idxs) - 1
            i = idxs[last]
            pick.append(i)
    
            # 找剩下的其余框中最大坐标和最小坐标
            xx1 = np.maximum(x1[i], x1[idxs[:last]])
            yy1 = np.maximum(y1[i], y1[idxs[:last]])
            xx2 = np.minimum(x2[i], x2[idxs[:last]])
            yy2 = np.minimum(y2[i], y2[idxs[:last]])
    
            # 计算重叠面积占对应框的比例,即 IoU
            w = np.maximum(0, xx2 - xx1 + 1)
            h = np.maximum(0, yy2 - yy1 + 1)
            overlap = (w * h) / area[idxs[:last]]
    
            # 如果 IoU 大于指定阈值,则删除
            idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlapThresh)[0])))
    
        return boxes[pick].astype("int")
    

    经NMS处理后的检测结果如下图:

    从上图可以看出,经MSER+NMS后,已能较好地将文字区域检测、圈出来。

    MSER+NMS检测方法在传统的OCR应用中使用广泛,检测速度也非常快,能满足一定的文字识别场景。但当在复杂的自然场景中,特别是有复杂背景的,其检测效果也不尽人意,会将一些无关的因素也检测出来,如下图:

    【重点来了】

    接下来要介绍的方法,就主要是基于深度学习的AI文字检测法,可应用于复杂的自然场景中。

     

    3、复杂场景:CTPN检测法

    CTPN(Detecting Text in Natural Image with Connectionist Text Proposal Network,基于连接预选框网络的文本检测)是基于卷积神经网络和循环神经网络的文本检测方法,其基本做法是生成一系列适当尺寸的文本proposals(预选框)进行文本行的检测,示意图如下,具体的技术原理请见之前的文章(文章:大话文本检测经典模型:CTPN

    CTPN检测法能适应较为复杂的自然场景,是目前深度学习中作文字检测的常用方法之一。CTPN的原作者提供该算法的源代码(https://github.com/tianzhi0549/CTPN),是基于caffe深度学习框架的。大家对tensorflow可能会更加熟悉,于是有人在github上提供了tensorflow版本的CTPN程序(https://github.com/eragonruan/text-detection-ctpn),下面介绍如何使用该程序进行文字检测。

    (1)下载源代码和模型

    ① 首先,将tensorflow版本的CTPN程序源代码下载下来,可直接下载成zip压缩包或者git克隆

    git clone https://github.com/eragonruan/text-detection-ctpn.git

    ② 接下来,进行编译安装,执行以下命令

    cd utils/bbox
    
    chmod +x make.sh
    
    ./make.sh

    ③ 下载预训练好的模型,下载地址为 https://pan.baidu.com/s/1BNHt_9fiqRPGmEXPaxaFXw ,下载后的压缩文件为checkpoints_mlt.zip,新建目录text-detection-ctpn,将解压后将 checkpoints_mlt 文件夹放到text-detection-ctpn 目录中

    (2)CTPN文本检测能力测试

    将图片放到data/demo目录(默认有自带测试图片,如要检测自己的图片,则将自己的图片放于data/demo目录下),然后执行以下命令,就能使用CTPN进行文字检测

    python ./main/demo.py

    检测后的结果存放于 data/res 目录中,检测结果由图片和检测框位置、置信度分数信息两种文件组成,如下图所示:

    打开文件后,如下图所示,可见已较好地将文字检测出来:

    再打开其它图片,可看到检测结果如下,检测效果还不错,如下图:

    (3)CTPN文本检测能力封装

    通过对main/demo.py的程序稍微进行改造,就能将CTPN检测能力封装后提供给其它程序调用了,核心代码如下:

    # 基于 CTPN 的文字检测方法
    # 输入:图片
    # 返回:文本框位置和置信度分数
    def text_detect(image):
    
        with tf.get_default_graph().as_default():
            # 模型参数定义
            input_image = tf.placeholder(tf.float32, shape=[None, None, None, 3], name='input_image')
            input_im_info = tf.placeholder(tf.float32, shape=[None, 3], name='input_im_info')
    
            global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False)
    
            bbox_pred, cls_pred, cls_prob = model.model(input_image)
    
            variable_averages = tf.train.ExponentialMovingAverage(0.997, global_step)
            saver = tf.train.Saver(variable_averages.variables_to_restore())
    
            with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) as sess:
                # 加载模型
                ckpt_state = tf.train.get_checkpoint_state(checkpoint_dir)
                model_path = os.path.join(checkpoint_dir, os.path.basename(ckpt_state.model_checkpoint_path))
                saver.restore(sess, model_path)
    
                # 预测文本框位置
                img = image
                h, w, c = img.shape
                im_info = np.array([h, w, c]).reshape([1, 3])
                bbox_pred_val, cls_prob_val = sess.run([bbox_pred, cls_prob],
                                                       feed_dict={input_image: [img],
                                                                  input_im_info: im_info})
    
                textsegs, _ = proposal_layer(cls_prob_val, bbox_pred_val, im_info)
                scores = textsegs[:, 0]
                textsegs = textsegs[:, 1:5]
    
                textdetector = TextDetector(DETECT_MODE='H')
                boxes = textdetector.detect(textsegs, scores[:, np.newaxis], img.shape[:2])
                boxes = np.array(boxes, dtype=np.int)
    
        return boxes,scores
    

    从以上的检测结果来看,CTPN检测法在复杂的自然场景下具有较好的检测效果。

     

    4、复杂场景:SegLink检测法

    虽然CTPN在自然场景下的文字检测效果还不错,但CTPN的检测效果是基于水平方向的,对于非水平的文本检测效果并不好。在自然场景中,有很多的文本信息都是带有一定的旋转、倾斜角度的,例如街道上的广告牌。接下来介绍的SegLink检测法能够实现对旋转文本的多角度检测,该模型主要是对通过Segment(切片)、Link(链接)实现对文本的检测,示意图如下,具体的技术原理请见之前的文章(文章:大话文本检测经典模型:SegLink

    https://oscimg.oschina.net/oscnet/c8917ae95caadfb03dc1339ce8989a0594e.jpg

    下面介绍如何使用SegLink来检测文本。

    (1)下载源代码和模型

    ① 首先,在github上下载tensorflow版本的SegLink源代码(https://github.com/dengdan/seglink),可直接下载成zip压缩包或者git克隆

    git clone https://github.com/dengdan/seglink.git

    ② 下载pylib,下载路径为https://github.com/dengdan/pylib/tree/f7f5c5503fbb3d9593e6ac3bbf0b8508f53ee1cf ,解压后将src里面的util文件放到pylib目录下面,然后添加到环境变量,在test_seglink.py的前面加上

    import sys
    
    sys.path.append('/data/PycharmProjects/tensorflow/ocr/seglink/util')

    或者在当前窗口执行以下命令,或在 /etc/profile,~/.bashrc 文件中添加以下命令

    export PYTHONPATH=xx:$PYTHONPATH

    ③ 下载预训练好的模型(基于SynthText、IC15数据集),作者提供了两个预训练好的模型seglink-384(基于384x384的图片)、seglink-512(基于512x512的图片),下载地址为 https://pan.baidu.com/s/1slqaYux

    ④ 安装依赖包

    conda install -c cachemeorg setproctitle
    
    #或以下命令
    
    #pip install setproctitle

    ⑤ 如果python是使用了python3的,则需要进行以下修改(使用python 2.x的,请忽略)

    • 修改test_seglink.py第69行、第133行、第139行、第144行、第145行、第146行,print后面加上括号
    • 修改pylib/util/io_.py,修改第11行,将import cPickle as pkl修改为import pickle as pkl
    • 修改pylib/util/io_.py,修改第12行,将import commands改为import subprocess as commands
    • 修改pylib/util/caffe_.py,修改第29行、第46行、第47行、第50行,在print后面加上括号
    • 修改pylib/util/tf.py,修改第41行,将xrange改为range
    • 修改config.py,修改第129行,将xrange改为range
    • 修改tf_extended/seglink.py,修改第337行、第625行、第626行、第759行、第761行,将xrange改为range
    • 修改test_seglink.py,第153行,将print(util.cmd.cmd(cmd))注释掉

    ⑥ 修改./tf_extended/seglink.py,第808行,opencv3没有cv.BoxPoints() 函数,修改如下:

    # points = cv2.cv.BoxPoints(bbox)   #opencv2.4.9
    
    points = cv2.boxPoints(bbox)       #opencv3.1.0

     

    (2)SegLink检测文本测试(文本框坐标)

    通过运行以下命令进行测试

    ./scripts/test.sh 0 GPU_ID CKPT_PATH DATASET_DIR

    该命令由三个参数组成,第1个表示GPU,第2个表示模型路径,第3个表示数据目录。例如我们使用刚才下载的seglink-384预训练模型,将要检测的图片放到指定的目录后进行测试(可使用自己的图片,或使用场景文字图片数据集ICDAR2015进行测试,下载地址为http://rrc.cvc.uab.es/?ch=4&com=downloads),那么执行的脚本如下:

    ./scripts/test.sh 0 ./models/seglink-512/model.ckpt-217867  ./dataset/ICDAR2015 /ch4_test_images

    检测后,生成了图片检测出来的文本框位置(8个坐标点),并存放在txt文件中,如下图:

    从这些检测的文本框位置结果来看,并不显性化,不知道在图片中的实际检测效果如何。

    (3)SegLink检测文本测试(结果显性化)

    为了能显性化地展现出文本检测 的图片结果,可通过以下命令进行展示,格式为

    python visualize_detection_result.py \
    
        --image=检测的图片所在目录
    
        --det=经过test_seglink.py检测输出的文本框位置坐标
    
    --output=指定将文本框位置绘制到图片上的输出目录

    该命令由三个参数组成,第一个表示输入的图像,第二个表示输出检测结果的文本信息,第三个表示输出检测结果的图像

    ① 在visualize_detection_result.py添加环境变量

    import sys
    
    sys.path.append('/data/PycharmProjects/tensorflow/ocr/seglink/util')

    ② 如果python是使用了python3的,则对visualize_detection_result.py第65行,print后面加上括号

     

    对刚才输出的检测结果信息进行可视化展示,调用的命令如下(以ICDAR2015测试图片集为例,如要使用自己的照片,请替换图片目录):

    python visualize_detection_result.py \
    
        --image=./dataset/ICDAR2015/ ch4_test_images/  \
    
        --det=./models/seglink-512/model.ckpt-217867/test/icdar2015_test/model.ckpt-217867/seg_link_conf_th_0.800000_0.500000/txt \
    
        --output=./dataset/output

    执行后,可看到直接输出了检测后的结果图片,如下图:

    打开其它图片,检测效果如下:

    从上面的检测结果来看,可较好地检测出自然场景中的文字,特别是其中还有一些带有一定倾斜或旋转角度的文字,也能检测出来。

    (4)SegLink文本检测能力封装

    为了方便在其它程序中调用SegLink的检测能力,在test_seglink.py, visualize_detection_result.py代码的基础上进行封装改造,就能将SegLink的检测能力进行封装提供给其它程序调用,核心代码如下:

    # 基于 SegLink 的文字检测方法
    # 输入:图片
    # 返回:文本框位置
    def text_detect(img):
        with tf.name_scope('eval'):
            with tf.variable_scope(tf.get_variable_scope(),reuse=True):
                # 模型参数
                image = tf.placeholder(dtype=tf.int32, shape=[None, None, 3])
                image_shape = tf.placeholder(dtype=tf.int32, shape=[3, ])
                # 预处理图片
                processed_image, _, _, _, _ = ssd_vgg_preprocessing.preprocess_image(image, None, None, None, None,
                                                                                     out_shape=config.image_shape,
                                                                                     data_format=config.data_format,
                                                                                     is_training=False)
                b_image = tf.expand_dims(processed_image, axis=0)
                b_shape = tf.expand_dims(image_shape, axis=0)
                # 预测文本框
                net = seglink_symbol.SegLinkNet(inputs=b_image, data_format=config.data_format)
                bboxes_pred = seglink.tf_seglink_to_bbox(net.seg_scores, net.link_scores,
                                                         net.seg_offsets,
                                                         image_shape=b_shape,
                                                         seg_conf_threshold=config.seg_conf_threshold,
                                                         link_conf_threshold=config.link_conf_threshold)
    
        sess_config = tf.ConfigProto(log_device_placement=False, allow_soft_placement=True)
        sess_config.gpu_options.allow_growth = True
    
        saver = tf.train.Saver()
        if util.io.is_dir(checkpoint_dir):
            checkpoint = util.tf.get_latest_ckpt(checkpoint_dir)
        else:
            checkpoint = checkpoint_dir
    
        with tf.Session(config=sess_config) as sess:
            # 加载模型
            saver.restore(sess, checkpoint)
            # 预测文本框
            image_data = img
            image_bboxes = sess.run([bboxes_pred], feed_dict={image: image_data, image_shape: image_data.shape})
            bboxes = image_bboxes[0]
    
        return bboxes
    

     

    5、复杂场景:EAST检测法

    CTPN检测法、SegLink检测法是通过先预测proposals(预选框)、segment(切片),然后再回归、合并等方式实现对文本的检测,中间过程比较冗长。而接下来介绍的EAST检测法,则将中间过程缩减为只有FCN(全卷积网络)、NMS(非极大值抑制)两个阶段,而且输出结果支持文本行、单词的多个角度检测,既高效准确,又能适应多种自然应用场景,如下图所示,具体的技术原理请见之前的文章(文章:大话文本检测经典模型:EAST

    https://oscimg.oschina.net/oscnet/e0c69cf042328840c3312b25619d6fe4b76.jpg

    下面介绍如何使用EAST来检测文本。

    (1)下载源代码和模型

    ① 首先在github上下载EAST的源代码(https://github.com/argman/EAST),可直接下载成zip压缩包或者git克隆

    git clone https://github.com/argman/EAST.git

    ② 在百度网盘上下载预先训练好的模型文件(基于ICDAR 2013、ICDAR 2015数据集训练),下载地址为http://pan.baidu.com/s/1jHWDrYQ

    ③ 安装shapely依赖包,执行以下命令

    conda install shapely
    
    # 或执行以下命令
    
    # pip install shapely

    (2)EAST检测文本测试(demo页面)

    进入EAST-master目录,然后执行以下命令,可启动demo页面

    python run_demo_server.py –checkpoint_path model/east_icdar2015_resnet_v1_50_rbox/

    页面默认会加载输出的结果图片,首次加载时没有结果输出,所以会提示404,这不影响后面的使用。

    执行命令后,即可启动web服务,在浏览器中输入http://localhost:8769,打开demo页面,如下图:

    点击“选择文件”选择待检测的图片,点击“Submit”提交进行检测,检测后将在页面上返回显示检测后的图片,随机挑选了其中三张图片,检测效果如下图:

    作者还很贴心地提供在在线的demo页面,让用户可直接进行体验使用,使用方式跟上面的demo页面一样,网站链接为http://east.zxytim.com/

    (3)EAST检测文本测试(批量检测)

    可通过命令行调用一批图片批量检测文本,还是以刚才的ICDAR图片数据集进行检测(如果要检测自己的图片,请替换数据目录),命令如下:

    python eval.py –test_data_path=/data/work/tensorflow/model/seglink/ICDAR2015/ch4_test_images/ --checkpoint_path=model/east_icdar2015_resnet_v1_50_rbox/ --output_dir=/tmp/east

    执行该命令后,将会批量读取图片进行检测,并输出检测结果,包括图片中检测到的文本框位置、检测结果框住文本后的图片,如下图所示:

    从上图也可以看出,EAST也能较好地检测出自然场景的文字,对其中一些带有旋转角度的文字也可准确地检测出来。

    (4)EAST文本检测能力封装

    为了方便将EAST提供给其它代码调用,通过对eval.py进行修改,封装EAST文本检测的方法,可直接供其它代码调用,代码如下:

    # 基于 EAST 的文字检测方法
    # 输入:图片
    # 返回:文本框位置相关信息
    def text_detect(img):
        # 模型路径
        checkpoint_path='/data/PycharmProjects/tensorflow/ocr/east/model/east_icdar2015_resnet_v1_50_rbox/'
    
        # 模型参数
        input_images = tf.placeholder(tf.float32, shape=[None, None, None, 3], name='input_images')
        global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False)
    
        f_score, f_geometry = model.model(input_images, is_training=False)
    
        variable_averages = tf.train.ExponentialMovingAverage(0.997, global_step)
        saver = tf.train.Saver(variable_averages.variables_to_restore())
    
        sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
    
        # 加载模型
        ckpt_state = tf.train.get_checkpoint_state(checkpoint_path)
        model_path = os.path.join(checkpoint_path, os.path.basename(ckpt_state.model_checkpoint_path))
        saver.restore(sess, model_path)
    
        # 预测文本框
        im_resized, (ratio_h, ratio_w) = resize_image(img)
        score, geometry = sess.run(
            [f_score, f_geometry],
            feed_dict={input_images: [im_resized[:,:,::-1]]})
    
        boxes,_ = detect(score_map=score, geo_map=geometry, timer=collections.OrderedDict([('net', 0),('restore', 0),('nms', 0)]))
    
        if boxes is not None:
            scores = boxes[:,8].reshape(-1)
            boxes = boxes[:, :8].reshape((-1, 4, 2))
            boxes[:, :, 0] /= ratio_w
            boxes[:, :, 1] /= ratio_h
    
        text_lines = []
        if boxes is not None:
            text_lines = []
            for box, score in zip(boxes, scores):
                box = sort_poly(box.astype(np.int32))
                if np.linalg.norm(box[0] - box[1]) < 5 or np.linalg.norm(box[3]-box[0]) < 5:
                    continue
                tl = collections.OrderedDict(zip(
                    ['x0', 'y0', 'x1', 'y1', 'x2', 'y2', 'x3', 'y3'],
                    map(float, box.flatten())))
                tl['score'] = float(score)
                text_lines.append(tl)
        ret = {
            'text_lines': text_lines,
        }
        return ret
    

     

    为方便介绍,以上CTPN、SegLink、EAST的文本检测能力封装时,将加载模型、文本框预测、图片绘制文本框等代码写在一起,而在实际生产使用中,一般是将其分开,在后台启动OCR服务能力时预先加载模型,然后提供核心的文本检测、识别能力,而输出结果是否将文本框绘制到图片上,则视具体需求场景而定。在生产环境中,如何更加有效地封装AI能力,可再私信进行交流

     

    推荐相关阅读

    1、AI 实战系列

    2、大话深度学习系列

    3、AI 杂谈

    4、大数据超详细系列

    展开全文
  • 本项目基于yolo3 与crnn 实现中文自然场景文字检测识别由于本项目融合多个框架,维护较困难,为了更好的部署应用,后续将只围绕darknet框架进行开发,不在支持keras、tensorflow、pytorch。实现功能文字方向检测 0...

    本项目基于yolo3 与crnn 实现中文自然场景文字检测及识别

    由于本项目融合多个框架,维护较困难,为了更好的部署应用,后续将只围绕darknet框架进行开发,不在支持keras、tensorflow、pytorch。

    实现功能

    文字方向检测 0、90、180、270度检测(支持dnn/tensorflow)

    支持(darknet/opencv dnn /keras)文字检测,支持darknet/keras训练

    不定长OCR训练(英文、中英文) crnn\dense ocr 识别及训练 ,新增pytorch转keras模型代码(tools/pytorch_to_keras.py)

    支持darknet 转keras, keras转darknet, pytorch 转keras模型

    身份证/火车票结构化数据识别

    新增CNN+ctc模型,支持DNN模块调用OCR,单行图像平均时间为0.02秒以下

    CPU版本加速

    支持基于用户字典OCR识别

    新增语言模型修正OCR识别结果

    支持树莓派实时识别方案

    环境部署

    GPU部署 参考:setup.md

    CPU部署 参考:setup-cpu.md

    下载编译darknet(如果直接运用opencv dnn或者keras yolo3 可忽略darknet的编译)

    git clone https://github.com/pjreddie/darknet.git

    mv darknet chineseocr/

    ##编译对GPU、cudnn的支持 修改 Makefile

    #GPU=1

    #CUDNN=1

    #OPENCV=0

    #OPENMP=0

    make

    修改 darknet/python/darknet.py line 48

    root = '/root/'##chineseocr所在目录

    lib = CDLL(root+"chineseocr/darknet/libdarknet.so", RTLD_GLOBAL)

    下载模型文件

    模型文件地址:

    复制文件夹中的所有文件到models目录

    模型转换

    pytorch ocr 转keras ocr

    python tools/pytorch_to_keras.py -weights_path models/ocr-dense.pth -output_path models/ocr-dense-keras.h5

    darknet 转keras

    python tools/darknet_to_keras.py -cfg_path models/text.cfg -weights_path models/text.weights -output_path models/text.h5

    keras 转darknet

    python tools/keras_to_darknet.py -cfg_path models/text.cfg -weights_path models/text.h5 -output_path models/text.weights

    编译语言模型(可选)

    git clone --recursive https://github.com/parlance/ctcdecode.git

    cd ctcdecode

    pip install .

    下载语言模型 (可选)

    wget https://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm

    mv zh_giga.no_cna_cmn.prune01244.klm chineseocr/models/

    模型选择

    参考config.py文件

    构建docker镜像

    ##下载Anaconda3 python 环境安装包(https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh) 放置在chineseocr目录下

    ##建立镜像

    docker build -t chineseocr .

    ##启动服务

    docker run -d -p 8080:8080 chineseocr /root/anaconda3/bin/python app.py

    web服务启动

    cd chineseocr## 进入chineseocr目录

    python app.py 8080 ##8080端口号,可以设置任意端口

    访问服务

    识别结果展示

    参考

    展开全文
  • 场景文字检测(matlab)

    热门讨论 2014-06-24 22:31:13
    就我所知,十分完善的场景文字检测的代码网上是没有的,有的只是一些算法,或者比较过时的系统,本文的出现正是希望通过本人的一点努力填补这个空白,方便广大研究者能够更快入门,至少一开始研究就有一个基本框架。...
  • 一、文字识别:通用目标检测(一阶段、两阶段) 二、Faster R-CNN 这个是通用目标检测的典型算法。 框架分为四大部分: 三、CTPN:两阶段的文本检测

    一、文字检测:通用目标检测(一阶段、两阶段)

    在这里插入图片描述
    在这里插入图片描述

    二、Faster R-CNN

    这个是通用目标检测的典型算法。

    框架分为四大部分:
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、CTPN:两阶段的文本检测

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、FCN:一阶段

    在这里插入图片描述

    区分前景和背景

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    五、EAST算法:一阶段的算法

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 文字检测算法

    千次阅读 2019-03-06 18:28:10
    前言 pixel-anchor是云从科技前几天放...不过就整个框架而言,创新点虽然不多,但是预感会带起一波检测与分割结合的文字检测方法。 文章脉络 anchor-basedpixel-based方法的优缺点 网络结构 结果分析 模型分...

    前言

    pixel-anchor是云从科技前几天放出来的论文,文章提出了east和Textboxes++的合体模型,通过结合anchor-based和pixel-based的检测方法的特性,达到了SOTA。不过就整个框架而言,创新点虽然不多,但是预感会带起一波检测与分割结合的文字检测方法。

    文章脉络

    • anchor-based和pixel-based方法的优缺点
    • 网络结构
    • 结果分析
    • 模型分析

    anchor-based和pixel-based的检测方法

    anchor-based的方法可以分为两个派系,一类是faster-rcnn,另外一类是SSD系列。
    其中,基于faster-rcnn的方法具体代表有如下方法:

    • RRPN:提出带角度的anchor,设计的anchor需要足够多的角度以及尺度覆盖场景中的文本,但是为了覆盖所有的文本尺度变化以及角度,需要人工设计较多的尺度;
    • R2CNN:提出不同感受野的roipooling:7x7,3x11, 11x3用来检测多角度的文本
    • CTPN:更改RPN anchor为水平方向的序列anchor,利用后处理将anchor连接成行
    • InceptText:基于FCIS,加入Deformble conv和deformable PSROIpooing回去较强的感受野,同时加入inception module获取丰富感受野,检测文字
    • FTSN:InceptText的平民版本
    • etc

    而基于SSD的方法具体代表如下:

    • TextBoxes and TextBoxes++:基于SSD,更改多尺度层中国的anchor尺度,并加入对倾斜框支持
    • SegLink:基于SSD,将文本分为segments和Links,多尺度预测segments和link,利用后处理方法连接成文本
    • etc

    这类方法主要依赖anchor的选取,因为文本的尺度变化剧烈,使得此类方法anchor的数量较多,进而效率较低。同时由于anchor的匹配机制,每次针对roi区域生成一系列的anchor,筛选合适的anchor最为胜负样本的标签,在预测阶段由于proposals很多,使得recall通常较高;但是,对于较长而且密集的文本行而言,此时的anchor宽高比可能高于10,甚至更高,不但网络需要更大的感受野,同时需要配合较大宽高比的anchor,此时基于anchor的检测方法需要精心设计,使得anchor尽可能的覆盖所有的文本尺度。

    对比Pixel-based的方法,如:

    • pixellink:基于FCN分割网络,加入对pixel score Map的预测和当前像素与周围像素link的预测,后处理获得文本实例
    • sotd:纯分割网络,加入border,用来分割密集文本。后处理通过minAreaRect获得检测框
    • PSENet:FPN,预测不同大小的kernel,通过扩张算法得到各自的文本实例
    • EAST:resnet50-based Unet,加入geo_map和score_map的预测,最后通过每个像素预测框Nms得到最后的预测框
    • DDR:EAST的孪生版本
    • FOTS:基于EAST改进,加入OHEM, ROIRotate以及识别分支
    • etc

    通常为分割+回归,或者单独的分割接后处理的形式。这类方法基础网络多为Unet或者FPN,因此对小目标分割具有一定的优势,但是其回归的方式多依赖网络的感受野:如east,DDR, FOTS。虽然通过一些样本挖掘的方法可以获得一定的提升,但是感受野不足导致此类模型在回归较长文本或者较大文本时,容易出现检测不全或者丢失的情况。

    上述是三种方法的回归方式可以用下图表示:

    pixel-based方法和anchor-based方法的回归方式


    其中pixel-based的回归方法,回归时每个像素点预测到四条边或者四个角点的绝对距离,这类方法,当文本较长或者较大时,如果网络感受野不够充足,会导致预测的值不能到到达文本的边界,出现文本框断裂的情况;而Link regression的方法,典型代表为PSENet,pixellink等方法,此类方法对感受野依赖较小,因为关注的是像素与其周围像素的从属关系。如pixellink,除了对当前像素预测其属于文本还是非文本,同时会预测其与周围8个像素的连接关系,如果存在连接,则输入同一个文本实例。但是此类方法依赖的一点为分割结果图的准确性。如果分割不够精准,容易出现像素逐渐的引入周围的噪声,出现错误的预测结果。同时,对于文本区域较为稀疏的情况,此类方法难以实用,因为文本间隙的背景信息,在训练过程中为噪声信息,当背景信息足够多,或者上下文信息迫使网络将其预测为背景,就会出现文本无法被检测出来的情况。典型的文字为大而镂空的文字。这也是多数文字检测算法无法将其完整检测的原因。

     

    针对上述的检测方法的弱点,作者提出了anchor-based和pixel-based结合的方法,结合两种方法的优势,不仅在icdar2015上达到了SOTA,同时对长行的中文检测场景有较好的适应性。

    网络结构

    网络结构可以分为两部分,其中pixel-based的方法为对EAST的改进,anchor-based的方法为对SSD的改进。前者主要为了检测中等的文本,后者主要为了检测长行和较小的文本。

    针对EAST的改进

    网络结构如下图所示:

     

    EAST分支的网络结构示意图

    针对EAST的改进,文章延续FOTS对EAST的改进,加入以下插件:

    • ASPP
    • OHEM:针对分类和回归

    ASPP来自deeplab中,其主要作用是在不降低feature map分辨率的情况下,提升网络的感受野,即可以提升模型获取上下文信息的能力。它会带来什么效果呢?
    首先,是分割效果更为精准。分割一个物体,网络往往借助的是该物体周围的信息,比如,分割前景,我们需要找到背景信息;当感受野变大时,对于较长的文本或者较大的文本,可以很好的找到其边界,进而分割出较高质量的文本区域;其次,感受野的提升,会是的回归的距离变长。即geo_map中的值表示,当前像素到四条边的距离。而网络建立起当前像素与边界之间的距离关系。当上下文信息充足时,可以准确的建立起距离关系,进而边界预测足够精准。因此文章加入ASPP的作用主要是以上两点,分割精准+边界定位精准。

    OHEM常用来进行困难样本挖掘。对于文字区域的分割,存在样本的不平衡,文字区域往往占比比较小,背景占比比较大。同时,对于一张图中的多个文本,小的文本区域的损失往往被大文本区域损失覆盖;而且还有一种情况,背景中存在难以区分的样本,这些背景容易导致模型将类似的文本区域分为背景。因此加入OHEM,可以对这部分背景信息进行挖掘,同时在训练过程中正负样本进行均衡,避免了类别不均衡的问题。

    以上就是该文章对EAST部分的改进。其实OHEM来自FOTS对EAST的改进,ASPP在此之前已经尝试过,确实会带来边界预测的提升。

    对于这部分EAST,除了预测以往的文本区域的score_map和geo_map, 同时预测一张attention map用于对anchor-based分支的信息的辅助。

    针对Textboxes++的改进

    网络结构如下图所示:

    SSD分支网络结构示意图

    文章在EAST的基础上,加入了anchor-based检测分支,主要针对文字尺度以及宽高比较大的变化,文章对SSD进行了定制。如上面右图所示。文章主要利用来自ResNet50中的1/4和1/16的feature map:

    对于1/4的map,由于其处于底层,因此具有一定的分辨率,对于检测较小的文字具有一定优势。同时由于此处的特征语义信息较弱,文章将east分支得到的attention map用在此处,主要为了对该层加入一定的语义信息。具体操作为,对来自east的attention map输出进行exp激活,然后与1/4 feature map进行对应位置的加权。这么做的好处是,对1/4feature map上的信息,属于文本的像素进行加强,对于不属于文本的像素进行抑制,突出文本信息。文章说,这么做可以很大程度的减少错误检测。这里需要解释下为什么anchor-based的方法检测小目标会出现较高的fp.原因在于,在较高分辨率的feature map上生成proposals时,由于像素点比较多,目标较小,因此整张图中网格都处于负样本区域,极少数网格落在正样本区域。这样在预测是,负样本较正样本多,而且负样本的方差较大,因此容易导致分类的错误,因此容易出现fp.

    对于1/16的map,文章进一步的进行特征提取,一是为了获得更大的感受野,二是为了获得多尺度的信息。分别为1/32. 1/64, 1/64, 1/64。但是为了避免出现很小的feature map,文章在后面的feature map保持在1/64。但为了继续提升感受野,文章在后面两个尺度的的生成时,加入了空洞卷积,在分辨率不减小的情况下,获得较大感受野。对于每一层的feature map,文章在其后加入APL层,层中内容如上图右图中的左半部分所示,分别为不同的卷积核搭配不同的宽高比,实现对不同尺度,不同角度的文本的cover.如3x3为方框,3x5主要为了检测水平倾斜的文字,5x3为了检测垂直倾斜的文字。1xn,nx1主要为了检测水平和竖排长行的文字。可以看到有夸张的1:35,35:1的宽高比,这在中文场景是很常见的。

    在经过以上APL层之后,将得到的proposal进行拼接,预测最终搞得四边形区域。

    此外,文章为了检测密集文本,加入了anchor density,如下图所示:

     

    Anchor density

    对于每个anchor,进行一定的位置的偏移,是的对于密集的文本来说,可以获得理想的proposals.

    关于后处理

    在预测阶段,文章采用fusion NMS的方法:用anchor-based的方法对小文本和长文本进行检测,pixel—based的方法用来检测中等的文字。其实也算扬长避短。EAST的优势在于检测小文本和中等文本,对于长文本无力。而对于SSD,可以利用夸张的宽高比检测这些难以检测的文字。对于1/4 map上的anchors和其他mao上的长anchors都会被保留,因为1/4上的anchors足够cover小文本,而对于长文本,或者大角度的文本,不具有检测能力。不会因为anchor的匹配机制筛掉挨得很近的框。而对于EAST预测分支,过滤掉小于10像素,以及宽高比不在[1:15, 15:1]的范围的文字。最后将这些box集合到一起,通过nms筛选得到最后的框。

    实验

    数据增强

    文章中提出的loss分别为pixel-loss和anchor-loss,通过设置一定的比例进行调整对模型的贡献。在训练过程中,文章从原图中随机crop 640x640大小的的图片区域输入至网络中进行训练。然后模型首先在SynthText上进行与训练,然后在此基础上对各组实验进行微调。

    结果

    文章针对小文本、长文本、大角度文本分别作了实验,证明该算法的有效性。下面是效果图:

    中文以及icdar2015的数据样例

    可以看到,图中的长文本、小文本检测较为良好,这都归功于ASPP和大的宽高比的anchors和卷积。

    以下是在ICDAR2015上的实验结果:

    ICDAR2015算法性能

    文章老早就在git上宣传,现在看来效果还是很不错的,单尺度达到了SOTA。 这里可以对比一下TextBoxes++,EAST以及pixel-anchor。

    EAST针对分割和回归加入OHEM后f1-score可以从80.72提升至85.31,这是FOTS做的事情。也就是说,在此基础上,加入ASPP,同样会带给EAST性能的提升。也就是文章在加入attention分支,以及anchor-based分支之后,性能从85.31+提升至87.68。这里面主要贡献来自:

    • SSD分支对较大文本以及较长文本的检测,换句话说这部分较大的感受野对基础网络EAST的矫正有一定的帮助,同时attention map与1/4的结合,也会提升EAST对文本的召回。
    • 对于EAST无法检测出来的文本,通过SSD分支可以进行弥补,因此召回提升很多
    • 对于精度方面,可以看出存在一定的误检,这主要来自于SSD对小目标的误检(我猜的)

    在多语言ICDAR2017 MLT上,同样的结果:

    ICDAR2017 MLT上性能

    分析

    文章结合了anchor-based和pixel-based的方法的优点,扬长避短,一定程度上解决了长行,小文本以及倾斜文本的检测。但是anchor-based的分支依赖较强的手工设定anchor,同时anchor-based的缺点未必可以利用pixel-based的方法弥补回来。再者,论文中相当于是针对Textboxes++添加了EAST分支,多任务网络势必带来效果的提升,但是论文没有针对每一个模块带来的提升做详细分析,比如ASPP的提升,SSD的提升等。不管怎么说,效果好就是好方法,而且也是少见的拿出来解决长行的检测方法。

    总结

    如今的检测方法逐渐的从anchor-based的方法转向了语义分割,接着出现了实例分割的相关算法,现在又在结合两者。在多角度文本检测时,分割的效果比anchor-based的方法适用性更强。因此,如果能够把anchor-based的方法彻底解放,无需手工设计anchor,然后基于分割的方法进一步的简化,两者的结合应该会灰常的厉害吧。期待中。(PS:参考文献这里就不放了,应该会很长吧)

    作者:Ez_Life
    链接:https://www.jianshu.com/p/8db0ec29aaab
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 更新日期:2019年12月30日。 Github源码:[点我获取源码] ...文字识别需要鉴权认证的通行令牌TOKEN,登录百度AI开放平台控制台,通过新建应用获取应用的APIKEYSECRETKEY,在任意初始化位置...
  • 场景文字检测识别是传统OCR 在自然图片上的延续升级,它的应用极其广泛,例如无人超市、智能导盲无人驾驶等新兴技术等都离不开场景文字识别。 相比传统OCR,场景文字的检测识别面临着巨大的挑战。 首先,相比...
  • 文字检测+识别之FOTS

    万次阅读 2018-11-29 16:55:50
    论文:FOTS: Fast Oriented Text Spotting with a Unified Network ...   商汤深圳先进院乔宇老师合租的...FOTS是一个快速的端到端的集成检测+识别框架其他two stage的方法相比,FOTS具有更快的速度。 ...
  • 场景文字检测识别目前来讲大概分为场景文字检测、场景文字识别、以及端到端文字检测和识别三个主要的方向。其中文字检测方法主要是包括基于文本框回归的分类、基于分割的回归、以及分割回归结合的方法。过去两三年...
  • 文字识别总结(OCR)

    万次阅读 多人点赞 2018-11-15 10:26:31
    最近在读Tesseract相关文章,发现一篇总结的不错的文章,对刚入门或者准备入门的具有挺大参考价值,转自:http://www.xtecher.com/Xfeature/view?aid=5372 链接可能挂掉了,今天重新补充一下...二 ,印刷体文字识别...
  • 随着深度学习的发展,计算机视觉领域涌现出了很多端到端模型,图像、场景文字检测识别模型也在此基础上有个长远发展。 1、基础网络框架 在CV领域,图像识别、检测的基础是特征提取,经典的图像分类模型包括VGGNet...
  • 文字识别分为两个具体步骤:文字的检测文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别。今天我们首先来谈一下当今流行的文字检测技术有哪些。 文本检测不是一件...
  • 简单单人跟踪:https://github.com/Sierkinhane/human_tracker(基于目标检测与特征映射算法) 演示视频:https://www.bilibili.com/video/av44360925 新写的关于人脸检测算法MTCNN的文章https://...
  • 基于STN的场景文字识别框架整理

    千次阅读 2019-12-02 19:43:42
    当前场景文字识别较为主流的方法分为 attention mechanism(代表:Show, Attend and Read; Transformer-based attention; 各种各样的 2D Attention) STN + CRNN /DenseNet + CTC,二者的主要区别是一个是在解码...
  • 文字识别(一)--传统方案综述

    万次阅读 多人点赞 2019-02-17 12:48:15
    文字识别是计算机视觉研究领域的分支之一,归属于模式识别人工智能,是计算机科学的重要组成部分,本文将以上图为主要线索,简要阐述在文字识别领域中的各个组成部分(更侧重传统非深度学习端到端方案)。...
  • 模块设计:我们使用统一框架和模块化设计实现了各个算法模块。一方面可以尽量实现代码复用,另外一方面,方便大家基于此框架实现新的算法。我们把文字检测,基于分割的文字识别以及关键信息识别网络结构,抽象成 ...
  • 2020年科大讯飞自然场景文字检测前三名队伍分享

    万次阅读 多人点赞 2020-12-07 14:33:19
    第三名 北理工_VRteam3.1 团队介绍3.2 算法介绍3.2.1 任务分析3.2.2 模型选择3.2.3 数据的设置3.2.4 数据的后处理3.2.5 模型融合3.2.6 实验结果3.3 算法优化3.3.1 框架概述3.3.2 核心模块-特征提取器3.4 提分策略...
  • [开源代码与数据集]场景文字检测识别(from McLab) [开源代码与数据集]场景文字检测识别(from McLab) 端到端场景文本识别M. Liao, B. Shi, X. Bai, X. Wang, W. Liu. TextBoxes: A fast text detector with a...
  • 基于深度学习的目标检测及场景文字检测研究 转载自:https://blog.csdn.net/u013250416/article/details/79591263 一.目标检测与场景文字检测定义目标检测:给定一张图片或者视频帧,找出其中所有目标的...
  • 在计算机视觉技术专题,华为云OCR人工智能高级算法工程师王晶分享了“文字识别服务的技术实践、底层框架及应用场景”的主题演讲。 演讲的第一部分,他分享了文字检测和识别的基础知识以及难点...
  • 所以一般来说,从自然场景图片中进行文字识别,需要包括2个步骤:文字检测:解决的问题是哪里有文字,文字的范围有多少文字识别:对定位好的文字区域进行识别,主要解决的问题是每个文字是什么,将图像中的文字区域...
  • 文字检测文字识别; 支持GPU/CPU,CPU优化(opencv dnn) docker镜像服务(CPU优化版本) 下载镜像 链接:https://pan.baidu.com/s/12F9AYVyBTz34UCXeWj3ATA密码:5lyz docker load -i darknet-ocr.tar docker ...
  • 摘要 本文介绍图像文本识别(OCR)领域的最新技术进展。...然后介绍最近三年来出现的各种文本边框检测模型、文字内容识别模型、端到端图文识别模型。最后介绍图文识别领域的大型公开数据集。 应用概述 OCR...
  • 基于深度学习的目标检测及场景文字检测研究进展

    万次阅读 多人点赞 2018-03-17 21:19:02
    根据本人组会PPT总结整理,复习备用。一.目标检测与场景文字检测定义目标检测:给定一张图片或者视频帧,找出其中所有目标的位置,并给出每个目标的具体...文字识别(Text Recognition):对定位后的文字进行识别。...
  • 摘 要 本设计主要运用MATLAB的仿真平台设计进行文字识别算法的设计与仿真。也就是用于实现文字识别算法的过程。从图像中提取文字属于信息智能化处理的前沿课题,是当前人工智能与模式识别领域中的研究热点。由于文字...
  • 文字识别主流算法对比分析

    千次阅读 2020-08-05 09:01:43
    RARE是一种特殊设计的深神经网络,它由一个Spatial Transformer Network(STN)序列识别网络(SRN): 主要贡献: 1、提出了一种对不规则文本具有鲁棒性的场景文本识别方法。 2、使用基于attention的模型并扩展了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,958
精华内容 8,783
关键字:

文字检测和文字识别框架