Vue + Django + PaddleOCR 实现一个在线OCR 识别网站,一键上传快速识别

news/2024/5/20 18:32:42/文章来源:https://blog.csdn.net/weixin_42512684/article/details/124818907

大家好,我是小张~

之前写过一篇博文介绍了一款OCR 识别库,识别精度能达到商用级别,并且支持多语言识别,使用详情请参考文章:文本OCR,这个Python库识别效果不输于商用!,

除了PaddleOCR之外,之前还介绍过一些其它好玩的开源项目,例如老照片修复 Bringing-Old-Photos-Back-to-Life 、黑白照片上色DeOldify 。因此,最近准备启动一个项目,做一个在线网站,将之前一些好玩的功能都陆续集成在这个网站中

本篇文章将介绍网站第一个功能模块:图片OCR识别,识别功能借助于PaddleOCR,后端使用Django框架,前端主要借助Element-PLus + Vue 实现,这个模块虽然没有用到数据库存储功能,但由于是 Django框架需要借助MySQL 实现项目初始化。

OCR识别整体流程:网站提供一个图片上传入口,用户将识别后的图片上传后,网站后台在1~2秒后返回图片的识别结果,效果如下:
s
页面整体布局

Snipaste_2022-05-15_15-16-03

文字识别中页面:

Snipaste_2022-05-15_15-16-52

OCR识别完成:

Snipaste_2022-05-15_15-17-54

一,Django项目初始化

  • 1.1,检查 Django 环境
python -m django --version

若终端显示版本号,未出现 No module named django,即可证明已安装成功~,Django安装方法参考以下连接

https://docs.djangoproject.com/zh-hans/4.0/

image-20220209223116949

  • 1.2 创建 Django 项目

在 Django 框架中,项目中每个模块叫 app,每个 app 负责一个模块功能,例如博客中的评论模块;所有 app 组合在一起形成整个项目 project,因此首先,创建一个项目 dlIntegrated(命名随意)

django-admin startproject dlIntegrated
  • 创建后目录树形结构如下
dlIntegrated│  manage.py│└─dlIntegratedasgi.pysettings.pyurls.pywsgi.py__init__.py

cd 到 manage.py 同级的目录下,终端运行

 python manage.py runserver

终端无报错,浏览器输入 http:\localhost:8080,进入 django 初始化页面,即可代表 django 启动成功

image-20220210131212194

  • 1.3,创建 app

cd 到与 manage.py 同级的目录下,输入以下命令:

 python manage.py startapp paddleApp

运行成功后,目录树结构如下:

│  manage.py
│
├─dlIntegrated
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─__pycache__
│          settings.cpython-37.pyc
│          __init__.cpython-37.pyc
│
└─paddleApp│  admin.py│  apps.py│  models.py│  tests.py│  views.py│  __init__.py│└─migrations__init__.py
  • 1.4,配置dlIntegrated/setting.py配置项,连接数据库,连接App等

找到 DATABASES

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','USER':'root','HOST':'localhost','NAME':'dl_intergate','PASSWORD':'root','TIME_ZONE':'Asia/Shanghai'}
}

找到 INSTALLED_APPS,加入app选项paddleApp.apps.PaddleappConfig(根据自己项目调整)

