news 2026/2/18 3:11:37

毕设 深度学习 opencv 公式识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
毕设 深度学习 opencv 公式识别

文章目录

  • 0 前言
  • 1 课题说明
  • 2 效果展示
  • 3 具体实现
  • 4 关键代码实现
  • 5 算法综合效果

0 前言

分享优质毕业设计项目,今天要分享的是

🚩基于深度学习的数学公式识别算法实现

项目运行效果:

毕业设计 深度学习的公式识别

🧿 项目分享:见文末!



1 课题说明

手写数学公式识别较传统OCR问题而言,是一个更复杂的二维手写识别问题,其内部复杂的二维空间结构使得其很难被解析,传统方法的识别效果不佳。随着深度学习在各领域的成功应用,基于深度学习的端到端离线数学公式算法,并在公开数据集上较传统方法获得了显著提升,开辟了全新的数学公式识别框架。然而在线手写数学公式识别框架还未被提出,论文TAP则是首个基于深度学习的端到端在线手写数学公式识别模型,且针对数学公式识别的任务特性提出了多种优化。

公式识别是OCR领域一个非常有挑战性的工作,工作的难点在于它是一个二维的数据,因此无法用传统的CRNN进行识别。

推荐大家用于毕业设计。。。。

2 效果展示

这里简单的展示一下效果

3 具体实现

神经网络模型是 Seq2Seq + Attention + Beam Search。Seq2Seq的Encoder是CNN,Decoder是LSTM。Encoder和Decoder之间插入Attention层,具体操作是这样:Encoder到Decoder有个扁平化的过程,Attention就是在这里插入的。具体模型的可视化结果如下

4 关键代码实现

classEncoder(object):"""Class with a __call__ method that applies convolutions to an image"""def__init__(self,config):self._config=configdef__call__(self,img,dropout):"""Applies convolutions to the image Args: img: batch of img, shape = (?, height, width, channels), of type tf.uint8 tf.uint8 因为 2^8 = 256,所以元素值区间 [0, 255],线性压缩到 [-1, 1] 上就是 img = (img - 128) / 128 Returns: the encoded images, shape = (?, h', w', c') """withtf.variable_scope("Encoder"):img=tf.cast(img,tf.float32)-128.img=img/128.withtf.variable_scope("convolutional_encoder"):# conv + max pool -> /2# 64 个 3*3 filters, strike = (1, 1), output_img.shape = ceil(L/S) = ceil(input/strike) = (H, W)out=tf.layers.conv2d(img,64,3,1,"SAME",activation=tf.nn.relu)image_summary("out_1_layer",out)out=tf.layers.max_pooling2d(out,2,2,"SAME")# conv + max pool -> /2out=tf.layers.conv2d(out,128,3,1,"SAME",activation=tf.nn.relu)image_summary("out_2_layer",out)out=tf.layers.max_pooling2d(out,2,2,"SAME")# regular conv -> idout=tf.layers.conv2d(out,256,3,1,"SAME",activation=tf.nn.relu)image_summary("out_3_layer",out)out=tf.layers.conv2d(out,256,3,1,"SAME",activation=tf.nn.relu)image_summary("out_4_layer",out)ifself._config.encoder_cnn=="vanilla":out=tf.layers.max_pooling2d(out,(2,1),(2,1),"SAME")out=tf.layers.conv2d(out,512,3,1,"SAME",activation=tf.nn.relu)image_summary("out_5_layer",out)ifself._config.encoder_cnn=="vanilla":out=tf.layers.max_pooling2d(out,(1,2),(1,2),"SAME")ifself._config.encoder_cnn=="cnn":# conv with stride /2 (replaces the 2 max pool)out=tf.layers.conv2d(out,512,(2,4),2,"SAME")# convout=tf.layers.conv2d(out,512,3,1,"VALID",activation=tf.nn.relu)image_summary("out_6_layer",out)ifself._config.positional_embeddings:# from tensor2tensor lib - positional embeddings# 嵌入位置信息(positional)# 后面将会有一个 flatten 的过程,会丢失掉位置信息,所以现在必须把位置信息嵌入# 嵌入的方法有很多,比如加,乘,缩放等等,这里用 tensor2tensor 的实现out=add_timing_signal_nd(out)image_summary("out_7_layer",out)returnout

学长编码的部分采用的是传统的卷积神经网络,该网络主要有6层组成,最终得到[N x H x W x C ]大小的特征。

其中:N表示数据的batch数;W、H表示输出的大小,这里W,H是不固定的,从数据集的输入来看我们的输入为固定的buckets,具体如何解决得到不同解码维度的问题稍后再讲;

C为输入的通道数,这里最后得到的通道数为512。

当我们得到特征图之后,我们需要进行reshape操作对特征图进行扁平化,代码具体操作如下:

N=tf.shape(img)[0]H,W=tf.shape(img)[1],tf.shape(img)[2]# imageC=img.shape[3].value# channelsself._img=tf.reshape(img,shape=[N,H*W,C])

当我们在进行解码的时候,我们可以直接运用seq2seq来得到我们想要的结果,这个结果可能无法达到我们的预期。因为这个过程会相应的丢失一些位置信息。

位置信息嵌入(Positional Embeddings)

