深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

文章目录

一、前期工作

  1. 导入库
  2. 图片生成函数
  3. 导入数据
  4. 生成数据集函数

二、CNN模型建立
三、训练模型函数
四、训练模型与结果
五、验证

大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(CNN)进行中文OCR识别,实现自己的一个OCR识别工具。
一个OCR识别系统,其目的很简单,只是要把影像作一个转换,使影像内的图形继续保存、有表格则表格内资料及影像内的文字,一律变成计算机文字,使能达到影像资料的储存量减少、识别出的文字可再使用及分析,这样可节省人力打字的时间。
中文OCR识别的注意流程图:
在这里插入图片描述

一、前期工作

1.导入库

import numpy as np 
from PIL import Image, ImageDraw, ImageFont
import cv2
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import plot_model
import matplotlib.pyplot as plt#导入字体
DroidSansFallbackFull = ImageFont.truetype("DroidSansFallback.ttf", 36, 0)
fonts = [DroidSansFallbackFull,]

2.数据集生成函数

#生成图片,48*48大小
def affineTrans(image, mode, size=(48, 48)):# print("AffineTrans ...")if mode == 0:  # padding移动which = np.array([0, 0, 0, 0])which[np.random.randint(0, 4)] = np.random.randint(0, 10)which[np.random.randint(0, 4)] = np.random.randint(0, 10)image = cv2.copyMakeBorder(image, which[0], which[0], which[0], which[0], cv2.BORDER_CONSTANT, value=0)image = cv2.resize(image, size)if mode == 1:scale = np.random.randint(48, int(48 * 1.4))center = [scale / 2, scale / 2]image = cv2.resize(image, (scale, scale))image = image[int(center[0] - 24):int(center[0] + 24), int(center[1] - 24):int(center[1] + 24)]return image#图片处理 除噪
def noise(image, mode=1):# print("Noise ...")noise_image = (image.astype(float) / 255) + (np.random.random((48, 48)) * (np.random.random() * 0.3))norm = (noise_image - noise_image.min()) / (noise_image.max() - noise_image.min())if mode == 1:norm = (norm * 255).astype(np.uint8)return norm#绘制中文的图片
def DrawChinese(txt, font):# print("DrawChinese...")image = np.zeros(shape=(48, 48), dtype=np.uint8)x = Image.fromarray(image)draw = ImageDraw.Draw(x)draw.text((8, 2), txt, (255), font=font)result = np.array(x)return result#图片标准化
def norm(image):# print("norm...")return image.astype(np.float) / 255

3.导入数据

char_set = open("chinese.txt",encoding = "utf-8").readlines()[0]
print(len(char_set[0]))  # 打印字的个数

4.生成数据集函数

# 生成数据:训练集和标签
def Genernate(batchSize, charset):# print("Genernate...")#    passlabel = [];training_data = [];for x in range(batchSize):char_id = np.random.randint(0, len(charset))font_id = np.random.randint(0, len(fonts))y = np.zeros(dtype=np.float, shape=(len(charset)))image = DrawChinese(charset[char_id], fonts[font_id])image = affineTrans(image, np.random.randint(0, 2))# image = noise(image)# image = augmentation(image,np.random.randint(0,8))image = noise(image)image_norm = norm(image)image_norm = np.expand_dims(image_norm, 2)training_data.append(image_norm)y[char_id] = 1label.append(y)return np.array(training_data), np.array(label)def Genernator(charset,batchSize):print("Generator.....")while(1):label = [];training_data = [];for i in range(batchSize):char_id = np.random.randint(0, len(charset))font_id = np.random.randint(0,len(fonts))y = np.zeros(dtype=np.float,shape=(len(charset)))image = DrawChinese(charset[char_id],fonts[font_id])image = affineTrans(image,np.random.randint(0,2))#image = noise(image)#image = augmentation(image,np.random.randint(0,8))image = noise(image)image_norm = norm(image)image_norm  = np.expand_dims(image_norm,2)y[char_id] = 1training_data.append(image_norm)label.append(y)y[char_id] = 1yield (np.array(training_data),np.array(label))

二、CNN模型建立

def Getmodel(nb_classes):img_rows, img_cols = 48, 48nb_filters = 32nb_pool = 2nb_conv = 4model = Sequential()print("sequential..")model.add(Convolution2D(nb_filters, nb_conv, nb_conv,padding='same',input_shape=(img_rows, img_cols, 1)))print("add convolution2D...")model.add(Activation('relu'))print("activation ...")model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Convolution2D(nb_filters, nb_conv, nb_conv,padding='same'))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(1024))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])return model#评估模型
def eval(model, X, Y):print("Eval ...")res = model.predict(X)

三、训练模型函数

