好久没有写博客了,趁最近比较闲来发一篇。
有个项目:

  • 从计算机屏幕上截图
  • 识别截图上的文字

早先识别的方法是:

  • 对比度
  • 颜色
  • 边缘检测

问题是:有些图片会被识别为文字。

前几天闲着就试了一下用卷积神经网络(CNN)来实现这个功能。

生成训练集、测试集和验证集。

首先,拿到一幅带有文字的计算机画面,用工具找到文字区域的起始和终止坐标,再用工具找到图片区域的起始和终止坐标。用下面的代码生成训练集、测试集和验证集(validation dataset,总觉得说验证集怪怪的)。

from random import randint
import numpy as np
from PIL import Image
#这个是我自己写的一个库[PyImageProcess](https://github.com/Kenneth111/PyImageProcess)
from PyImageProcess.utils_yuv import get_a_frame, save_a_patchdef save_patches(com_y, start, end, path, num):l1 = len(start)l2 = len(end)if l1 != l2:raise UserWarning("the len of start is not same to that of end!")exit(-1)mb_size = 16for i in range(num):# 随机选一幅图idx = randint(0, l1 - 1)# 随机选一个区域来生成图片(startx, starty) = start[idx](endx, endy) = end[idx]x = randint(startx, endx - 16)y = randint(starty, endy - 16)filename = path + ("%d.bmp" % i)img = Image.fromarray(np.uint8(com_y[y: y + mb_size, x: x + mb_size]))img.save(filename)def save_text(y, start, end, training = 0):if training == 0:save_patches(y, start, end, "train\\text\\", 1000)elif training == 1:save_patches(y, start, end, "val\\text\\", 100)else:save_patches(y, start, end, "test\\text\\", 200)def save_img(y, start, end, training = 0):if training == 0:save_patches(y, start, end, "train\\img\\", 1000)elif training == 1:save_patches(y, start, end, "val\\img\\", 100)else:save_patches(y, start, end, "test\\img\\", 200)    def main():mb_size = 16height = 1080width = 1920# 我读取的是一个YUV444P的图像filename_yuv = "screen_cursor1.yuv"a_frame = get_a_frame( "F:\\" + filename_yuv, height, width, 1)# 只用Y分量来识别文字com_y = a_frame[:, 0].reshape(height, width)start_i0 = [(1175, 357), (382, 552), (950, 0), (1440, 0)]end_i0 = [(1650, 1027), (1650, 1027), (1333, 462), (1804, 928)]    save_img(com_y, start_i0, end_i0, 0)save_img(com_y, start_i0, end_i0, 1)save_img(com_y, start_i0, end_i0, 2)start_t0 = [(207, 498), (1, 43), (111, 42), (221, 42), (769, 46), (857, 42), (592, 316), (670, 316), (869, 315),(1352, 225), (1339, 317), (1809, 225), (1817, 316), (1809, 498), (27, 681), (118, 953)]end_t0 = [(266, 533), (79, 77), (173, 59), (253, 59), (845, 78), (948, 59), (641, 352), (749, 351), (930, 354),(1401, 261), (1415, 350), (1893, 259), (1887, 351), (1895, 534), (65, 715), (164, 988)]    save_text(com_y, start_t0, end_t0, 0)save_text(com_y, start_t0, end_t0, 1)save_text(com_y, start_t0, end_t0, 2)if __name__ == "__main__":main()

构建模型开始训练

卷积神经网络(CNN)训练和测试代码如下。代码参考了Keras的官方示例

import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.callbacks import EarlyStopping, ModelCheckpoint
from PIL import Image
import numpy as npdef CNN():input_shape = (16, 16, 1)num_classes = 2model = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))    return modeldef train():train_datagen = ImageDataGenerator(rescale= 1./255)train_generator = train_datagen.flow_from_directory('train', target_size=(16, 16), color_mode="grayscale", batch_size=64, class_mode='binary')val_datagen = ImageDataGenerator(rescale= 1./255)val_generator = val_datagen.flow_from_directory('val', target_size=(16, 16), color_mode="grayscale", batch_size=64, class_mode='binary')checkpointer = ModelCheckpoint(filepath='CNN_weights.hdf5', verbose=1, save_best_only=True)earlystopping = EarlyStopping(patience=5)model = CNN()model.compile(loss=keras.losses.binary_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])model.fit_generator(train_generator, steps_per_epoch = 200, epochs = 50, validation_data=val_generator,validation_steps=100, callbacks=[checkpointer, earlystopping])def test():test_datagen = ImageDataGenerator(rescale= 1./255)test_generator = test_datagen.flow_from_directory('test', target_size=(16, 16), color_mode="grayscale", batch_size=64, class_mode='binary')model = CNN()model.compile(loss=keras.losses.binary_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])    # 因为在训练时check point只存储了网络权重,所以这里要重新构建模型,compile。然后在读入权重。model.load_weights('CNN_weights.hdf5')# 把模型带优化信息、权重都存起来,以后就不用再像上面那样构建一遍了。# 用的时候可以这样用model = keras.models.load_model('CNN_model.h5')model.save('CNN_model.h5')# 使用generator来进行测试test_loss = model.evaluate_generator(test_generator)print(test_loss)# 再测试两幅图像txt_img = Image.open('train/text/0.bmp')txt_img = np.array(txt_img).reshape(1, 16, 16, 1) * 1. /255pred1 = model.predict(txt_img, batch_size=1)img_img = Image.open('train/img/0.bmp')img_img = np.array(img_img).reshape(1, 16, 16, 1) * 1. / 255pred2 = model.predict(img_img, batch_size=1)# 接近1代表文字,接近0代表图像print(pred1, pred2)def main():# 训练的时候打开这里# train()# 测试的时候打开这里test()if __name__ == "__main__":main()