通过位置信息的嵌入,我不需要增加额外的参数的情况下,通过计算512维的向量来表示该图片的位置信息。具体计算公式如下:

其中:p为位置信息;f为频率参数。从上式可得,图像中的像素的相对位置信息可由sin()或cos表示。

我们知道,sin(a+b)或cos(a+b)可由cos(a)、sin(a)、cos(b)以及sin(b)等表示。也就是说sin(a+b)或cos(a+b)与cos(a)、sin(a)、cos(b)以及sin(b)线性相关,这也可以看作用像素的相对位置正、余弦信息来等效计算相对位置的信息的嵌入。

这个计算过程在tensor2tensor库中已经实现,下面我们看看代码是怎么进行位置信息嵌入。代码实现位于:/model/components/positional.py。

defadd_timing_signal_nd(x,min_timescale=1.0,max_timescale=1.0e4):static_shape=x.get_shape().as_list()# [20, 14, 14, 512]num_dims=len(static_shape)-2# 2channels=tf.shape(x)[-1]# 512num_timescales=channels//(num_dims*2)# 512 // (2*2) = 128log_timescale_increment=(math.log(float(max_timescale)/float(min_timescale))/(tf.to_float(num_timescales)-1))# -0.1 / 127inv_timescales=min_timescale*tf.exp(tf.to_float(tf.range(num_timescales))*-log_timescale_increment)# len == 128 计算128个维度方向的频率信息fordiminrange(num_dims):# dim == 0; 1length=tf.shape(x)[dim+1]# 14 获取特征图宽/高position=tf.to_float(tf.range(length))# len == 14 计算x或y方向的位置信息[0,1,2...,13]scaled_time=tf.expand_dims(position,1)*tf.expand_dims(inv_timescales,0)# pos = [14, 1], inv = [1, 128], scaled_time = [14, 128] 计算频率信息与位置信息的乘积signal=tf.concat([tf.sin(scaled_time),tf.cos(scaled_time)],axis=1)# [14, 256] 合并两个方向的位置信息向量prepad=dim*2*num_timescales# 0; 256postpad=channels-(dim+1)*2*num_timescales# 512-(1;2)*2*128 = 256; 0signal=tf.pad(signal,[[0,0],[prepad,postpad]])# [14, 512] 分别在矩阵的上下左右填充0for_inrange(1+dim):# 1; 2signal=tf.expand_dims(signal,0)for_inrange(num_dims-1-dim):# 1, 0signal=tf.expand_dims(signal,-2)x+=signal# [1, 14, 1, 512]; [1, 1, 14, 512]returnx

得到公式图片x,y方向的位置信息后,只需要要将其添加到原始特征图像上即可。

🧿选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

5 算法综合效果

项目运行效果:

毕业设计 深度学习的公式识别

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/17 6:11:52

为什么说Open-AutoGLM是下一个十年的AI基础设施?(99%的人还不知道)

第一章:Open-AutoGLM的诞生背景与战略意义随着大模型技术在自然语言处理、代码生成和多模态理解等领域的迅猛发展,通用语言模型(GLM)的应用边界不断拓展。然而,封闭的训练流程、高昂的算力成本以及缺乏透明度的推理机制…

作者头像 李华
网站建设 2026/2/15 13:27:18

5分钟玩转在线图表制作:新手快速上手完全攻略

还在为制作专业图表而头疼吗?这款革命性的在线图表制作工具将彻底改变你的工作方式!只需简单文本输入,就能实时生成精美流程图、序列图、甘特图等多种图表类型。在线图表制作从未如此简单高效,无论你是技术文档编写者、项目管理者…

作者头像 李华
网站建设 2026/2/16 6:28:11

Bakta终极指南:10分钟实现细菌基因组快速精准注释

Bakta终极指南:10分钟实现细菌基因组快速精准注释 【免费下载链接】bakta Rapid & standardized annotation of bacterial genomes, MAGs & plasmids 项目地址: https://gitcode.com/gh_mirrors/ba/bakta 在微生物基因组学研究领域,高效精…

作者头像 李华
网站建设 2026/2/16 5:33:35

如何简单快速配置DsHidMini驱动:让PS3手柄在Windows系统完美运行

如何简单快速配置DsHidMini驱动:让PS3手柄在Windows系统完美运行 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini DsHidMini是一款专为索尼PS3手柄…

作者头像 李华
网站建设 2026/2/17 9:39:37

CANN开源开放背后:中国AI算力底座如何跨越“生态鸿沟”?

在全球人工智能加速迈入深水区的当下,行业竞争的底层逻辑正在发生变化。模型参数的规模不再是唯一焦点,算力是否可持续、基础软件是否可演进、技术体系是否掌握在自己手中,正在成为决定产业上限的关键因素。尤其是在国际技术环境日趋复杂的背…

作者头像 李华
网站建设 2026/2/16 11:45:25

国内首发资源泄露?Open-AutoGLM 沉思版下载链接曝光,速看合规获取路径

第一章:Open-AutoGLM 沉思版 下载项目背景与版本特性 Open-AutoGLM 沉思版是基于 AutoGLM 架构开发的开源语言模型推理框架,专注于本地化部署与低资源环境下的高效运行。该版本在原始模型基础上优化了参数加载机制,支持动态量化与上下文缓存&…

作者头像 李华