当前位置: 首页 > 编程日记 > 正文

深度学习实现场景字符识别模型|代码干货

作者|李秋键

出品|AI科技大本营(ID:rgznai100)

# 前言 #

文字是人从日常交流中语音中演化出来,用来记录信息的重要工具。文字对于人类意义非凡,以中国为例,中国地大物博,各个地方的口音都不统一,但是人们使用同一套书写体系,使得即使远隔千里,我们依然能够通过文字进行无障碍的沟通。文字也能够跨越时空,给予了我们了解古人的通道。随着计算机的诞生,文字也进行了数字化的进程,但是不同于人类,让计算机能够正确地进行字符识别是一个复杂又艰巨但意义重大的工作。从计算机诞生开始,无数的研究者在这方面做了很多工作与尝试,但面临的困难艰巨。

其中场景文字识别中主要面临的困难是:

(1)场景复杂变化很大;

(2)字体形态颜色多变;

(3)光照条件变化大;

(4)文字排列方式不确定;

(5)文本行与文本行之间的距离,大小格式,字体变化大。

而深度学习的引入,使得在我们在复杂场景下进行字符识别更为便利。

本项目通过使用pytorch搭建resnet迁移学习模型实现对复杂场景下字符的识别。其模型训练过程如下图可见:

1.基本介绍#

文字是人从日常交流中语音中演化出来,用来记录信息的重要工具。文字对于人类意义非凡,以中国为例,中国地大物博,各个地方的口音都不统一,但是人们使用同一套书写体系,使得即使远隔千里,我们依然能够通过文字进行无障碍的沟通。文字也能够跨越时空,给予了我们了解古人的通道。随着计算机的诞生,文字也进行了数字化的进程,但是不同于人类,让计算机能够正确地进行字符识别是一个复杂又艰巨但意义重大的工作。从计算机诞生开始,无数的研究者在这方面做了很多工作与尝试,但面临的困难艰巨。

1.1

环境要求

本次环境使用的是python3.6.5+windows平台。

主要用的库有:Opencv-python模块、Pillow模块、PyTorch模块。

Opencv-python模块

opencv-python是一个Python绑定库,旨在解决计算机视觉问题。其使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有Opencv数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如Scipy和Matplotlib)集成更容易。

Pillow模块:

Pillow是Python里的图像处理库,它提供了了广泛的文件格式支持和强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

PyTorch模块

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这一点是现在很多其他的主流框架都不支持的。PyTorch还提供了两个高级功能:1.具有强大的GPU加速的张量计算2.包含自动求导系统的深度神经网络 除了Facebook之外,Twitter、GMU和Salesforce等机构都采用了PyTorch。

1.2

迁移模型

迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。

由下图可以看出迁移学习和传统机器学习的区别,在传统机器学习的学习过程中,我们试图单独学习每一个学习任务,即生成多个学习系统;而在迁移学习中,我们试图将在前几个任务上学到的知识转移到目前的学习任务上,从而将其结合起来。

2.算法模型#

在这里我们使用的是resnet模型对图像进行特征提取。其中图像特征提取通常使用卷积神经网络进行特征学习,由于字符识别相较于物体分类的不同,通常不会完全照搬分类网络来直接进行图形特征提取,会在分类网络的基础上为了适应目标任务的改进。

由于卷积神经网络会受到感受野的限制,因此提出了需要使用序列特征提取模型对特征进行建模,学习卷积神经网络提取到的图像特征之间的上下文关系。

2.1

数据集准备

在这里我们将训练的数据集分成了训练集、测试集和验证集三部分。其中准备的数据集如下:

2.2

数据处理

为了保证每次运行模型效果基本相同,这里设置随机种子,同时torch.backends.cudnn.deterministic将这个flag置为True。然后进行图像变换transforms,shffule=True在表示不同批次的数据遍历时,打乱顺序。num_workers=0表示使用0个子进程来加载数据。代码如下:

