如何用百度大脑文字识别技术,快速集成实用小工具

1、整体概述html

本文主要介绍了由本人开发的、基于百度AI的云猫OCR软件的主要功能,性能评价及核心代码解读。由于是几个帖子合并成一个,因此篇幅较长,但愿各位能耐心看完,固然也能够各取所需。算法

本文主要分为如下几个部分:
第一部分是云猫OCR软件介绍。 由开发者本人亲自介绍软件的主要功能。对标ABBYY等OCR软件,云猫OCR的功能更全面,使用更简单,关键的是云猫OCR目前是彻底免费给你们用的。固然由于是试用版,可能存在一些bug,你们使用的时候不要乱按就行。云猫展现版本的下载地址见帖子:  https://ai.baidu.com/forum/topic/show/955975
第二部分是云猫OCR基于百度OCR的具体实现方式说明。 同时也会对软件的部分核心代码进行展现,便于你们进行参考作出更有创意的产品。
第三部分是云猫OCR使用说明及效果评测。 但由于云猫OCR是2017年末左右开发的,因此用的不是百度OCR最新接口功能,若是云猫能获得你们的支持,我能够考虑开发新版接入更多百度最新的AI接口,但愿你们能多多捧场。
本文的最后部分是附录,附上了我基于百度OCR进行开发的代码解读,使用的是最新的百度手写体识别接口,也一并打包给你们参考。编程

第一部分  云猫OCR的软件介绍缓存

1、云猫OCR简介网络

   云猫OCR是基于百度云OCR算法,由进击的狐狸进行开发的一款软件。本软件由C#语言进行开发,运行在Windows平台上。主要调用的接口是通用文字识别、通用文字识别(高精度)和表格识别等。并发

2、云猫OCR目前实现的主要功能:app

1.批量图片文字识别,能够预览图片,能够对识别结果进行自动换行和缩进,能够控制QPS并发(QPS功能由于百度云的timeout问题而暂时搁置);函数

2.批量表格图片识别,支持自动打开识别结果,用户也能够选择直接打开保存目录;post

3.PDF转图片,在个人笔记本(配置为I7处理器/8G内存/128G SSD硬盘)的硬件环境下,PDF转图片程序模块占用的内存不超过400M,同时能够在2分钟左右的时间内转换超过500页内容的PDF文件。支持一键打开转换结果文件夹。性能

4.云猫软件支持换肤功能,目前有两套皮肤;

5.能够设置API Key和Secret Key;

6.支持中途中止识别;

7.支持把设置改变后对同一张图片进行从新识别;

8.支持多种语言;

9.其余功能,好比识别统计信息、控制字体大小、右键把识别结果另存为rtf文件、全选和复制识别结果等等;

3、演示帖子连接

http://ai.baidu.com/forum/topic/show/492371

4、云猫OCR演示视频连接

https://v.qq.com/x/page/r0564n4a87e.html

建议你们用1.2x或者1.5x倍速观看,由于本人的声速有点慢。

第二部分  云猫OCR基于百度OCR的具体实现方式说明

1、概述

   云猫OCR是基于百度AI,在Windows平台运行的一款软件。我是用C#语言在Visual Studio2017集成开发环境中进行开发的,开发方式是SDK包开发。在开发中,咱们须要参考百度的技术文档。

百度云文字识别技术文档地址:

https://cloud.baidu.com/doc/OCR/index.html

2、准备工做

首先,咱们须要下载最新的百度文字识别的SDK包。

C# SDK包的下载地址以下:

http://ai.baidu.com/sdk#ocr

下载完毕后解压缩,最新的包在文件夹net45里面。

打开Visual Studio2017开发环境,选择新建项目,由于我打算用控制台项目讲解,所以要选择新建项目——C#控制台项目。建好项目以后,须要在项目中引用上面下载的SDK包。

3、核心代码讲解

(一)调用百度OCR函数识别图片文字,返回的格式为Json

代码以下:

using System;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using System.IO;

using System.Drawing;

using System.Collections.Generic;

using System.Linq;

 

namespace myOCRDemo

{

