使用小波分析实现文字种类自动识别

文章目录

  • 数据简介
  • 开始实验
    • 小波分解
    • 得出结果
    • 结果分析
    • 误差分析

数据简介

各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链接:提取码8848。

将PDF转化为JPG。

import aspose.words as aw
for i in range(1,6):doc=aw.Document(f"data/{i}/{i}.pdf")for page in range(0,doc.page_count):extractedPage=doc.extract_pages(page,1)extractedPage.save(f"dataset/{i}/{page+1}.jpg")

确认所有JPG大小是否一样。结果为假。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset/{i}",filename)) as img:sizes.append(img.size)
flag=True
for i in sizes:if i!=sizes[0]:flag=False;break
print(flag)

初步裁切JPG取正中间的400*800个像素点(因为所有JPG的大小都大于400*800)。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset/{i}",filename)) as img:width,height=img.sizeleft=(width-400)/2top=(height-800)/2right=(width+400)/2bottom=(height+800)/2copped_img=img.crop((left,top,right,bottom))copped_img.save(f"dataset_new/{i}/{filename}")

拆分大小为400*800的JPG为32张100*100的JPG。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset_new/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_new/{i}",filename)) as img:for x in range(0,400,100):for y in range(0,800,100):box=(x,y,x+100,y+100)tile=img.crop(box)tile.save(f"dataset_last_temp/{i}/{filename[:-4]}"+f"_{x//100}{y//100}"+".jpg")

人为地手动删除一些没有文字地的JPG,保存在dataset_last中。

展示其中一些数据:从上往下依次是中、日、韩、英、俄。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

开始实验

小波分解

为了方便展示结果,对LL2,LH2,HL2,HH2,LH1,HL1,HH1进行了裁剪。实际实验中没有进行裁剪。

from PIL import Image
import os
import numpy as np
import pywt
import matplotlib.pyplot as plt
def fc(LL,LH,HL,HH,x):LL=LL[:x,:x]LH=LH[:x,:x]HL=HL[:x,:x]HH=HH[:x,:x]image=np.zeros((LL.shape[0]+LH.shape[0],LL.shape[1]+HL.shape[1]))image[:LL.shape[0],:LL.shape[1]]=LLimage[LL.shape[0]:,:LL.shape[1]]=LHimage[:LL.shape[0],LL.shape[1]:]=HLimage[LL.shape[0]:,LL.shape[1]:]=HHreturn image
for i in range(1,6):for filename in os.listdir(f"dataset_last/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_last/{i}",filename)) as img:img=img.convert('L')coeffs1=pywt.dwt2(img,'db4')LL1,(LH1,HL1,HH1)=coeffs1coeffs2=pywt.dwt2(LL1,'db4')LL2,(LH2,HL2,HH2)=coeffs2image=fc(fc(LL2,LH2,HL2,HH2,25),LH1,HL1,HH1,50)image=Image.fromarray(image.astype('uint8'))image.save(f"temp/{i}/{filename}")

展示其中一些结果:从上往下依次是中、日、韩、英、俄。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

得出结果

标准流程。