SVHNDataset(train_path, train_label,transforms.Compose([# 图像尺寸变换(resize) ——transforms.Resizetransforms.Resize((64, 128)),# 随机裁剪:transforms.RandomCrop。size(sequence 或int)transforms.RandomCrop((60, 120)),# 修改亮度、对比度和饱和度:transforms.ColorJitter。亮度。对比度。饱和度。。。transforms.ColorJitter(0.3, 0.3, 0.2),# 随机旋转:transforms.RandomRotation。degrees(sequence 或float或int) -要选择的度数范围transforms.RandomRotation(5),# 将PIL Image或者 ndarray 转换为tensor,并且归一化至[0-1]transforms.ToTensor(),# 标准化:transforms.Normalize。用平均值和标准偏差归一化张量图像。mean每个通道的均值序列。std每个通道的标准偏差序列。transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])),batch_size=40,shuffle=True,num_workers=0
)

2.3

resnet模型搭建

这里采用的resnet18模型是由17个卷积层(conv)+1个全连接层(fc)构成。其中使用resnet模型的主要优势在于,当逐渐增加神经网络的深度时,网络难以学习恒等函数的参数,导致最后的训练效果往往达不到预期,也会影响网络性能。残差网络学习恒等函数比较容易,可将添加的网络层看成一个个残差块。例如,一个20层的普通网络,每两层之间通过跳跃连接构成一个残差块,那么这个普通网络就成为一个由10个残差块构成的残差网络。网络性能不仅没有下降,而且甚至有所提高。普通网络转化为残差网络也比较容易,只需要加入残差块即可。残差网络大大提高了网络层数,通过残差映射的方式进行拟合,简单易操作,同时提高了准确率。

设置resnet18网络模型,进行迁移学习,保留resnet18网络的卷积网络部分,并保留预训练参数。然后设计自适应平均池化函数,即不管之前的特征图尺寸为多少,只要设置为(1,1),那么最终特征图大小都为(1,1),然后把resnet18模型除了最后一个全连接层之外的各个网络层提取出来,并设置5个全连接层,分别对应5个可能的街道字符的识别。

def __init__(self):super(SVHN_Model1, self).__init__()model_conv = models.resnet18(pretrained=True)model_conv.avgpool = nn.AdaptiveAvgPool2d(1)model_conv = nn.Sequential(*list(model_conv.children())[:-1])self.cnn = model_convself.fc1 = nn.Linear(512, 11)self.fc2 = nn.Linear(512, 11)self.fc3 = nn.Linear(512, 11)self.fc4 = nn.Linear(512, 11)self.fc5 = nn.Linear(512, 11)
def forward(self, img):feat = self.cnn(img)feat = feat.view(feat.shape[0], -1)c1 = self.fc1(feat)c2 = self.fc2(feat)c3 = self.fc3(feat)c4 = self.fc4(feat)c5 = self.fc5(feat)# c6 = self.fc6(feat)return c1, c2, c3, c4, c5  # , c6

完整代码链接:

https://pan.baidu.com/s/1UpIq9XSlWxSotE0fama3Vw 提取码:gcwu

作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

更多精彩推荐
大手笔 !Julia Computing 获 2400 万美元融资,前 Snowflake CEO 加入董事会二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货KNN 分类算法原理代码解析

相关文章:

SQL Server 一些重要视图3

1、 sys.dm_tran_locks; 为每一把锁返回一行、request_session_id 可以与sys.dm_tran_session_transactions \sys.dm_exec_connections相关联。 request_status 查看锁的分配情况 2、 sys.dm_os_waiting_tasks; 为每一个等待的任务返回一行、blocking_session_id标记是因为谁而…

Linux下将Mysql和Apache加入到系统服务里的方法

Apache加入到系统服务里面: cp /安装目录下/apache/bin/apachectl /etc/rc.d/init.d/httpd 修改httpd 在文件头部加入如下内容: ### # Comments to support chkconfig on RedHat Linux # chkconfig: 2345 90 90 # description:http server ### 保存 在打入 #chkconf…

int、bigint、smallint 和 tinyint

int、bigint、smallint 和 tinyint使用整数数据的精确数字数据类型。 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。 int 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,6…

阿里技术文档:Redis+Spring全家桶+Dubbo精选+高性能+高并发

最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好…

SDN:软件定义网络

近期高级网络课的小组任务是在老师给定的范围内自选方向主题研究并做展示报告。我们组选了sdn。原以为这东西会是工业界无人问津的概念化产品,Google了一下却发现事实上sdn挺火的,因为它可能带来的可扩展性,一些大互联网企业也在開始涉足相关…

Linux之文本处理

1 cut:按某种方式对文件进行分割然后输出 选项:-b 按字节选取 -d 自定义分隔符 -f 和-d一起使用,指定哪个区域或字段 [rootlocalhost ~]# cat /etc/passwd | cut -d : -f 1 #以:为分隔符,打印第一个字段 […

Yahoo javascript 开源界面库YUI 和EXT

清清月儿整理 [yui][译]Yahoo!User Interface Libray 介绍 Yahoo! User Interface Library(简称yui) 是一个使用JavaScript编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互功能的Web程序。yui也包含几个核心的CSS文件。yui中的所有组件已经以开源的形式发布…

芯片开发语言:Verilog 在左,Chisel 在右

来源 | 老石谈芯在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能处RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流,我们聊了关于RISC-V、还有“香山”处理器的前世今生。包老师也分享…

1.1GTK+ 的简单程序HelloWorld

1.1GTK 的简单程序HelloWorld 编译执行如图所看到的:

struts2 validate验证

转自:https://blog.csdn.net/houpengfei111/article/details/9038233 自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: [java] view plaincopypublic class PermissionInterceptor implements Interceptor { …

PHP中文乱码

页面顶端加 <?php header("content-Type: text/html; charsetgbk"); ?>

收藏 | 提高数据处理效率的 Pandas 函数方法

作者&#xff1a;俊欣来源&#xff1a;关于数据分析与可视化前言大家好&#xff0c;这里是俊欣&#xff0c;今天和大家来分享几个Pandas方法可以有效地帮助我们在数据分析与数据清洗过程当中提高效率&#xff0c;加快工作的进程&#xff0c;希望大家看了之后会有收获。首先导入…

如何让两个div在同一行显示?一个float搞定

最近在学习div和css&#xff0c;遇到了一些问题也解决了很多以前以为很难搞定的问题。比如&#xff1a;如何让两个div显示在同一行呢&#xff1f;&#xff08;不是用table表格&#xff0c;table对SE不太友好&#xff09;其实&#xff0c;<div> 是一个块级元素&#xff0c…

使用sudo进入root权限,以及防止root密码被恶意篡改

一、前言 sudo是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;减少了root用户的登陆和管理时间&#xff0c;提高了安全性。Sudo不是对shell的一个代替&#xff0c;它是面向每个命令的。 而防止root用户密码被恶意更改&#xff0c;主要是用户基本上…

赠书 | 干货!用 Python 动手学强化学习

01了解强化学习新闻报道中很少将强化学 习与机器学习、深度学习、人工智能这些关键词区分开来&#xff0c;所以我们要先介绍什么是强化学习&#xff0c;再讲解其基本机制。强化学习与机器学习、人工智能这些关键词之间的关系&#xff1b;强化学习相对于其他机器学习方法的优点和…

php如何调用c接口无错版

1.首先是要安装好PHP 2.进入PHP的下载解压目录下的ext目录 #cd /root/php-5.3.6/ext #./ext_skel --extnamehmc 说明&#xff1a; ./ext_skel --extnamemodule_name module_name是你自己可以选择的扩展模块的名字&#xff0c;例如我选择的hmc。执行工具后会自动在ext目录下建…

onchange事件只生效一次的问题

今天遇到一个file表单元素&#xff0c;对onchange事件的响应问题&#xff0c;发现仅响应一次&#xff0c;网上查到解决方法&#xff0c;在这里转载一下文件选择框的onchange事件只在第一次改变时生效&#xff0c;以后再选择文件不会触发onchange事件。解决方法1&#xff1a;用j…

WSFC2016 SMB多通道与网络调校

SMB多通道是微软Windows Server 2012时新增的一项功能&#xff0c;微软SMB3.0协议的一部分&#xff0c;主要用于SMB文件传输时&#xff0c;检测到多张可通信网卡&#xff0c;自动使用多张网卡进行传输&#xff0c;提高吞吐量&#xff0c;链路容错。 Windows Server 2012和之前的…

一个常用的正则表达验证类

这是 風語深蓝很早以前写的一个正则表达式验证工具类&#xff0c;包含了一些常见的校验和支持自定义的正则表达式匹配&#xff0c;可以选择完全匹配&#xff0c;也可以获取所有匹配项。曾用它仿造Eclispe下的正则表达式插件写过一个工具。因为最近突然有几个朋友都在问这方面的…

Signal和slot的声明和连接

信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来。Signal和slot的声明&#xff08;一&#xff09;在Qt程序设计中&#xff0c;凡是包含signal和slot的类中都要加上Q_OBJECT的定义&#xff0c;下面的例子给出了…

重磅!深度学习知识总结和调参技巧开放下载了

近年来&#xff0c;人工智能正在进入一个蓬勃发展的新时期&#xff0c;这主要得益于深度学习和CV领域近年来的发展和成就。在这其中&#xff0c;卷积神经网络的成功也带动了更多学术和商业应用的发展和进步。为了避免“内卷”&#xff0c;更多人选择学习进阶&#xff0c;但是仍…

Oracle优化器:星型转换

Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询。星型查询语句多用于基于星型模型设计的数据仓库应用中。星型模型的称谓源于该种模型以图形化表现时看起来形似一颗海星。这颗星的中央会由一个或多个事实表(fact tables)组成&#xff…

php安装模式mod_php和Fastcgi的选择与对比

安装php又面临到了模式的选择&#xff0c;以前都是选择mod_php模式&#xff0c;因为这样安装比较方便哈&#xff0c;今天突然关心起FastCGI这种模式&#xff0c;败毒了一把&#xff0c;找到了一些关于mod_php和Fastcgi的选择与对比这方面的讨论&#xff0c;现在发出来留一个记号…

暴雨之后,评估与重建可以用这个数据集

作者&#xff1a;神经星星来源&#xff1a;HyperAI超神经场景描述&#xff1a;连续多日的暴雨给郑州和河南部分城市&#xff0c;带来了严重的洪涝灾害&#xff0c;牵动了全国人民的心。灾难面前&#xff0c;现阶段的科技和具体解决方案&#xff0c;也能发挥出关键作用。关键词&…

从jQuery的缓存到事件监听

很久以前&#xff0c;我还在cnblogs里面逛的时候就提出过一个问题&#xff08;刚找了半天没找到&#xff09;。不知道大家有没有发现&#xff0c;用jQuery选择器"选择"之后的DOM上会添加jQuery*********属性。 <DIV idd1 jQuery1294122065250"1">abc…

对一些品种数量校正

update sphwph set shl1-1 where spidSPH00002323 and piciJHAYMA00017433_5 and hwHWI00000022 update sphwph set shl-11 where spidSPH00002323 and piciJHAYMA00021159_2 and hwHWI00000022 3月7日调拨后少了398 update sphwph set shl0398 where piciJHAYMA00024241_1 an…

收藏喜+1!值得使用的100个Python小技巧

目前Python可以说是非常流行&#xff0c;在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;很容易上手。你可以用它来完成很多任务&#xff0c;比如数据科学、机器学习、Web开发、脚本编写、自动化等。下面&#xff0c;给大家…

一款基jquery超炫的动画导航菜单

今天给大家分享一款基jquery超炫的动画导航菜单。这款导航菜单&#xff0c;初始时页面中间一个按钮&#xff0c;单击按钮&#xff0c;菜单从左侧飞入页中。再次单击按钮&#xff0c;导航飞入左侧消息。动画效果很非常炫。一起看下效果图&#xff1a; 在线预览 源码下载 实现的…

如何用C#动态编译、执行代码

在开始之前&#xff0c;先熟悉几个类及部分属性、方法&#xff1a;CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。  一、CSharpCodeProvider    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码&#xff0c;可…

【解决】MySql 5.6 运行崩溃错误

【解决】MySql 5.6 运行崩溃错误 最近弄了一台云主机&#xff0c;配置是20G磁盘空间&#xff0c;1G运行内存的Linux服务器。在上面安装了LAMP&#xff08;RHEL7.2Apache2.4MySql5.6PHP5.6&#xff09;&#xff0c;然后搭建wordpress网站&#xff0c;可是网站运行没多久&#xf…