    class Program

    {

        public static void GeneralBasicDemo()

        {

            // 设置APPID/AK/SK

            var API_KEY = "你的 Api Key";

            var SECRET_KEY = "你的 Secret Key";

            //建立对象

            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);

            client.Timeout = 60000;  // 修改超时时间

            var image = File.ReadAllBytes("图片文件路径");

            // 调用通用文字识别, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获

            var result = client.GeneralBasic(image);

            Console.WriteLine(result);

        }

        static void Main(string[] args)

        {

            GeneralBasicDemo();

            Console.Read();

        }

    }

}

注意,具体开发的时候要把上面的API Key和Secret Key分别改成你本身的,至于怎么申请和查看这两个Key,能够参考我写的评测篇帖子。帖子连接以下:

http://ai.baidu.com/forum/topic/show/955989

另外不要忘了把图片文件路径改成你本身的图片路径。下面是识别的结果示例:

原图以下:

(二)解析Json格式,把识别结果转变为更为直观的文本类型

代码以下:

using System;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using System.IO;

using System.Drawing;

using System.Collections.Generic;

using System.Linq;

 

namespace myOCRDemo

{

    class Program

    {

        public static void GeneralBasicDemo()

        {

            // 设置APPID/AK/SK

            var API_KEY = "你的Akey";

            var SECRET_KEY = "你的SKey";

            //建立对象

            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);

            client.Timeout = 60000;  // 修改超时时间

            var image = File.ReadAllBytes(@"你的图片路径");

            // 调用通用文字识别, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获

            var result = client.GeneralBasic(image);

            //解析Json的代码

            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());

            int num = (int)jo["words_result_num"];

            string[] words = new string[num];

            for (int i = 0; i < num; i++)

                words[i] = jo["words_result"][i]["words"].ToString();

            //返回值

            string txtOCR = null;

            for (int i = 0; i < num; i++)

                txtOCR += words[i] + "\n";

            //显示结果

            Console.WriteLine(txtOCR);

        }

        static void Main(string[] args)

        {

            GeneralBasicDemo();

            Console.Read();

        }

    }

}

程序运行结果以下:

这样就比较符合人类的阅读习惯了,上面这段代码也是核心的基础代码,能够经过这些核心的代码去作一些优化,好比自动换行、自动缩进、根据语言习惯自动改变标点符号等等。

(三)表格识别

百度的表格文字识别的编程较为麻烦,主要分红两步:第一步是提交表格文字识别请求,得到requestId;第二步是根据requestId获取表格文字识别的结果,默认是Excel文件格式,Json结果会返回一段下载地址。

个人程序除了上面这两步之外,还添加了自动下载Excel文件到本地电脑的代码,供各位参考。另外要注意的是,提交识别请求和得到识别结果这两步之间,程序必须设置延时,不然不能得到下载的URL 。通过实际测试,延时为3秒以上较为合适,3秒如下可能会出错。

代码以下:

/// 

 

        /// 表格文字识别

        /// 

 

        public static void myTableRecognitionRequestDemo()

        {

            // 设置APPID/AK/SK

            var API_KEY = "你的API Key";

            var SECRET_KEY = "你的Secret Key";

            //建立对象

            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);

            client.Timeout = 60000;  // 修改超时时间

            var image = File.ReadAllBytes(@"F:\表格图片1.jpg");//这里要改为你的表格图片路径

            // 调用表格文字识别,可能会抛出网络等异常,请使用try/catch捕获

            var result = client.TableRecognitionRequest(image);

            //解析Json

            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());

            string requestId = jo["result"][0]["request_id"].ToString();

            Console.WriteLine("得到requestId:"+requestId);

            //延时3秒,这句是必须的

            System.Threading.Thread.Sleep(3000);

            //获取表格识别结果

            //有时会得不到连接,须要多尝试几回

            var resultExcel = client.TableRecognitionGetResult(requestId);

            Console.WriteLine("得到的表格识别结果以下:");

            Console.WriteLine(resultExcel);

            //解析Json,得到连接

            JObject joResult = (JObject)JsonConvert.DeserializeObject(resultExcel.ToString());

            string excelURL = joResult["result"]["result_data"].ToString();

            Console.WriteLine("得到的Excel文件下载地址是:\n" + excelURL);

            //自动下载Excel文件到电脑

            WebClient df = new WebClient();

            df.DownloadFile(excelURL, @"F:\识别结果.xls");//这里要改为你的下载文件路径

            Console.WriteLine("下载完毕");

        }

