代码实现识别部分截图在整张图片中的位置_基于神经网络的OCR识别
基于神经网络的OCR识别
Optical Character Recognition(OCR) 光学识别,通俗的讲就是识别图片内的文字,比如身份证上的身份证号,姓名,地址等,银行卡上的卡号 等等.
Evil
Github repo
Evil是一个iOS和macOS平台下简单的识别框架。支持通过 CocoaPods、Carthage 和 Swift Package Manager 安装。底层的识别模型可以很容易的迁移到其他平台。
OCR识别的基本流程
- 从整张图片截取需要识别的区域 eg: 从一整张图片中截取身份证所在的矩形区域
- 截取文字区域 eg: 通过一定的算法截取到身份证号码所在的区域
- 对文字区域进行一系列的预处理方便下一步操作 eg: 高斯模糊、膨胀等等
- 分割文字,讲文字区域分割为单个的字
- 将单个字丢进神经网络识别
Evil使用最新的Vision框架来实现。前4步 Apple 为我们提供了很好用系统方法来使用 例如: VNDetectTextRectanglesRequest。所以这里我们不讨论前4步的一些实现细节,如果大家想学习一下api的使用,可以看这里。
如何使用神经网络识别单个字
我个人认为对于少量的印刷体文字的识别可以用图片分类模型来处理,如果大家有更好的解决方法欢迎交流。假如你是一名CNN调参侠那接下来的内容就很好理解了, 但是如果你没有神经网络相关的基础知识,接下来的内容可能有点晦涩,因为毕竟我也是只懂个皮毛~。假如你之前没有相关知识,可以了解一下Apple为我们提供的Turi Create,可以免去自己设计网络。
0x00 设计网络
首先我们需要设计一个CNN网络来输入我们的单个字图片让它识别,因为我们的识别任务很简单,所以网络架构会很简单。 以下是 Keras (2.0.6) 代码:
model = Sequential()model.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.5))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.2))model.add(Conv2D(128, (1, 1), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.2))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dense(num_classes, activation='softmax'))复制代码
0x01 生成训练数据
我们知道要对网络进行训练,必须需要大量的原始数据那我们没有怎么办呢?有些训练资源在网络上可以找到,但是像我们这里要识别身份证号码,怎么办呢?
当然是写脚本生成啦,比如我们先生成很多很多的身份证号码区域。进行一些随机变化增加数据的多样性。
o_image = Image.open(BACKGROUND) draw_brush = ImageDraw.Draw(o_image) font_size = random.randint(-5, 5) + 35 draw_brush.text((10 + random.randint(-10, 10), 15 + random.randint(-2, 2)), LABELS, fill='black', font=ImageFont.truetype(FONT, font_size)) o_image = ImageEnhance.Color(o_image).enhance( random.uniform(0.5, 1.5)) # 着色 o_image = ImageEnhance.Brightness(o_image).enhance( random.uniform(0.5, 1.5)) # 亮度 o_image = ImageEnhance.Contrast(o_image).enhance( random.uniform(0.5, 1.5)) # 对比度 o_image = ImageEnhance.Sharpness(o_image).enhance( random.uniform(0.5, 1.5)) # 旋转 o_image = o_image.rotate(random.randint(-2, 2)) o_image.save(output + '/%d.png' % idx)复制代码
有了文字区域以后就需要对文字区域进行分割为单字然后训练网络,因为接下来的任务具有通用性,所以我索性写了一个小工具叫做PrepareBot。具体代码在这里,大家感兴趣可以去看看。
0x02 训练网络
有了数据,有了网络模型 训练网络就很简单了大概如下:
model.fit_generator(generator=train_data_generator)复制代码
好了到这里,大家观察一下网络的收敛情况和识别精度,如果不是很糟糕的话,就可以把这个model保存起来了,为以后的识别任务做准备啦。注意这一步生成的Keras model 是跨平台,也就是说在windows,linux 甚至是android 上都可以用来识别哦。
0x03 转换网络
前面几步我们生成的是Keras 的网络模型,如何在Evil中使用这些模型呢?首先我们需要使用苹果提供的工具coremltools,将keras模型转换为CoreModel具体使用大概如下
# Prepare model for inferencefor k in model.layers: if type(k) is keras.layers.Dropout: model.layers.remove(k) model.save("./temp.model")core_ml_model = coremltools.converters.keras.convert("./temp.model
代码实现识别部分截图在整张图片中的位置_基于神经网络的OCR识别相关推荐
- android opencv 识别文字_基于SpringBoot的车牌识别系统(附项目地址)
gitee开源地址 https://gitee.com/admin_yu/yx-image-recognition 介绍 spring boot + maven 实现的车牌识别及训练系统 基于java ...
- gitee项目能用SVN拉取吗_基于SpringBoot的车牌识别系统(附项目地址)
gitee开源地址 https://gitee.com/admin_yu/yx-image-recognition 介绍 spring boot + maven 实现的车牌识别及训练系统 基于java ...
- 基于神经网络的实体识别和关系抽取联合学习 | PaperWeekly #54
作者丨罗凌 学校丨大连理工大学博士生 研究方向丨深度学习,文本分类,实体识别 联合学习(Joint learning)一词并不是一个最近才出现的术语,在自然语言处理领域,很早就有研究者使用基于传统机器 ...
- 论文浅尝 | 基于神经网络的实体识别和关系抽取联合学习
本文转载自公众号:PaperWeekly. 作者丨罗凌 学校丨大连理工大学博士生 研究方向丨深度学习,文本分类,实体识别 联合学习(Joint learning)一词并不是一个最近才出现的术语,在自然 ...
- 基于pytorch的OCR识别库
基于pytorch的OCR识别库 对一年来学习的算法做了一个整理,同时也方便使用(项目持续更新中) 识别库的地址: github地址 这里支持的算法包括: DBnet 论文链接 PSEnet 论文链接 ...
- 基于神经网络的车牌识别,卷积神经网络车牌识别
现在很多工程项目都用车牌识别系统,我想问一下车牌识别系统的原理是什么? 核心算法:从六个步骤来提取我们抓拍的车牌信息,第一:图像捕捉采集.第二:车牌定位.第三:预处理.第四:字符分割.第五:字符识别. ...
- python 图片识别服装_基于树莓派的服装识别系统及方法与流程
本发明涉及一种基于树莓派的服装识别系统及方法. 背景技术: 随着人们生活水平的不断提高,人们对于服装的需求不再是传统意义上的生活必需品,服装已经成为人们生活中的一种时尚消费品,所以很大一部分的消费者家 ...
- 基于神经网络的花卉识别系统,可以识别10种花的类型:向日葵、月季、玫瑰、仙人掌、牡丹等
基于神经网络的花卉识别系统,可以识别10种花的类型:向日葵.月季.玫瑰.仙人掌.牡丹等,精度可达95. 系统可手动自主选择图片导入识别,识别结果可通过标签形式标注在图片上生成到本地,便于归档和实时验证 ...
- python名片识别_基于Python的名片识别接口调用代码实例
基于Python的名片识别接口调用代码实例 代码描述:基于Python的名片识别接口调用代码实例 #!/usr/bin/python # -*- coding: utf-8 -*- import js ...
最新文章
- 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2
- 大疆没有边界:刚拳打GoPro,又脚踢优必选
- 阿里云ECS Cloudbuild开发者大赛等你挑战!
- 腾讯技术直播间 | 当感性遇上理性,当魔术遇上数学
- java代码,输入n多个数,求其平均值,虽有重复,但是第二次,我就乱写了
- jzoj3854-分组【树状数组,线段树】
- 前端学习(3316):connect
- nlp中的经典模型(三)
- 谁天生就是干程序员的料?
- 如何使用消息队列,Spring Boot和Kubernetes扩展微服务
- nagios IO监控 Error executing iostat command
- indesign软件教程,如何将文本格式保存为样式?
- 两个集合的交集 java版本
- 最详细的 paypal 支付接口开发--Java版
- HTML 数据可视化模板 echarts实现
- 请你说一说红黑树的性质还有左右旋转
- 矩阵微分常用公式整理
- iPad连蓝牙鼠标鼠标滚动与屏幕相反的解决方法
- ORB——OPC服务器冗余的最佳选择
- 【懒懒的Python学习笔记八】