#训练函数
def Training(charset):model = Getmodel(len(charset))while (1):X, Y = Genernate(64, charset)model.train_on_batch(X, Y)print(model.loss)#训练生成模型
def TrainingGenerator(charset, test=1):set = Genernate(64, char_set)model = Getmodel(len(charset))BatchSize = 64model.fit_generator(generator=Genernator(charset, BatchSize), steps_per_epoch=BatchSize * 10, epochs=15,validation_data=set)model.save("ocr.h5")X = set[0]Y = set[1]if test == 1:print("============6 Test == 1 ")for i, one in enumerate(X):x = oneres = model.predict(np.array([x]))classes_x = np.argmax(res, axis=1)[0]print(classes_x)print(u"Predict result:", char_set[classes_x], u"Real result:", char_set[Y[i].argmax()])image = (x.squeeze() * 255).astype(np.uint8)cv2.imwrite("{0:05d}.png".format(i), image)

四、训练模型与结果

TrainingGenerator(char_set)  #函数TrainingGenerator 开始训练
Epoch 1/15
640/640 [==============================] - 63s 76ms/step - loss: 8.1078 - accuracy: 3.4180e-04 - val_loss: 8.0596 - val_accuracy: 0.0000e+00
Epoch 2/15
640/640 [==============================] - 102s 159ms/step - loss: 7.5234 - accuracy: 0.0062 - val_loss: 6.2163 - val_accuracy: 0.0781
Epoch 3/15
640/640 [==============================] - 38s 60ms/step - loss: 5.9793 - accuracy: 0.0425 - val_loss: 4.1687 - val_accuracy: 0.3281
Epoch 4/15
640/640 [==============================] - 45s 71ms/step - loss: 5.0450 - accuracy: 0.0889 - val_loss: 3.1590 - val_accuracy: 0.4844
Epoch 5/15
640/640 [==============================] - 37s 58ms/step - loss: 4.5251 - accuracy: 0.1292 - val_loss: 2.5326 - val_accuracy: 0.5938
Epoch 6/15
640/640 [==============================] - 38s 60ms/step - loss: 4.1708 - accuracy: 0.1687 - val_loss: 1.9666 - val_accuracy: 0.7031
Epoch 7/15
640/640 [==============================] - 35s 54ms/step - loss: 3.9068 - accuracy: 0.1951 - val_loss: 1.8039 - val_accuracy: 0.7812
...910
Predict result: 妻 Real result: 妻
1835
Predict result: 莱 Real result: 莱
3107
Predict result: 阀 Real result: 阀
882
Predict result: 培 Real result: 培
1241
Predict result: 鼓 Real result: 鼓
735
Predict result: 豆 Real result: 豆
1844
Predict result: 巾 Real result: 巾
1714
Predict result: 跌 Real result: 跌
2580
Predict result: 骄 Real result: 骄
1788
Predict result: 氧 Real result: 氧

生成字体图片:
在这里插入图片描述

五、验证

model = tf.keras.models.load_model("ocr.h5")
img1 = cv2.imread('00001.png',0)
img = cv2.resize(img1,(48,48))print(img.shape)
img2 = tf.expand_dims(img, 0)
res = model.predict(img2)
classes_x = np.argmax(res, axis=1)[0]
print(classes_x)
print(u"Predict result:", char_set[classes_x]) 

中文字:
在这里插入图片描述
预测结果为”莱;
数据集的获取私信我!后期有更深入的OCR识别功能呈现,敬请期待!

往期作品:

深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-ChatGPT的本地实现部署测试,自己的平台就可以实现ChatGPT