做者使用的测试用图片:

表格文字识别结果截图:

尾记:本文的示例代码都是最新的代码,跟百度SDK文档里面的代码是一致的,而云猫OCR是2017年底就已经写好的了,代码有些陈旧,因此没直接贴源代码了。

代码篇的原帖子地址:

http://ai.baidu.com/forum/topic/show/956037

第三部分  云猫OCR的使用说明及效果评测

1、概述

   笔者是在2017年接触百度云服务平台的,在这里我也称之为百度AI 。笔者根据百度AI提供的函数接口,自行编程实现了一款OCR软件——云猫OCR。云猫OCR大部分的代码开发是在2017年末前完成的,之因此雪藏到如今,是由于笔者的一些私人事务(小孩出生等)——我是利用业余时间进行软件开发的,因此中断了大概一年多的时间,如今才有空继续这个项目。

评测篇的原帖子地址:

http://ai.baidu.com/forum/topic/show/955989

2、评测的具体内容

(一)准备工做

   在使用云猫OCR以前,咱们必须先去百度云官网进行注册帐号,有了帐号之后,咱们还要去具体的云服务项目下申请API Key和Secret Key ,通常这两个Key是用户各人保管的,不能随便透露给外人。由于百度云如今已经正式收费,而用户每人天天的免费调用次数都是有限的,提升限额须要支付费用,用户使用百度云AI接口的依据主要就是这两个Key,因此咱们要保管好。下面是简单的准备工做图片说明:

(二)正式使用云猫OCR

用户有了百度云API Key和Secret Key以后,就能够正式使用云猫OCR了。具体使用步骤以下:

(三)评测的具体内容

   首先介绍一下云猫OCR调用的百度AI的主要接口,首先是通用文字识别(带位置版),其次是通用文字识别(带位置高精度版),最后是表格文字识别,下面依次介绍这三种识别。

1. 通用文字识别(带位置版)和通用文字识别(带位置高精度版)的混合使用

如上图所示,用户能够选择多种语言(包括德语、法语、西班牙语等等),选择好后点击文字识别便可。由于百度云提供的高精度文字识别接口只支持中英文,而通用的文字识别支持除中英文之外的多种语言,因此笔者在编写软件中,这两种接口是混合使用的,具体怎么混合使用请看代码篇。通常状况下,高精度的文字识别效果比通用的好,但也比较耗时。

本软件支持识别的文字结果在本机保存为文件,具体以下图操做:

保存的文件是rtf格式,能够用WPS或者Office Word打开。下面再给出一次性识别20张图片的统计结果图示:

从上图能够看出,百度云的文字识别结果速度仍是不错的,识别速度是平均大概2-3秒一张图。

2. 表格文字识别

表格文字识别的主要步骤以下图所示:

识别的结果软件会自动保存为Excel文件并打开,如图:

从上图能够看出,表格文字识别的速度比普通文字识别要慢一些,大概须要5-6秒。

评测总结:百度OCR对于印刷体的识别仍是不错的,比起之前的OCR软件来讲,百度OCR能够说是革命性的进步。固然,它也有本身的短板。好比手写体的识别,笔者尚未评测,但百度云通用文字高精度接口对手写体的识别是较差的。再好比QPS并发,个人理解是能够提升OCR文字识别的速度,对于大量的图片文字识别来讲尤为是重要,能够节省大量时间。但遗憾的是,百度云对并发好像作的不太好,程序不必定支持QPS并发,这个缺点咱们也是但愿百度后面可以有所改正。

 

附录:

C#编程实现手写识别

1、概述

    本人是用C#编程,调用百度API接口实现手写体识别的,参考了百度的产品文档。

