精华内容
下载资源
问答
  • 虽然目前的应用范围尚未扩大,但自然环境OCR的市场潜力是不可小觑的。 从古至今,文字经历了数代变革,最终发展成为现在的简体字。近来以来,随着科技的发展,人类变得越来越“懒”,从抛弃纸笔...

    虽然目前的应用范围尚未扩大,但自然环境OCR的市场潜力是不可小觑的。

    \

    从古至今,文字经历了数代变革,最终发展成为现在的简体字。近来以来,随着科技的发展,人类变得越来越“懒”,从抛弃纸笔投入电脑的怀抱,再到现在从键盘到语音的转移。虽然不管如何发展,文字依然是人们不可丢弃的东西,但是出于让生活更便利的目的,它也在随着科技而发生变化,比如担当着人工智能基础之一的文字识别技术(OCR)。

    OCR是指光学设备(扫描仪、数码相机等)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程,其本质就是利用光学设备去捕获图像并识别文字,将人眼的能力延伸到机器上。此概念是在1929年由德国科学家Tausheck最先提出来的,后来美国科学家Handel也提出了利用技术对文字进行识别的想法。

    \

    到目前为止,已经有不少专注于文字识别的公司,并且也推出了相关系列的产品,比如汉王的名片王、国外的ABBYY、Google等。不过,由于人类多方面需求的进一步扩大与提升,传统OCR已经不能填补这些空洞,而自然场景OCR就在这样的需求下应运而生。如此,自然场景OCR都用到了哪些领域?

    \

    自然环境OCR+机器人,让人机交互更自然

    说到人机交互,大多人想到的都是语音交互,毕竟这是人类之间运用率最高的交流方式。但是,纵然现在语音识别的技术已经发展的相当成熟,可交互方式并不能仅仅局限于这一种,肢体、眼睛等等都是一个交互过程中必不可少的东西。

    出于天性,人们喜欢与他人分享自己喜欢的东西,比如一部影片、一本书、一个活动等等,在这其中,文字的存在理所当然,眼睛的作用也就显得不容忽视。以陪护机器人为例,孩子们都喜欢色彩斑斓、嵌有图片的书籍,而在阅读的过程中,他们总会碰到不认识的字,这时候,陪护机器人需要通过眼睛扫描书页,再经过算法识别出其中的文字,从而才能从物联网中找出相关的答案。如果是传统的OCR,此时文字周边的色彩就会对文字识别产生一定的干扰,而这是自然环境OCR所解决的问题之一,目前相关机构也取得了相当大的进展。

    \

    另外,当机器人普及,不管是生活还是办公,人们也会要求陪护机器人去取一些东西。如果只是依靠图像识别的话,预计机器人有八成的可能会拿错东西,毕竟图像识别仅能识别出形状、颜色等因素,而这番套路在同种包装的番茄酱与草莓酱的面前是没有用武之地的。若要求机器人在拿取物品方面能够达到技改的准确率,自然环境OCR是必然选择(传统OCR难以识别曲面字体)。

    \

    自然环境OCR+翻译,走遍天下都不怕

    对于大多国内观众而言,等待国外剧集的熟肉是一个剧迷的必经过程;出国旅游时,我们最怕的就是孤身一人……这种种现象的出现只因为一个原因——语言不通。

    外面的世界是一个多样的世界,文字也被人们以多种形式呈现出来,像多个字一笔带过的,与背景几乎融为一体的,抽象字体等等,这些都是出门在外经常碰得到的。为了解决这个问题,Google、百度等科技企业都推出了翻译软件,不过,经过镁客君亲身测试,对于光线明亮的方正字体,这些软件的翻译效果还是不错的,但是一旦涉及艺术字,结果就悲剧了,可能字都识别不出来,更何谈翻译。

    对于此类自然环境之中的文字,目前的自然环境OCR虽然不能达到完美的效果,但基于出国游旅客人数的日益增长,此类翻译软件必然是未来的一个趋势。既然翻译软件的势头如此之好,作为其中关键技术的自然环境OCR,理所当然的将受到人们的关注。

    \

    从当前的情况来看,在传统OCR的领域之内,作为人工智能基础之一、计算机视觉分支之一的自然环境OCR的应用范围并没有进行太多的扩充。作为一项技术而言,这也是一个好现,在技术尚未提升到满意的高度、没有挖到消费者更深层次的需求时,过快的市场占领只会根基不稳,比如现在的智能手环,火的很快,临了却因为鸡肋而遭到广大消费者的不满,面临着众多厂商退出的尴尬。

    不过,虽然没有过多的扩充,但机器人与翻译是自然环境OCR目前来讲最容易进入的两大领域,其中,机器人更是目前最具前景的领域。单单在陪护机器人方面,根据ZDC互联网调研中心截止2016年9月的数据显示,在机器人产品用户关注度分布占比中,陪护机器人用户关注度高达32.2%,如果算上服务机器人,总关注度达到了51%,而此前根据IFR的统计,到2017年,全球服务机器人市场容量将接近500亿元。在如此利好情形之下,若自然环境OCR能够完善技术,狠抓用户需求,其市场必然也很有看头。


    原文发布时间:2016-11-01 19:00
    本文作者:韩璐
    本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。
    展开全文
  • 下载源码并配置环境 Requirements tensorflow >= 1.2 cuda >=8.0 python3 opencv(cv2) 1.下载源码 R2CNN_Faster-RCNN_Tensorflow源码:git clone ...

    一.下载源码并配置环境
    Requirements
    tensorflow >= 1.2
    cuda >=8.0
    python3
    opencv(cv2)
    1.下载源码
    R2CNN_Faster-RCNN_Tensorflow源码:git clone https://github.com/DetectionTeamUCAS/R2CNN_Faster-RCNN_Tensorflow
    2.编译(Compile)
    1)cd $PATH_ROOT/libs/box_utils/
    python setup.py build_ext --inplace
    2)cd $PATH_ROOT/libs/box_utils/cython_utils
    python setup.py build_ext --inplace
    3.下载预训练模型
    please download resnet50_v1resnet101_v1 pre-trained models on Imagenet, put it to data/pretrained_weights。(我用的是resnet101_v1)
    下载链接:http://download.tensorflow.org/models/resnet_v1_50_2016_08_28.tar.gz
    http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz
    二.制作自己的数据
    我训练用的是ICDAR2017数据集
    data format
    ├── VOCdevkit
    │ ├── VOCdevkit_train
    │ │ ├── Annotation (xml文件)
    │ │ ├── JPEGImages (jpg文件)
    1.xml生成:(将txt文件批量转换为xml文件,xml文件中是4个点坐标8个数值)
    用的是data/io/ICDAR2015/txt2xml.py,源码中txt2xml.py没有对txt文件中label是“##”or“###”等难以识别的目标过滤掉,论文《R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection》中提到“ As ICDAR 2015 training dataset contains difficult texts that is hard to detect which are labeled as “###”, we only use those readable text for training.”,所以我和我的伙伴在训练时对txt2xml.py做了一些修改:1)过滤掉了 "###"数据2)而且还对txt文件中坐标值存在非整型的数据进行了过滤;3)制作好tfrecord文件训练过程中报错“ValueError: attempt to get argmax of an empty sequence”,百度原因可能是“图片的长宽比(width/height)要在一个合理的范围之间,就是太过瘦长的图片不要,进行了过滤。”修改后的txt2xml.py代码如下:

    import os
    from xml.dom.minidom import Document
    from xml.dom.minidom import parse
    import xml.dom.minidom
    import numpy as np
    import csv
    import cv2
    import codecs
    import re
    
    def WriterXMLFiles(filename, path, box_list, labels, w, h, d):
    
        # dict_box[filename]=json_dict[filename]
        doc = xml.dom.minidom.Document()
        root = doc.createElement('annotation')
        doc.appendChild(root)
    
        foldername = doc.createElement("folder")
        foldername.appendChild(doc.createTextNode("JPEGImages"))
        root.appendChild(foldername)
    
    
        nodeFilename = doc.createElement('filename')
        nodeFilename.appendChild(doc.createTextNode(filename))
        root.appendChild(nodeFilename)
    
        pathname = doc.createElement("path")
        pathname.appendChild(doc.createTextNode("xxxx"))
        root.appendChild(pathname)
    
        sourcename=doc.createElement("source")
    
        databasename = doc.createElement("database")
        databasename.appendChild(doc.createTextNode("Unknown"))
        sourcename.appendChild(databasename)
    
        annotationname = doc.createElement("annotation")
        annotationname.appendChild(doc.createTextNode("xxx"))
        sourcename.appendChild(annotationname)
    
        imagename = doc.createElement("image")
        imagename.appendChild(doc.createTextNode("xxx"))
        sourcename.appendChild(imagename)
    
        flickridname = doc.createElement("flickrid")
        flickridname.appendChild(doc.createTextNode("0"))
        sourcename.appendChild(flickridname)
    
        root.appendChild(sourcename)
    
        nodesize = doc.createElement('size')
        nodewidth = doc.createElement('width')
        nodewidth.appendChild(doc.createTextNode(str(w)))
        nodesize.appendChild(nodewidth)
        nodeheight = doc.createElement('height')
        nodeheight.appendChild(doc.createTextNode(str(h)))
        nodesize.appendChild(nodeheight)
        nodedepth = doc.createElement('depth')
        nodedepth.appendChild(doc.createTextNode(str(d)))
        nodesize.appendChild(nodedepth)
        root.appendChild(nodesize)
    
        segname = doc.createElement("segmented")
        segname.appendChild(doc.createTextNode("0"))
        root.appendChild(segname)
    
        for box, label in zip(box_list, labels):
    
            nodeobject = doc.createElement('object')
            nodename = doc.createElement('name')
            nodename.appendChild(doc.createTextNode(label))
            nodeobject.appendChild(nodename)
            nodebndbox = doc.createElement('bndbox')
            nodex1 = doc.createElement('x1')
            nodex1.appendChild(doc.createTextNode(str(box[0])))
            nodebndbox.appendChild(nodex1)
            nodey1 = doc.createElement('y1')
            nodey1.appendChild(doc.createTextNode(str(box[1])))
            nodebndbox.appendChild(nodey1)
            nodex2 = doc.createElement('x2')
            nodex2.appendChild(doc.createTextNode(str(box[2])))
            nodebndbox.appendChild(nodex2)
            nodey2 = doc.createElement('y2')
            nodey2.appendChild(doc.createTextNode(str(box[3])))
            nodebndbox.appendChild(nodey2)
            nodex3 = doc.createElement('x3')
            nodex3.appendChild(doc.createTextNode(str(box[4])))
            nodebndbox.appendChild(nodex3)
            nodey3 = doc.createElement('y3')
            nodey3.appendChild(doc.createTextNode(str(box[5])))
            nodebndbox.appendChild(nodey3)
            nodex4 = doc.createElement('x4')
            nodex4.appendChild(doc.createTextNode(str(box[6])))
            nodebndbox.appendChild(nodex4)
            nodey4 = doc.createElement('y4')
            nodey4.appendChild(doc.createTextNode(str(box[7])))
            nodebndbox.appendChild(nodey4)
    
            # ang = doc.createElement('angle')
            # ang.appendChild(doc.createTextNode(str(angle)))
            # nodebndbox.appendChild(ang)
            nodeobject.appendChild(nodebndbox)
            root.appendChild(nodeobject)
        fp = open(os.path.join(path,filename), 'w')
        doc.writexml(fp, indent='\n')
        fp.close()
    
    
    def load_annoataion(txt_path):
        boxes, labels = [], []
        fr = codecs.open(txt_path, 'r', 'utf-8')
        lines = fr.readlines()
    
        for line in lines:
            b = line.strip('\ufeff').strip('\xef\xbb\xbf').strip('$').split(',')[:8]
            print(len(b))
            if (len(b)==8):
                # print(int(float(b)))
                b=[int(float(item)) for item in b]
                # print(b)
                labelName=line.strip('\ufeff').strip('\xef\xbb\xbf').strip('$').split(',')[-1]
                line = list(map(int, b))
                if "#" not in labelName:
                    print(labelName,line)
                    if(len(line)==0):
                        print("#############################",line)
                        # break
                    else:
                        boxes.append(line)
                        labels.append('text')
                else:
                    continue
            elif (len(b)==5):
                pass
    
        return np.array(boxes), np.array(labels)
    
    
    if __name__ == "__main__":
        txt_path = '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/meituan/txt'
        xml_path = '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/meituan/xml'
        img_path = '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/meituan/useful_image'
        print(os.path.exists(txt_path))
        txts = os.listdir(txt_path)
        for count, t in enumerate(txts):
            print("**********txt name:", t)
            boxes, labels = load_annoataion(os.path.join(txt_path, t))
            if (len(boxes)==0):
                # xml_name = t.replace('.txt', '.xml')
                # img_name = t.replace('.txt', '.jpg')
                print("&&&&&&&&&&&&&&&&&&&&&&&&&&",boxes,img_name)
                # break
            else:
                xml_name = t.replace('.txt', '.xml')
                img_name = t.replace('.txt', '.jpg')
                img = cv2.imread(os.path.join(img_path, img_name.split('gt_')[-1]))
                h, w, d = img.shape
                #0.462-6.828
                if (w/h>0.8 and w/h<6.828):
                    WriterXMLFiles(xml_name.split('gt_')[-1], xml_path, boxes, labels, w, h, d)
                    cv2.imwrite("/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/meituan/voc_image/"+img_name,img)
                    if count % 1000 == 0:
                        print(count)
                else:
                    print("**************************************",img_name)
    

    2.制作tfrecord文件
    1): 改/R2CNN_Faster-RCNN_Tensorflow/libs/configs/cfgs.py
    第9行 NET_NAME=‘resnet_v1_101’ 作者用的是101
    第8行 VERSION = ‘RRPN_ICDAR2017_v1’
    第64行 DATASET_NAME = ‘ICDAR2017’
    CLASS_NUM改为1(文本检测label只有一个:text)
    2): 在/libs/label_name_dict/label_dict.py里面添加dataset

    elif cfgs.DATASET_NAME=='ICDAR2017':
          NAME_LABEL_MAP={
                 'background' : 0,
                 'text' : 1
          }
    

    3):在R2CNN_Faster-RCNN_Tensorflow/data/io/convert_data_to_tfrecord.py文件第13-20行更改各个参数路径和名字,如下:

    ROOT_PATH = '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow'
    
    tf.app.flags.DEFINE_string('VOC_dir', '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/VOCdevkit_train/', 'Voc dir')
    tf.app.flags.DEFINE_string('xml_dir', '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/VOCdevkit_train/Annotation', 'xml dir')
    tf.app.flags.DEFINE_string('image_dir', '/home/trainingai/zyang/R2CNN_Faster-RCNN_Tensorflow/VOCdevkit/VOCdevkit_train/JPEGImages', 'image dir')
    tf.app.flags.DEFINE_string('save_name', 'train', 'save name')
    tf.app.flags.DEFINE_string('save_dir', ROOT_PATH + '/data/tfrecords/', 'save name')
    tf.app.flags.DEFINE_string('img_format', '.jpg', 'format of image')
    tf.app.flags.DEFINE_string('dataset', 'ICDAR2017', 'dataset')
    FLAGS = tf.app.flags.FLAGS
    

    4)在3):在R2CNN_Faster-RCNN_Tensorflow/data/io/read_tfrecord.py第75行dataset_name中需要添加自己的dataset name
    上述修改完毕后cd $R2CNN_Faster-RCNN_Tensorflow/data/io/ 运行
    python convert_data_to_tfrecord.py --VOC_dir=’***/VOCdevkit/VOCdevkit_train/’ --save_name=‘train’ --img_format=’.jpg’ --dataset=‘ICDAR2017’
    至此,tfrecord文件生成成功,很大!
    三.训练自己的模型
    对cfgs.py文件进行修改,一些超参数如下:

    EPSILON = 1e-4
    MOMENTUM = 0.9
    LR = 0.0001
    DECAY_STEP = [190000, 380000]  # 90000, 120000
    MAX_ITERATION = 500000
    
    # -------------------------------------------- Data_preprocess_config
    DATASET_NAME = 'ICDAR2017'  # 'ship', 'spacenet', 'pascal', 'coco'
    PIXEL_MEAN = [123.68, 116.779, 103.939]  # R, G, B. In tf, channel is RGB. In openCV, channel is BGR
    IMG_SHORT_SIDE_LEN = 720
    IMG_MAX_LENGTH = 1280
    CLASS_NUM = 1
    
    # --------------------------------------------- Network_config
    BATCH_SIZE = 1
    INITIALIZER = tf.random_normal_initializer(mean=0.0, stddev=0.01)
    BBOX_INITIALIZER = tf.random_normal_initializer(mean=0.0, stddev=0.001)
    WEIGHT_DECAY = 0.0001
    

    初始学习率设置LR = 0.0001,一开始设置0.001训练显示total loss一直显示nan,原因是初始学习率过大;训练步数设置MAX_ITERATION = 500000,根据自己的情况合理设置;图片size设置IMG_SHORT_SIDE_LEN = 720 IMG_MAX_LENGTH = 1280和论文保持一致;设置BATCH_SIZE = 1,目前模型只支持BATCH_SIZE = 1
    修改完毕后cd $R2CNN_Faster-RCNN_Tensorflow/tools目录下运行python train.py即可!
    训练过程如下:
    在这里插入图片描述
    接下来就是等待漫长的训练过程了。。。

    四.调用自己的训练模型进行测试
    cfgs.py中预训练模型改成自己训练好的模型,如下

    # PRETRAINED_CKPT = ROOT_PATH + '/data/pretrained_weights/' + weights_name + '.ckpt'                      # train
    # PRETRAINED_CKPT = ROOT_PATH + '/data/pretrained_weights/our_pretrained_weights/' + weights_name + '.ckpt'         # train
    PRETRAINED_CKPT = ROOT_PATH + '/output/trained_weights/RRPN_ICDAR2017_v1_19.4w/' + weights_name + '.ckpt'        # test
    TRAINED_CKPT = os.path.join(ROOT_PATH, 'output/summary')
    

    cd 到R2CNN_Faster-RCNN_Tensorflow/tools目录下,
    运行python inference.py --data_dir=‘R2CNN_Faster-RCNN_Tensorflow/tools/inference_image/’
    –gpu=‘0’
    到此配置模型环境–制作数据集–训练模型–调用模型测试各个环节已全部完毕!

    展开全文
  • 今天是进入公司实习的第三周了,在小组内负责的工作主要是和自然场景文本检测相关的内容。这里把看过的论文做一下翻译和整理,也方便自己日后查看。 Paper:STN-OCR: A single Neural Network for Text Detection ...

    今天是进入公司实习的第三周了,在小组内负责的工作主要是和自然场景文本检测相关的内容。这里把看过的论文做一下翻译和整理,也方便自己日后查看。
    Paper:STN-OCR: A single Neural Network for Text Detection and Text Recognition
    Github地址:https://github.com/Bartzi/stn-ocr

    摘要

    检测和识别自然场景图像中的文本是一项具有挑战性但尚未完全解决的任务。近年来,已经提出了几种试图解决两个子任务(文本检测和文本识别)中的至少一个的新系统。在本文中,我们提出了STN-OCR,这是迈向场景文本识别的半监督神经网络的一步,可以进行端到端的优化。与大多数由多个深度神经网络和几个预处理步骤组成的现有作品相比,我们建议使用单个深度神经网络,该网络学习以半监督方式从自然图像中检测和识别文本。 STN-OCR是一个集成并共同学习空间变换器网络的网络[16],可以学习检测图像中的文本区域,以及文本识别网络,它采用识别的文本区域并识别其文本内容。我们研究了我们的模型在一系列不同任务(行为的检测和识别以及文本行)上的行为方式。公共基准数据集的实验结果显示了我们的模型处理各种不同任务的能力,而整体网络结构没有实质性变化。

    1、介绍

    文本在我们的日常生活中无处不在。文本可以在文档,道路标志,广告牌和其他对象(如汽车或电话)上找到。自动检测和读取自然场景图像中的文本是系统的重要组成部分,可用于几个具有挑战性的任务,如基于图像的机器翻译,自动驾驶汽车或图像/视频索引。近年来,在自然场景中检测文本和识别文本的任务已经引起了计算机视觉和文档分析社区的极大兴趣。此外,在计算机视觉的其他领域最近的突破[10,16,25,26]使得能够创建比以前更好的场景文本检测和识别系统[5,9,28]。

    尽管可以看出光学字符识别(OCR)的问题已经解决了打印文档文本,但是检测和识别自然场景图像中的文本仍然是具有挑战性的。包含自然场景的图像表现出大量的光照变化,透视扭曲,图像质量,文本字体,不同的背景等。大多数现有的研究工作开发了端到端的场景文本识别系统,包括复杂的两步,其中第一步是检测图像中的文本区域,第二步是识别该识别区域的文本内容。大多数现有作品只关注这两个步骤中的一个。

    在本文中,我们提出了一个解决方案,该解决方案由单个深度神经网络(DNN)组成,可以学习以半监督的方式检测和识别文本。这与现有作品相反,在现有作品中,文本检测和文本识别系统以完全监督的方式单独训练。最近的工作[3]表明,卷积神经网络(CNNs)能够学习如何解决复杂的多任务问题,同时以端到端的方式进行训练。

    我们的动机是利用CNN的这些功能,创建一个端到端的场景文本识别系统,通过将任务划分为更加像人类一样的行为,分成较小的子任务并相互独立地解决这些子任务。为了实现这一行为,我们学习了一个DNN,它能够将输入图像划分为子任务(单个字符,单词甚至文本行)并相互独立地解决这些子任务。这是通过联合学习使用循环空间变换器[16,31]作为注意机制和文本识别网络的定位网络来实现的(参见图1,系统的示意图)。 在此设置中,网络仅接收图像和该图像中包含的文本的标签作为输入。 文本的本地化是由网络本身学习的,使这种方法成为半监督。

    我们的贡献如下:(1)我们提出了一个系统,该系统是通过集成空间变换器网络来解决端到端场景文本识别的一个步骤。 (2)我们以半监督的方式训练我们提出的端到端系统。(3)我们证明我们的方法能够在一系列标准场景文本检测和识别基准上达到最先进的有竞争力的水平。 (4)我们向研究界提供代码1和训练模型2。

    本文的结构如下:在第2节中,我们概述了与我们相关的其他研究人员的工作。第3节详细描述了我们提出的系统,并提供了如何训练这样一个系统的最佳实践。 我们在第4节中展示和讨论我们在标准基准数据集上的结果,并在第5节中总结我们的发现。

    2、相关工作

    多年来,已经开发并发布了用于场景文本检测和识别的不同方法的丰富环境。 几乎所有系统都使用两步过程来执行场景文本的端到端识别。 第一步是检测文本区域并从输入图像中提取这些区域。 第二步是识别文本内容并返回这些提取的文本区域的文本字符串。

    还可以将这些方法分为三大类:(1)依赖手工制作和人类先验知识所提取出特征的系统用于文本检测和文本识别。 (2)系统使用深度学习方法和手工制作的功能,或两个不同的深度网络用于这两个步骤中的每一步。 (3)系统不包括两步法,而是使用单个深度神经网络进行文本检测和识别。 我们将在下面讨论每个类别的一些系统。

    手工制作的特征
    在开始时,基于手工制作的特征和人类知识的方法已被用于执行文本检测。这些系统使用MSER [24],Stroke Width Transforms [4]或HOG-Features [32]等功能来识别文本区域并将它们提供给系统的文本识别阶段。 在文本识别阶段,使用滑动窗口分类器[21]和使用HOG特征[33]的SVM [34]或k-最近邻分类器的集合。 所有这些方法都使用手工制作的功能,这些功能具有多种超级参数,需要专业知识才能正确调整它们以获得最佳效果。

    深度学习方法
    最近的系统通过使用DNN的方法在端到端识别系统的一个或两个步骤中基于手工制作的特征交换方法。 Gómez和Karatzas [5]提出了一种特定于文本的选择性搜索算法,该算法与DNN一起可用于检测自然场景图像中的(扭曲的)文本区域。 古普塔等人。 [9]提出了一种基于YOLO-Architecture [25]的文本检测模型,该模型使用完全卷积深度神经网络来识别文本区域。 然后,通过这些方法识别的文本区域可以用作基于执行文本识别的DNN的其他系统的输入。
    Bissacco等人提出了一个完整的端到端架构,使用手工制作的功能执行文本检测。识别的文本区域被二值化,然后用作深度完全连接的神经网络的输入,该神经网络独立地对每个找到的字符进行分类。 Jaderberg等人[15,17]提出了几种使用深度神经网络进行文本检测和文本识别的系统。[17] Jader-berg等人提出了一种滑动窗口文本检测方法,该方法以多种分辨率在图像上滑动卷积文本检测模型。文本识别阶段使用单个字符CNN,它跨越确定的文本区域。该CNN与用于文本检测的CNN共享其权重。在[15] Jaderberg等人。建议使用具有用于文本检测的额外边界框回归CNN的区域提议网络和将整个文本区域作为输入并且在预定义的单词词典上执行分类的CNN,使得该方法仅适用于一种给定语言。
    Goodfellow等人。 [6]提出了一个房屋号码的文本识别系统,由Jaderberg等人提炼。 [18]用于无约束的文本识别。该系统使用单个CNN,它将完整提取的文本区域作为输入,并提供该文本区域中包含的文本。这是通过为给定单词中的每个可能字符设置一个独立分类器来实现的。基于这个想法,他等人。 [11]和Shi等人。 [27,28]提出了将从提取的文本区域中识别字符作为序列识别问题的文本识别系统。他等人。 [11]使用一种朴素的滑动窗口方法,创建文本区域的切片,用作其文本识别CNN的输入。由文本识别CNN产生的特征用作预测字符序列的递归神经网络(RNN)的输入。在我们关于纯场景文本识别的实验中(参见4.3节了解更多信息)我们使用了类似的方法,但是我们的系统使用了更复杂的滑动窗口方法,其中滑动窗口的选择由网络自动学习而不是由手。施等人。 [27]利用CNN,该CNN使用完整文本区域作为输入并产生一系列特征向量,这些特征向量被馈送到RNN,RNN预测提取的文本区域中的字符序列。该方法基于文本区域的宽度生成固定数量的特征向量。这意味着对于仅包含几个字符但与文本区域具有足够多字符的宽度相同的文本区域,此方法将生成用作RNN输入的相同数量的特征向量。在我们的纯文本识别实验中,我们利用我们的方法的力量来学习在提取的文本区域中处理最重要的信息,因此只产生尽可能多的特征向量。施等人。 [28]通过首先添加额外的步骤来改进他们的方法,该步骤利用空间变压器网络[16]的整流能力来纠正提取的文本行。 其次,他们在网络中添加了一种软关注机制,有助于在输入图像中生成字符序列。 在他们的工作中,Shi等人。 利用空间变换器作为额外的预处理步骤,使识别网络更容易识别图像中的文本。 在我们的系统中,我们使用空间变换器作为核心构建块,以半监督的方式检测文本。

    端到端的可训练方法
    所提出的系统总是使用两步法来检测和识别场景文本图像中的文本。 虽然最近的方法利用深度神经网络,但他们仍然在任一步骤中或在两个步骤的结果融合在一起的时刻使用大量手工制作的知识。 史密斯等人。 [30]提出了一种端到端的可训练系统,能够使用单个DNN检测和识别法国街道名称标志上的文本。 与我们的系统相比,系统不可能提供图像中文本的位置,只能提取文本内容。 此外,我们的方法中使用的注意机制显示出更像人类的行为,因为它依次本地化并识别来自给定图像的文本。

    3、制定系统

    试图查找和阅读文本的人将以顺序方式这样做。 第一个动作是将注意力放在一行文本上,按顺序读取每个字符,然后处理下一行文本。 大多数用于场景文本识别的当前端到端系统不以这种方式运行。 这些系统试图通过一次从图像中提取所有信息来解决问题。 我们的系统首先尝试按顺序参加图像中的不同文本区域,然后识别每个文本区域的文本内容。为此,我们创建了一个简单的DNN,包括两个阶段:(1)文本检测(2)文本识别。 在本节中,我们将介绍文本检测阶段使用的注意概念和所提出系统的整体结构。 我们还报告了成功培训此类系统的最佳实践。

    3.1 用空间变换器检测文本

    Jaderberg等人提出的空间变换器[16]是DNN的可微分模块,它采用输入特征映射I并对该特征映射应用空间变换,产生输出特征映射O.这种空间变换器模块是三个部分的组合。 第一部分是计算函数f( loc)的定位网络,其预测要应用的空间变换的参数θ。 在第二部分中使用这些预测参数来创建采样网格,该采样网格定义输入要素图的哪些要素应映射到输出要素图。 第三部分是可微分插值方法,它采用生成的采样网格并生成空间变换的输出特征映射O.我们将在以下段落中简要描述每个组件。
    关于STN网络结构的构成以及原理如下:

    1、Localisation Network

    Localisation Network的输入是特征图U,输出是变换参数θ,即θ=floc(U),该层的结构通常是一个全连接网络或者卷积网络后接一个回归层来训练参数θ。θ的规模取决于具体的变换,当变换取二维仿射变换时,θ是一个6维(2*3)的向量。

    2、Grid Generator
    该层利用Localisation 层输出的变换参数θ,将输入的特征图进行变换,以仿射变换为例,这里就需要上一篇博客里介绍的双线性插值了,即输出特征图上某一位置(xti,yti)根据变换参数θ映射到输入特征图上某一位置(xsi,ysi),具体如下:
    这里写图片描述
    但此时往往(xsi,ysi)会落在原始输入特征图的几个像素点中间部分,所以需要利用双线性插值来计算出对应该点的灰度值。需要补充的是,文中在变幻时用都都是标准化坐标,即xi,yi∈[−1,1]。(如果不太理解仿射变换和双线性插值,可以参考我的上一篇博客 Spatial Transformer Networks论文笔记(一)——仿射变换和双线性插值),文中给出了该层两个例子,如下图:
    这里写图片描述## 标题 ##
    3、Sampler
    在讲过上面两个部分后,我们可以知道,对于输出特征图上的每一个点,都可以和输入特征图上的某些像素点灰度值建立具体的联系,具体表示成如下公式:
    这里写图片描述
    上式中,Vci为输出特征图上第c个通道某一点的灰度值,Ucnm为输入特征图上第c个通道点(n,m)的灰度值,该点的灰度是由某种插值方法确定,k()为具体的采样核,它定义了输入和输出特征图的重要关系。可以这样理解:(1)输出特征图上某一点Vci的灰度对应于输入特征图上某一点(xsi,ysi)的灰度值,而这点的灰度值由周围的若干点的灰度值Ucnm共同确定并且距离(xsi,ysi)越近(距离关系由xsi−m和ysi−m确定),影响越大(权重越大);(2)具体的灰度插值方法由k()中Φx和Phiy确定。当采用双线性插值方法时,公式如下:

    这里写图片描述

    与公式(3)不同的是,(5)中定义的双线性插值使得目标灰度值只与(xsi,ysi)
    周围4个点的灰度有关。具体来说,当|xsi−m|或者|ysi−m|大于1时,对应的max()项将取0,也就是说,只有(xsi,ysi)周围4个点的灰度值决定目标像素点的灰度并且当1−|xsi−m|和1−|ysi−m|越小,影响越大(即离点(xsi,ysi))越近,权重越大。

    3.2网络整体结构:

    这里写图片描述
    我们工作中使用的网络包括两个主要部分。 第一个是定位网络,它采用输入图像并预测N个变换矩阵,它们应用于N个相同的网格,形成N个不同的采样网格。 生成的采样网格以两种方式使用:
    (1)用于计算所识别的文本区域的边界框
    (2)用N个采样网格对输入图像进行采样,提取N个文本区域。 然后,在识别网络中使用N个提取的文本图像来执行文本识别。 通过仅提供关于每个文本区域的文本标签的信息来对端到端的整个系统进行训练。

    4.网络训练技巧

    用于训练模型的训练集X由一组输入图像I和一组用于每个输入图像的文本标签L I组成。我们不使用任何标签来训练文本检测阶段。这个阶段只是通过使用通过计算交叉熵损失或CTC损失获得的误差梯度来学习检测文本区域。在我们的实验中,我们发现,当从头开始训练时,一个检测和识别两个以上文本行的网络不会收敛。该问题的解决方案是执行一系列预训练步骤,其中难度逐渐增加。此外,我们发现选择用于训练网络的优化算法对网络的收敛有很大影响。我们发现使用随机梯度下降(SGD)在较简单的任务上预训练网络是有益的,而Adam [20]则用于在具有更多文本行的图像上微调已经预先训练好的网络。我们认为SGD在预训练期间表现更好,因为学习率η在较长时间内保持不变,这使得文本检测阶段能够探索输入图像并更好地找到文本区域。随着学习速率的降低,检测阶段的更新变得更小,并且文本检测阶段(理想地)落在已经找到的文本区域上。同时,文本识别网络可以开始使用提取的文本区域并学习识别该区域中的文本。在使用SGD训练网络时,重要的是要注意选择过高的学习率会导致模型早期出现分歧。我们发现,使用1-5和5-7之间的初始学习率几乎适用于所有情况,除非网络只能进行微调。在这里,我们发现使用Adam是更可靠的选择,因为Adam以自适应方式选择每个参数的学习率,因此不允许检测网络像使用SGD时那样彻底地进行探索。

    后面的内容由于篇幅原因这里就不提及了。主要就是针对不同的数据集,实验的效果比对。

    展开全文
  • Python 中文OCR

    万次阅读 2017-09-27 09:58:18
    有个需求,需要从一张图片中识别出中文,通过python来实现,这种这么高大上的黑科技我们普通人自然搞不了,去github找了一个似乎能满足需求的开源库-tesseract-ocr: Tesseract的OCR引擎目前已作为开源项目发布在...

    有个需求,需要从一张图片中识别出中文,通过python来实现,这种这么高大上的黑科技我们普通人自然搞不了,去github找了一个似乎能满足需求的开源库-tesseract-ocr

    Tesseract的OCR引擎目前已作为开源项目发布在Google Project,其项目主页在这里查看https://github.com/tesseract-ocr
    它支持中文OCR,并提供了一个命令行工具。python中对应的包是pytesseract. 通过这个工具我们可以识别图片上的文字。

    笔者的开发环境如下:

    • macosx
    • python 3.6
    • brew

    安装tesseract

    brew install tesseract

    安装python对应的包:pytesseract

    pip install pytesseract

    这里写图片描述

    怎么用?

    如果要识别中文需要下载对应的训练集:https://github.com/tesseract-ocr/tessdata
    ,下载”chi_sim.traineddata”,然后copy到训练数据集的存放路径,如:

    这里写图片描述

    这里写图片描述

    具体代码就几行:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import pytesseract
    from PIL import Image
    
    # open image
    image = Image.open('test.png')
    code = pytesseract.image_to_string(image, lang='chi_sim')
    print(code)

    OCR速度比较慢,大家可以拿一张包含中文的图片试验一下。

    展开全文
  • 本项目基于yolo3 与crnn 实现中文自然场景文字检测及识别 darknet 优化版本:https://github.com/chineseocr/darknet-ocr.git 训练代码(master分支) ocr训练数据集 ocr ctc训练数据集(压缩包解码:chineseocr) ...
  • OCR 技术浅析

    2019-03-15 10:19:45
    图像识别中最贴近我们生活的可能就是 OCR 技术了。可能很多同学还不知道什么是 OCR。我们先来看下 OCR 的定义: OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸...
  • Ocr引擎

    千次阅读 2017-04-18 17:22:29
    纸张在许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成。而过去几年,无纸化办公的概念发生了显着的转变。在计算机软件的帮助 下,包含大量重要管理数据和资讯的文档可以更方便的以电子形式...
  • OCR基础篇

    2021-07-17 13:48:12
    1、什么是OCROCR英文全称是Optical Character Recognition,中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。文字是不可...
  • #chinese-ocr自然场景下不定长文字识别(ctpn + densenet) 注:本文中多处使用各位前辈的经验,项目代码不方便提供,可百度下载参考 ##实现功能 文字方向检测 0、90、180、270度检测 文字检测 后期将切换到keras...
  • 本文基于https://github.com/ouyanghuiyu/chineseocr_lite.git,先学会使用,在了解其中所使用的技术; 环境 pytorch 1.2.0 python3(笔者使用的环境是python3.6) linux/macos/windows(笔者的环境是...
  • 开源OCR引擎调研

    2020-06-30 16:02:14
    关于开源OCR引擎的调研 一、OCR引擎比较 1. 优图OCR (腾讯) https://ai.qq.com/product/ocr.shtml#common 免费API:https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr 该引擎专注于行识别,识别结果准确度高达98%...
  • 本文基于tensorflow、keras/pytorch实现对自然场景的文字检测及端到端的OCR中文文字识别 功能 文字检测 实现keras端到端的文本检测及识别(项目里面有两个模型keras和pytorch。) 不定长OCR识别 Ubuntu下环境...
  • 本文基于https://github.com/ouyanghuiyu/chineseocr_lite.git,先学会使用,在了解其中所使用的技术; 环境 pytorch 1.2.0 python3(笔者使用的环境是python3.6) linux/macos/windows(笔者的环境是win10 家庭版)...
  • OCR技术1

    2019-05-06 10:48:29
    orc的应用现状 应用场景 ...环境复杂,也是一个尚未攻破的难关 OCR识别流程 版面分心预处理图像分割字符识别后处理识别矫正 OCR识别方法 方法 优缺点 Tesseract 对汉子识别精度不...
  • 本文基于tensorflow、keras/pytorch实现对自然场景的文字检测及端到端的OCR中文文字识别 实现功能 文字方向检测 0、90、180、270度检测 文字检测 后期将切换到keras版本文本检测 实现keras端到端的文本检测及...
  • darknet-ocr :项目基于darknet(https://github.com/pjreddie/darknet.git)框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别(https://github.com/chineseocr/darknet-ocr) 不想装环境,直接下载docker镜像...
  • OCR文字识别

    千次阅读 2019-05-29 21:28:31
    OCR定义和起源 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程...
  • 开源ocr

    千次阅读 2013-09-09 14:29:51
    开源的OCR库,Opensourced OCR library 突然想起如何做一个论坛的发帖机,但是现在多数都要图片认证,需要一个OCR库来识别图片。于是在网上找了找,还真是有很多实现: OCRE, OCR Easy, ...
  • ●文字方向检测 0、90、180、270度检测●文字检测 后期将切换到keras版本文本检测 实现keras端到端的文本检测及识别●不定长OCR识别环境部署 Bash ##GPU环境 sh setup.sh ##CPU环境 sh setup-cpu.sh ##CPU python3...
  • OCR—光学字符识别

    千次阅读 2019-03-26 10:44:15
    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。 最近对...
  • 纸张在许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成。而过去几年,无纸化办公的概念发生了显着的转变。在计算机软件的帮助 下,包含大量重要管理数据和资讯的文档可以更方便的以电子形式...
  • 运用tensorflow实现自然场景文字检测,keras/pytorch实现crnn+ctc实现不定长中文OCR识别 最近在学习计算机视觉相关的内容,在github上发现了非常好的项目chinese-ocr 该项目主要实现以下三个功能: 1. 文字方向...
  • OCR识别经典论文CRNN+CTC

    千次阅读 2019-12-18 15:55:22
    OCR-1 An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application ...在自然环境中,识别文字对于计算机视觉和机器学习而言是一个非常具有挑战性的任务。传统的光学字符识...
  • 文字识别技术OCR

    2021-05-30 22:22:38
    可能很多同学还不知道什么是 OCR。我们先来看下 OCR 技术的定义: OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,328
精华内容 1,331
热门标签
关键字:

自然环境ocr