…(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7个成功的DTC品牌出海营销策略,提高海外客户的忠诚度!

关键词:DTC品牌出海、DTC营销、客户忠诚度 近年来,普通消费者关心的事情发生了巨大变化。 60% 的消费者会特意从品牌而不是第三方零售商处购买。 从大型零售商处购买再成为主流。人们希望与他们关心并感到关心的品牌建立关系。他们希望支持独立企业并找到…

Cat.1热度居高不下,利尔达 NT26E系列模组带来更多新选择

2021年全球Cat.1处于爆发期,出货量达到1.2亿,仅在中国市场上,Cat.1出货量就达到了1.1亿。据近日市场研究公司Counterpoint最新的发布全球蜂窝物联网芯片跟踪报告,2021年第四季度,4G Cat.1出货量同比增长154%。今年的市…

Cat.1模组再添新选择,利尔达推出NT26U提供多元应用思路

Cat.1因模组成熟度高且可复用现有的LTE资源而广受欢迎,它不但成本低,还能在短时间内形成规模效应。随着2G/3G的加速退网,Cat.1作为中低速率应用场景中最适合保障通信能力的网络之一更是水涨船高。 基于展锐的Cat.1模组 作为LTE网络的“低配版…

短信接收流程

Android 短信接收流程 Android S 短信接收流程 Android 12 短信接收流程 指路 -> 短信发送流程 流程图

开题报告PPT怎么制作

毕业设计答辩的首要环节就是前期答辩,也叫作开题汇报答辩,主要内容是对后期设计制作的规划及时间安排,同时还有设计要达到什么目的效果,预测在制作工程中可能遇到的问题并且提出这些问题的解决方案,开题报告汇报时以PP…

springboot+微信小程序的点餐系统(开题报告+论文+答辩PPT+源码)

技术架构 SprongBootMysql微信小程序 简介 本点餐小程序是使用Java/JavaScript编程语言开发的,存储数据方面则用到了MySQL数据库。顾客可以使用小程序扫码功能扫描餐厅桌角的二维码就座,也可以点击排号等位由后台工作人员安排就座;通过首页…

毕业论文学术报告答辩开题报告PPT模板

模板介绍 毕业论文学术报告答辩开题报告PPT模板。一套论文答辩幻灯片模板,内含黑色,红色多种配色,风格设计,动态播放效果,精美实用。 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使用PPT或…

python图片分享平台毕业设计开题报告

本文给出的python毕业设计开题报告,仅供参考!(具体模板和要求按照自己学校给的要求修改) 选题目的和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的图片分享平台,整个网站项目使用了B/S架构…

高校通用论文开题报告PPT模板

模板介绍 高校通用论文开题报告PPT模板。一套开题报告幻灯片模板,内含青色,红色多种配色,风格设计,动态播放效果,精美实用。 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使用PPT或PPTX等格…

计算机开题报告万能模板,计算机开题报告ppt模板

PPT内容 这是计算机开题报告ppt模板,包括了课题研究的意义和目的,论文提纲,研究的预期目标及主要特点及创新点,研究方法和途径等内容。 基于NS的无线网络的AODV路由协议仿真测试与性能分析 毕业论文开题报告 指导老师:…

chatglm+tesla m40低成本部署

chatglmtesla m40部署 tesla m40安装BIOS设置驱动下载并安装验证安装并切换WDDM模式 chatglm安装环境安装加载模型CUDA安装Torch安装源码修改 成功结果展示常见问题 本机配置 i5 13600k ,主板是微星760 bomer tesla m40安装 Tesla M40 24G实际上是计算卡,不是显卡&…

Win11 的这 19 个新功能,你都用上了吗?

Windows 11 是 Windows 的新版本,现在正在向受支持的 PC 推出多项新功能和改进。 Windows 11 于 10 月 5 日开始推出,微软也发布了 Windows 11 ISO 镜像。与之前的 Windows 10 更新不同,这个新的操作系统专注于面向消费者的功能和改进&#x…

使用WinINet和WinHTTP实现Http访问

Http访问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用向服务器提交数据,在这个例程中我使用POST方式,提交数据value1与value2,并从服务器得到他们的和(value1 value2)…

day02 创建第一个Windows窗口及Windows的消息处理

文章目录 第一个Windows窗口程序1. 入口函数2. 创建窗口类3. 注册窗口4. 创建窗口实例5. 处理消息事件6. 回调函数完整测试 Windows消息处理 第一个Windows窗口程序 1. 入口函数 Windows编程的入口函数: 建议直接F1查询官方文档,Ctrl CV int WINAPI W…

chatgpt赋能python:Python导入自己的文件:完全指南

Python导入自己的文件:完全指南 Python是一种高级编程语言,许多工程师在开发过程中使用它。当我们在编写Python应用程序时,可能需要将代码拆分为多个模块,以使其更易于维护和扩展。在这种情况下,我们需要导入自己的Py…

chatgpt赋能python:Python中的库导入方法详解

Python中的库导入方法详解 Python拥有丰富的库,这也是它广受欢迎的原因之一。而在使用Python编程时,如何正确地导入库是至关重要的。本文将介绍Python中常用的库导入方法,并帮助读者理解每种方法的优缺点。 直接导入库 最基本的导入库方法…

Postman下载安装教程

看到很多小伙伴在问 Postman 下载的相关问题,花时间整理了下,下面教新入门的小伙伴如何去下载 Postman。 开始前我们可以先了解下:Postman 简介 下载 第一步:进入 Postman 官网 首先,我们需要进入 Postman 的官网。…

001 用python和tushare获取股票数据

数据获取可以用爬虫,api。api我了解的有tushare和pandas_datareader,用conda或者pip命令安装即可。此处只介绍tushare。 一、 注册 到tushare官网注册,并获取自己的token(调用api需要token才可以访问数据)。官网链接…

现在学Python还有前途吗?能做什么?

现在学Python还有前途吗?能做什么?无论是从行业人才需求,国家政策支持,还是从Python本身广泛应用的优势来看,学Python都是极其有个人发展前途的。至于可以从事的工作岗位就更多了,像Linux运维、Python Web网…

ChatGPT:2. 使用OpenAI创建自己的AI网站:1. 初探API

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白,有OpenAI的账号,但想调用OpenAI的API搞一些有意思的事,那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。博主只能利用下班时间更新,进度慢…