INSTALLED_APPS = ['paddleApp.apps.PaddleappConfig','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]

二,安装 PaddleOCR

之前介绍 PaddleOCR 时,需要经过Github 代码仓库拉项目、配环境、写demo一系列步骤,然后才能正常使用;PaddleOCR 项目源于百度,经过多次迭代后目前已经被封装为一个Python库,安装时借助 pip 工具即可

  • 2.1,pip 安装 PaddleOCR:
# GPU版本
python3 -m pip install paddlepaddle-gpu# CPU版本
python3 -m pip install paddlepaddle

需要注意的是,如果项目用GPU版本时,需要保证 GPU 环境配置好,例如 CUDA、Cudnn等

  • 2.2,安装 PaddleOCR Whl 包
pip install "paddleocr>=2.0.1" # Recommend to use version 2.0.1+

安装 paddleocr 时可能会报错,这里我记录了我配置时遇到的一些错误(Windows 环境),有遇到相同错误的可以参考下:“basetsd.h”: No such file or directory,LINK : fatal error LNK1158: 无法运行“rc.exe”报错

三,Django完善视图,url模块

  • 3.1,views 视图中实现识别核心模块:
def ocr_detect(filePath:str):'''orc识别'''print("filePath is ",filePath)ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # need to run only once to download and load model into memoryresult = ocr.ocr(filePath, cls=True)result_list = result(path,fileName) = os.path.split(filePath)image = Image.open(filePath).convert('RGB')boxes = [line[0] for line in result]txts = [line[1][0] for line in result]scores = [line[1][1] for line in result]im_show = draw_ocr(image, boxes, txts, scores, font_path='./template/fonts/Deng.ttf')im_show = Image.fromarray(im_show)im_show.save(os.path.join(path,"draw-"+fileName))
  • 3.2,在app 中的 urls.py 中定义 url 接口
# ProjectName/App/urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('upload-image',views.paddle_image_upload)]
  • 3.3 将app 中 API接口与项目链接
# ProjectName/urls.pyurlpatterns = [path('admin/', admin.site.urls),path('paddleApp/',include('paddleApp.urls'))
]

四,借助Vue对前端项目初始化

  • 4.1,这里借助的是 Vue 脚手架,为了提交开发效率借助 Element-Plus 组件库,项目的结构树如下:
│  .gitignore
│  babel.config.js
│  jsconfig.json
│  list.txt
│  package-lock.json
│  package.json
│  README.md
│  tsconfig.json
│  vue.config.js
├─public
│      favicon.ico
│      index.html
│      
└─src│  App.vue│  main.ts│  router.ts│  shims-vue.d.ts│  ├─assets│      logo.png│      ├─components│      HelloWorld.vue│      └─page└─paddletextOcrPage.vue
  • 4.2,router.ts 定义前端路由
import {createRouter,createWebHashHistory} from 'vue-router'const routes = [{path: '/paddle-ocr',component:()=> import('@/page/paddle/textOcrPage.vue')}
]const router = createRouter({history:createWebHashHistory(),routes
})export default router;
  • 4.3,在配置文件vue.conf.js中定义方向代理,解决跨域问题
module.exports = defineConfig({transpileDependencies: true,devServer: {proxy:{'/api':{target: 'http://localhost:8089',pathRewrite: {'^/api':'',changeOrigin: true}}},port: 8083},// chainWebpack: config => {//   // 处理ts文件 (新增loader)//   config.module.rule('ts').use('te-loader').end()// }
})
  • 4.4,在vue脚本实现页面布局,上传组件实现,上传逻辑编写(以下为部分代码)
<div v-loading="loading" :element-loading-text="loadingText" element-loading-background="rgba(122, 122, 122, 0.8)"><div  style="border:1px solid black"><h1>文本 OCR 在线识别接口</h1></div><div style="margin-top:100px"><el-uploadclass="avatar-uploader"action="/api/paddleApp/upload-image":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"><img v-if="imageUrl" :src="imageUrl" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus></Plus></el-icon></el-upload><el-card shadow="never"><template #header><div class="card-header"><span>OCR 识别结果</span></div></template><div style="text-align: center;font-size: 20px;color:royalblue" v-for="o in resultText" :key="o" class="text item">{{o[1][0] ?o[1][0]:'' }}</div></el-card></div>
</div>
</template><script lang="ts" setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import type { UploadProps } from 'element-plus'const imageUrl = ref('')
const resultText = ref('')
const loading = ref(false)
const loadingText = ref('识别中,请耐心等待')const handleAvatarSuccess: UploadProps['onSuccess'] = (response,uploadFile
) => {const resultData = response.dataresultText.value = resultData.resultimageUrl.value = URL.createObjectURL(uploadFile.raw!)loading.value =false}
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {if (!(rawFile.type === 'image/jpeg' || rawFile.type === 'image/png')) {ElMessage.error('Avatar picture must be JPG format!')return false} else if (rawFile.size / 1024 / 1024 > 2) {ElMessage.error('Avatar picture size can not exceed 2MB!')return false}loading.value = truereturn true
}
</script>