文档地址:https://cloud.baidu.com/doc/OCR/index.html

2、代码及解说

本人的源代码大部分是来自百度的产品文档,但其中也遇到了一些麻烦。好比文字识别的编码问题,百度的代码给出的编码是Default,但在个人机器上这样作会显示乱码。通过查找资料,我把编码改为UTF8,乱码的问题才获得解决。

做者的全部源代码以下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Net.Http;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using System.IO;

using System.Drawing;

using System.Web;

using System.Net;

 

namespace myHandwrite

{

    public static class FileUtils

    {

        /// 

 

        /// 转base64编码

        /// 

 

        /// 

        /// 

        public static String getFileBase64(String fileName)

        {

            FileStream filestream = new FileStream(fileName, FileMode.Open);

            byte[] arr = new byte[filestream.Length];

            filestream.Read(arr, 0, (int)filestream.Length);

            string baser64 = Convert.ToBase64String(arr);

            filestream.Close();

            return baser64;

        }

    }

    class Program

    {

        // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存

        // 返回token示例

        public static String TOKEN = "24.adda70c11b9786206253ddb70affdc46.2592000.1493524354.282335-1234567";

 

        // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务

        private static String clientId = "这里改为你的API Key";

        // 百度云中开通对应服务应用的 Secret Key

        private static String clientSecret = "这里改为你的Secret Key";

        /// 

 

        /// 获取token的函数

        /// 

 

        /// 

        public static String getAccessToken()

        {

            String authHost = "https://aip.baidubce.com/oauth/2.0/token";

            HttpClient client = new HttpClient();

            List> paraList = new List>();

            paraList.Add(new KeyValuePair("grant_type", "client_credentials"));

            paraList.Add(new KeyValuePair("client_id", clientId));

            paraList.Add(new KeyValuePair("client_secret", clientSecret));

 

            HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;

            String result = response.Content.ReadAsStringAsync().Result;

            //Console.WriteLine(result);

            //本身加的代码

            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());

            string myToken = jo["access_token"].ToString();

            Console.WriteLine("得到的Token是:" + myToken);

            return myToken;

        }

        

        /// 

 

        /// 手写体文字识别

        /// 

 

        /// 

        /// 

        /// 

        public static string myHandwriting(string token,string filename)

        {

            //string token = "#####调用鉴权接口获取的token#####";

            // 图片的base64编码

            string strbaser64 = FileUtils.getFileBase64(filename); 

            string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting?access_token=" + token;

            Encoding encoding = Encoding.Default;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);

            request.Method = "post";

            request.ContentType = "application/x-www-form-urlencoded";

            request.KeepAlive = true;

            //这里加上了一些参数

            String str = "recognize_granularity=big&image=" + HttpUtility.UrlEncode(strbaser64);

            byte[] buffer = encoding.GetBytes(str);

            request.ContentLength = buffer.Length;

            request.GetRequestStream().Write(buffer, 0, buffer.Length);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            //显示结果是乱码,尝试改变编码,通过测试须要改为UTF8编码

            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

            string result = reader.ReadToEnd();

            Console.WriteLine("手写文字识别:");

            //Console.WriteLine(result);

            //解析Json的代码

            JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());

            int num = (int)jo["words_result_num"];

            string[] words = new string[num];

            for (int i = 0; i < num; i++)

                words[i] = jo["words_result"][i]["words"].ToString();

            //返回值

            string txtOCR = null;

            for (int i = 0; i < num; i++)

                txtOCR += words[i] + "\n";

            //显示结果

            Console.WriteLine(txtOCR);

            return txtOCR;

        }

        static void Main(string[] args)

        {

            //这里要改为你的图片路径

            string filename = @"F:\手写体5.jpg";

            string token = getAccessToken();

            myHandwriting(token,filename);

            Console.Read();

        }

    }

}

注意,上面的代码中须要各位改为本身的Akey和Skey,另外要改一下图片路径。若是返回的是乱码,还须要改一下编码。

识别的结果以下:

程序用的图片文件以下:

做者kohakuarc

相关文章
相关标签/搜索