模型效果

能识别出几乎所有对比度高的文字和大多数对比度高的图标(这也是我们想要的)。但是难以识别对比度较低的文字(比如:excel红底黑字就无法识别为文字),这和训练样本有关系。另外注意到在excel下,模型将大多数横线和竖线识别为文字,在网页内将一些白底黑图的图片识别为文字。

用卷积神经网络(CNN)识别文字相关推荐

  1. 基于卷积神经网络 CNN 的猫狗识别详细过程

    目录 一.卷积神经网络(CNN) 1.1 卷积 1.2 前馈神经网络 1.3 卷积神经网络(CNN) 二.配置环境 三.猫狗数据分类建模 3.1 猫狗图像预处理 3.2 猫狗分类的实例--基准模型 3 ...

  2. python狗品种识别_卷积神经网络(CNN)项目,给你一个狗的图像,你的算法将会识别并估计狗的品种...

    广告:Udacity课程优惠券:邀请码: 67D6DA2E,立减 300 元 项目概述 欢迎来到卷积神经网络(CNN)项目!在这一项目中,你将学到如何建立一个处理现实生活中的,用户提供的图像的算法.给 ...

  3. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  4. 【人工智能实验】卷积神经网络CNN框架的实现与应用-手写数字识别

    目录 实验六 卷积神经网络CNN框架的实现与应用 一.实验目的 二.实验原理 三.实验结果 1.调整学习率.epochs以及bacth_size这三个参数,分别观察参数的变化对于实验结果的影响. 2. ...

  5. CNN(卷积神经网络)识别图形验证码(全网最通俗易懂,最全面的讲解)

    这里面大多资料均为网上参阅,参考资料过多未能记住您的文章地址望见谅,如涉及您的文章,本文未声明的即可留言,我会将您的原文地址引入. 一.前言 项目代码:https://github.com/bao17 ...

  6. 基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别

    目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN水果分类预测 基本结构 主要参 ...

  7. 【图像识别】基于卷积神经网络cnn实现银行卡数字识别matlab源码

    1 基于卷积神经网络cnn实现银行卡数字识别模型 模型参考这里. 2 部分代码 %印刷体识别 clc;clear;close all; addpath('util/'); addpath('data/ ...

  8. 【图像识别】基于卷积神经网络CNN手写数字识别matlab代码

    1 简介 针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于 ...

  9. 机器学习|卷积神经网络(CNN) 手写体识别 (MNIST)入门

    人工智能,机器学习,监督学习,神经网络,无论哪一个都是非常大的话题,都覆盖到可能就成一本书了,所以这篇文档只会包含在 RT-Thread 物联网操作系统,上面加载 MNIST 手写体识别模型相关的部分 ...

  10. 卷积神经网络(CNN)的参数优化方法

    积神经网络的参数优化方法--调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少. 著名: 本文是从 Michael Nielsen的电子书Neural Network and Deep L ...

最新文章

  1. java中锁的介绍及运用
  2. [Android1.6]继承BaseAdapter为GridView设置数据时设置setLayoutParams时注意
  3. 西瓜书学习记录-决策树(第四章)
  4. 【2016年第6期】俄罗斯跨境数据流动立法规则与执法实践
  5. SAP License:共享服务的今天和明天
  6. json.decoder.JSONDecodeError: Expecting ‘,‘ delimiter: line xx column xx (char xxx)
  7. [转]各种互斥量的总结
  8. java 合并两个列表_如何在Java中合并两个列表?
  9. C++基础教程之C++数据抽象
  10. 做带团长的社区团购吗?必死那种。
  11. ArcGIS教程:图形处理概述
  12. 学习周记 CSS合集
  13. HCIA Storage部分题库
  14. 苏如是:香港中鼎资本与您分享“数实共生世界”和“后人类社会”
  15. Canvas--文字
  16. php开源混合模式吗,CSS3混合模式使用详解
  17. 区块链日记——【译】用Java创建你的第一个区块链-part2:可交易
  18. 爬虫实例之豆瓣电影排行榜
  19. ***菜鸟要学会的几个cmd ddos命令
  20. 论文导读:Unsupervised Person Re-identification via Multi-label Classification

热门文章

  1. 【题解】Priest John's Busiest Day POJ - 3683 ⭐⭐⭐ 【2-SAT 拓扑序】
  2. Java不要在循环中访问数据库,这样会严重影响数据库性能
  3. 《RO 仙境传说》NFT 推出
  4. 眼球图像处理-视网膜血管管径比与高血压
  5. 1072:鸡尾酒疗法
  6. numpy.linalg 中的逆矩阵 inv
  7. 微信企业转账到银行卡
  8. 微信支付V3版商家转账到零钱
  9. 智能化漏洞挖掘技术总结
  10. excel表格同一单元格里删除重复词