五,小结

好了,以上就是本篇文章的全部内容了,本文涉及的内容知识较多,适合收藏下来慢慢吸收:😛,由于 Python 语言也有自身的局限性,因此在项目中引入 Vue、JS等作为前端界面实现,搭建一个前后端分离网站

这里在项目中引入了 OCR图片 识别功能,后面将会计划把一些其它功能加进来,例如Excel上传,读写;图像分割,经纬度转换等,带大家一起来完善这个项目

最后,项目源码获取方式,关注微信公号:小张Python 后台回复关键字:dl_interated 即可

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

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

相关文章

写一个简单的网站首页,初识 CSS 中 Flex 布局

之前一直用 VUE 写后台管理界面&#xff0c;对前端 CSS 这块一直是半知半解&#xff0c;为了巩固这方便知识&#xff0c;抽空写一些基础页面来巩固一下 今天带来的是一个简单的网站首页&#xff0c;源于《深入解析CSS》中的案例&#xff0c;首页做了简单的自适应&#xff0c;但…

印象笔记如何分享链接_杭州诠网科技分享seo优化如何做好网站的反向链接

几乎所有的网站管理员都希望自己的网站能够在百度、谷歌和其他搜索引擎中排名靠前。因为在搜索引擎排名靠前可以给网站带来很多新客户&#xff0c;这有利于网站产品或服务的营销和网站品牌的提升。虽然我们还没有找到一个神奇的公式来提高网站在搜索引擎中的排名。但是很多例子…

linux网站宝塔无法访问ipv6,centos7宝塔面板服务器开启纯IPV6访问

随着互联网世界日新月异的发展&#xff0c;ipv6好像已经成为一种必不可少的趋势&#xff0c;但是当前国内机房大部分还不能支持ipv6&#xff0c;腾讯云亦如此。同时&#xff0c;现在有部分程序在服务器上运行的时候&#xff0c;需要服务器能监听一个ipv6地址才行&#xff0c;因…

【伸手党福利】【第一弹】jeecg-boot前端主要更改位置(网站标题栏图标、logo、登录后的logo、显示的标题文字、用户头像)

【伸手党请光看标题】 网站标题栏图标 位置 ant-design-vue-jeecg\public\index.html 1、index.html标题在head第9行替换掉&#xff0c;然后复制ico到/public <link rel"shortcut icon" href"<% BASE_URL %>favicon.ico" type"image/x-ic…

关于百度机器人搜索你网站的页面权限设置

百度robots.txt上加 User-agent: * Disallow: / 这可能涉及到公司的网站是否存在信息泄露的风险

git 在线学习网站

Learn Git Branchinghttps://learngitbranching.js.org/?NODEMO&localezh_CN

在线测试键盘网站

在线键盘测试 | zFrontier 装备前线键盘测试工具&#xff0c;在线使用&#xff0c;无需下载&#xff0c;快速检测键盘好坏&#xff0c;兼容各种配列机械键盘、客制化键盘、薄膜键盘https://www.zfrontier.com/lab/keyboardTester

在线 YAML 转 Properties 网站

在线YAML转Properties工具- ToolTT在线工具箱https://tooltt.com/yaml2properties/

revel MySQL_使用Revel(go)开发网站

Revel很好的利用了Go语言的goroutine&#xff0c;把每一个request都分配到了goroutine里。不用再写一大堆的回调。如果你写过nodejs的话就会深刻的体会到callback hell是什么样子的。正是由于Revel有了goroutine&#xff0c;Revel的性能也有了很大的提升。官网号称请求的吞吐量…

SEO研究:网站结构

在衡量所有权重之间&#xff0c;网站结构大概占到30%&#xff0c;这也是很多网站排名不好&#xff0c;或者有站长根本不用优化就能获得很好排名的原因。说到结构必须明白两个概念&#xff0c;一个是物理概念,就是文件存放的路径&#xff0c;另一个是逻辑结构。比较好的情况是逻…

c 获取网站服务器时间,c 获取服务器的时间