from PIL import Image
import os
import numpy as np
import pywt
def fc(matrix):count=0for i in matrix:for j in i:count+=j**2return count/(matrix.shape[0]*matrix.shape[1])
def metric1(LH,HL,HH):return [fc(LH),fc(HL),fc(HH)]
def metric2(LH,HL,HH):x=metric1(LH,HL,HH)a,b,c=x[0],x[1],x[2]d=a+b+creturn [a/d,b/d,c/d]
lt1=[[] for _ in range(5)]
lt2=[[] for _ in range(5)]
for i in range(1,6):for filename in os.listdir(f"dataset_last/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_last/{i}",filename)) as img:img=img.convert('L')coeffs1=pywt.dwt2(img,'db4')LL1,(LH1,HL1,HH1)=coeffs1coeffs2=pywt.dwt2(LL1,'db4')LL2,(LH2,HL2,HH2)=coeffs2lt1[i-1].append([LH1,HL1,HH1])lt2[i-1].append([LH2,HL2,HH2])
metrics11=[[metric1(_[0],_[1],_[2]) for _ in lt1[i]] for i in range(5)]
metrics12=[[metric2(_[0],_[1],_[2]) for _ in lt1[i]] for i in range(5)]
mean11=[np.mean(metrics11[i],axis=0) for i in range(5)]
mean12=[np.mean(metrics12[i],axis=0) for i in range(5)]
var11=[np.var(metrics11[i],axis=0) for i in range(5)]
var12=[np.var(metrics12[i],axis=0) for i in range(5)]
metrics21=[[metric1(_[0],_[1],_[2]) for _ in lt2[i]] for i in range(5)]
metrics22=[[metric2(_[0],_[1],_[2]) for _ in lt2[i]] for i in range(5)]
mean21=[np.mean(metrics21[i],axis=0) for i in range(5)]
mean22=[np.mean(metrics22[i],axis=0) for i in range(5)]
var21=[np.var(metrics21[i],axis=0) for i in range(5)]
var22=[np.var(metrics22[i],axis=0) for i in range(5)]
zd={1:"中文",2:"日文",3:"韩文",4:"英文",5:"俄文"}
print(f"{'1次分解-DEMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics11[i]:d=[sum((np.array(j)-_)**2) for _ in mean11]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics11[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DPMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics12[i]:d=[sum((np.array(j)-_)**2) for _ in mean12]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics12[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DEMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics11[i]:d=[sum(((np.array(j)-mean11[k])**2)/(var11[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics11[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DPMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics12[i]:d=[sum(((np.array(j)-mean12[k])**2)/(var12[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics12[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DEMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics21[i]:d=[sum((np.array(j)-_)**2) for _ in mean21]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics21[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DPMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics22[i]:d=[sum((np.array(j)-_)**2) for _ in mean22]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics22[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DEMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics21[i]:d=[sum(((np.array(j)-mean21[k])**2)/(var21[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics21[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DPMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics22[i]:d=[sum(((np.array(j)-mean22[k])**2)/(var22[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics22[i])*10000)/100),end=" ")
print()

在这里插入图片描述

结果分析

这是一个5分类任务,乱猜猜中的概率为20%。根据上述实验结果,我们能够保证至少有一种判断方法判断一种语言正确的概率大于80%(除了英语)。大胆猜测英语判断效果不好的原因是我找的不同语言的论文中或多或少都包括了英文,毕竟英语是国际通用语言。

误差分析

由于每种语言我只找了一篇论文来做实验,显然实验数据并不够多。并不满足格列文科定理,结果不准也很正常。还有就是图片质量本身也不够好,例如:各种各样的水印,奇奇怪怪的与文字没有关系的论文插图。

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

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

相关文章

Volatility:分析MS10-061攻击

1、概述 # 1&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

Spring MVC -- 响应

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 3.响应3.1 返回静态页面3.2 返回HTML代码片段3.3 返回JSON3.4 设置状态码3.5 设置Header设置Content-Type设置其他Header 3.响应 3.1 返回静态页面 静态html页面一般放在static目录底…

连接Redis异常:JedisMovedDataException

redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 5798 192.168.187.138:6379 在使用JAVA API连接redis的时候&#xff0c;出现了异常&#xff1a; 问题的原因 JAVA API实现是redis集群实现方式&#xff0c;而在配置文中就配置的是单结点的方式。 Moved表示使…

【BUG】已解决:error: subprocess-exited-with-error

已解决&#xff1a;error: subprocess-exited-with-error 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主…

【计算机方向】SCI三区宝刊!国人发文超级友好,录用容易,不能错过!

期刊解析 01 期刊信息 出版商&#xff1a;Academic Press Inc. ISSN&#xff1a;0743-7315 E-ISSN &#xff1a;1096-0848 期刊官方网站:并行与分布式计算杂志 |ScienceDirect.com by Elsevier 期刊投稿网址&#xff1a;https://www.editorialmanager.com/JPDC …

系统设计面试问题:设计​WhatsApp

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 ​ 在这个系统设计面试场景中&#xff0c;我们被要求设计一个类似于 WhatsApp 的消息应用程序。 虽然真正的面试可能会关注应用程序的一个或多个功能&#xff0c;…

2048小游戏,h5,纯前端

部分代码 //scorevar scoreSprite game.add.sprite(10, 10);var scoreGraphics game.add.graphics(0, 0);scoreGraphics.lineStyle(5, 0xA1C5C5);scoreGraphics.beginFill(0x308C8C);scoreGraphics.drawRoundedRect(0, 0, 70, 50, 10);scoreGraphics.endFill();scoreSprite.a…

PyTorch 深度学习实践-循环神经网络(高级篇)

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记总代码练习 上课笔记 个人能力有限&#xff0c;重看几遍吧&#xff0c;第一遍基本看不懂 名字的每个字母都是一个特征x1,x2,x3…&#xff0c;一个名字是一个序列 rnn用GRU 用ASCII表作为词典&#xff0c;长度为128&#x…

业务系统核心模块资料访问性能优化实战

随着业务系统的云化转型不断推进&#xff0c;业务量呈现显著增长&#xff0c;对业务系统的性能和资源管理提出了更高要求。在这样的背景下&#xff0c;实现系统资源使用与性能指标的均衡成为保障生产系统高效稳定运行的核心任务。 在性能优化的范畴内&#xff0c;核心业务系统对…

苏州金龙海格汽车入选2024中国汽车行业可持续发展实践案例

2024年7月11日-13日&#xff0c;由中国汽车工业协会主办的第14届中国汽车论坛在上海嘉定举办。本届论坛隆重发布了“2024中国汽车行业可持续发展实践案例”&#xff0c;苏州金龙因在坚持绿色可持续发展方面做出的努力和贡献获评2024中国汽车行业可持续发展实践案例“绿色发展”…

【P2P_BMA_P2MP_NBMA】

基本概念介绍 1. BMA&#xff08;Broadcast&#xff09; 广播型多路访问技术&#xff0c;在一个MA&#xff08;多路访问&#xff0c;在一个网段内的节点数量不限制。&#xff09;网络中同时存在广播机制。 特点&#xff1a; 允许将数据包广播到网络上的所有主机。路由器之间…

【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

PyTorch 深度学习实践-卷积神经网络基础篇

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记代码实现作业实现 上课笔记 如果一个网络全都是由线性层串联起来&#xff08;torch.nn.Linear(xx, yy)&#xff09;&#xff0c;就叫他全连接的网络(左边节点到右边节点任意两个都存在权重) 先看一下吴恩达或者李宏毅老师…

QT通用配置文件库(QPreferences)

QT通用配置文件库(QPreferences) QPreferences项目是基于nlohmann/json的qt可视化配置文件库&#xff0c;将配置保存成json格式&#xff0c;并提供UI查看与修改&#xff0c;可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体&#…

【Git标签管理】理解标签 | 创建标签 | 查看标签 | 删除标签 | 推送标签

目录 1.理解标签 2.创建标签 3.查看标签 4.删除本地仓库的标签 5.推送标签 6.删除远程仓库的标签 1.理解标签 Git提供一个打标签的功能tag&#xff0c;对某一次事务/提交的表示&#xff08;作用/意义&#xff09;。标签 tag &#xff0c;可以简单的理解为是对某次 comm…

Java(二十二)---队列

文章目录 前言1.队列(Queue)的概念2.Queue的使用3.队列的模拟实现4.循环队列5.双端队列6.面试题[1. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)[2. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/de…

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用&#xff0c;着重拓展机监督学习和无监督学习的相关知识。 重点&#xff1a;机器学习的定义和应用&#xff1b; 难点&#xff1a;机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…

<数据集>钢板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1986张 标注数量(xml文件个数)&#xff1a;1986 标注数量(txt文件个数)&#xff1a;1986 标注类别数&#xff1a;7 标注类别名称&#xff1a;[crescent gap, silk spot, water spot, weld line, oil spot, punchin…

工业圆点定位激光器主要应用场景有哪些?

在现代工业生产的各个领域&#xff0c;精确定位和高效操作已成为提升生产效率和产品质量的关键。其中&#xff0c;工业圆点定位激光器以其高精度、高效率的特性&#xff0c;成为了众多工业应用中的核心工具。接下来我们就跟着鑫优威一起来深入了解一下关于工业圆点定位激光器的…

抖音/快手/小红书私信卡片在线制作

W外链平台&#xff0c;作为现代网络营销领域的一颗璀璨明星&#xff0c;其强大的功能和独特的优势已经吸引了无数企业和个人的目光。在如今这个信息爆炸的时代&#xff0c;如何有效地将自己的网站、产品、服务推广出去&#xff0c;成为了每个营销人员都在思考的问题。而W外链平…