c 获取服务器的时间 内容精选换一换当NTP服务器异常时产生该告警。当NTP服务器异常消除时&#xff0c;该告警恢复。主OMS节点配置的NTP服务器异常&#xff0c;可能会导致主OMS节点与外部服务器不能同步时间&#xff0c;集群时间可能会产生飘移。NTP服务器网络异常。与NTP服务器…

Silverlight SEO优化

Silverlight SEO优化SEO优化 2008年10月份&#xff0c;微软发布了针对Silverlight应用程序进行搜索引擎优化的指导文档&#xff0c;该文档描述了对Silverlight应用程序进行搜索 引擎优化一些最佳实践。这些实践知识可以帮助开发人员将他们开发的基于Silverlight的内容能够出现在…

[Python爬虫]模拟登陆**查网站

这是一篇使用Python模拟登陆##查网站的详细介绍&#xff0c;##查网站上有许多的企业信息&#xff0c;因此抓取##查数据十分重要&#xff0c;本文使用selenium模拟登陆##查网站。 其实我之前就想写这个python模拟登录网站的&#xff0c;因为之前爬虫用的时候感觉还挺好用的&…

ansi c++ 标准 电子书_如何最快速地转换电子书的格式?最全的格式转换网站集合!...

将如果你喜欢看电子书&#xff0c;那么电子书的文件格式就是你必须了解的。不同的电纸书、不同的阅读应用能打开和编辑的电子书格式是不同的&#xff0c;对于使用kindle 的小伙伴来说&#xff0c;EPUB 电子书就是无法使用的&#xff0c;而mobi、azw3 等格式就是显示效果最好的。…

vue seo关键词设置_百度SEO关键词排名规则详解

搜索引擎的作用都是为了用户能够快速地检索信息&#xff0c;但各大搜索引擎平台的SEO关键词排名规则却不尽相同&#xff0c;由此也形成了各平台搜索易用性及SEO策略之间的较大差异。以下以国内市场份额最大的百度搜索为例&#xff0c;详尽分析其关键词排名规则及最新的SEO策略。…

网络连接异常、网站服务器失去响应_服务器一直被攻击怎么办?

有很多人问说&#xff0c;网站一直被攻击&#xff0c;什么被挂马&#xff0c;什么被黑&#xff0c;每天一早打开网站&#xff0c;总是会出现各种各样的问题&#xff0c;这着实让站长们揪心。从修改服务器管理账号开始&#xff0c;到修改远程端口&#xff0c;什么措施都做了&…

网站部署到IIS上如何进行调试

在一个网站成功部署后&#xff0c;有时候可能会遇到一些错误&#xff0c;但又不能一眼看出错误源&#xff0c;如果能在源程序里下断点进行调试就好了&#xff0c;这样就能准确的找出错误代码。 下面就跟大家说说如何在一个已经部署了的网站上进行断点调试&#xff08;前提 有网…

使用pp架构形成计算机集群请求的地址无效_分布式之大型网站架构学习笔记

学习笔记1、大型网站架构的发展史(红字就是每一步发展历程的关键)(1)从一个小网站发展起来&#xff0c;一台服务器&#xff0c;应用程序、数据库、文件等所有资源都在一台服务器上(2)网站业务的发展&#xff0c;一台服务器逐渐不能满足需求&#xff0c;因此要将应用和数据分离&…

网站会员整合ucenter 实现多站点同步登录方法(转)

之前简单的写过一篇的用户注册整合ucenter的文章&#xff0c;因为写的很简洁&#xff0c;很多童鞋都看的不是很明白&#xff0c;也收到了很多童鞋的问题邮件。前几天因为公司的几个 网站需要做同步登录功能&#xff0c;因此就用到了ucenter作为中间桥梁。现在很多开源的cms系统…

十大抢手的网站压力测试工具

两天&#xff0c;jnj在本站发布了《如何在低速率网络中测试 Web 应用》&#xff0c;那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&#xff0c;这样&#xff0c;你就可以知道你的服务器以及你的WEB应用能够顶得住多少的并发量&#xff0c;以…