PaddleOCR + Django 实现一个OCR在线识别网站,一起来玩呀

本文涉及的产品
个人证照识别,个人证照识别 200次/月
教育场景识别,教育场景识别 200次/月
通用文字识别,通用文字识别 200次/月
简介: 除了PaddleOCR之外,之前还介绍过一些其它好玩的开源项目,例如老照片修复 Bringing-Old-Photos-Back-to-Life 、黑白照片上色DeOldify 。因此,最近准备启动一个项目,做一个在线网站,将之前一些好玩的功能都陆续集成在这个网站中

PaddleOCRBringing-Old-Photos-Back-to-Life  DeOldify线

OCRPaddleOCR使DjangoElement-PLus+VueDjangoMySQL


OCR1~2


微信图片_20220520102519.gif

微信图片_20220520102525.png

微信图片_20220520102529.png

OCR

微信图片_20220520102533.png

Django


  • 1.1Django
python -m django --version


Nomodulenameddjango~Django


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

微信图片_20220520102657.png

  • 1.2Django

Djangoappappappproject  dlIntegrated()


django-admin startproject dlIntegrated
dlIntegrated
    │  manage.py
    └─dlIntegrated
            asgi.py
            settings.py
            urls.py
            wsgi.py
            __init__.py


cdmanage.py

python manage.py runserver


http:\localhost:8080djangodjango

微信图片_20220520102541.png

  • 1.3app

cdmanage.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.4dlIntegrated/setting.pyApp

DATABASES

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


INSTALLED_APPSapppaddleApp.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


PaddleOCRGithubdemo使PaddleOCRPythonpip

  • 2.1pipPaddleOCR
# GPU版本
python3 -m pip install paddlepaddle-gpu
# CPU版本
python3 -m pip install paddlepaddle


GPUGPUCUDACudnn

  • 2.2PaddleOCRWhl
pip install <span data-raw-text="" "="" data-textnode-index-1652755033716="149" data-index-1652755033716="2372" class="character">"paddleocr>=2.0.1<span data-raw-text="" "="" data-textnode-index-1652755033716="149" data-index-1652755033716="2389" class="character">" # Recommend to use version 2.0.1+


paddleocrWindowshttps://blog.csdn.net/weixin_42512684/article/details/124783499?spm=1001.2014.3001.5501


Djangourl


  • 3.1views
def ocr_detect(filePath:str):
    '''
     orc识别
    '''
    print(<span data-raw-text="" "="" data-textnode-index-1652755033716="165" data-index-1652755033716="2672" class="character">"filePath is <span data-raw-text="" "="" data-textnode-index-1652755033716="165" data-index-1652755033716="2685" class="character">",filePath)
    ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # need to run only once to download and load model into memory
    result = 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,<span data-raw-text="" "="" data-textnode-index-1652755033716="211" data-index-1652755033716="3254" class="character">"draw-<span data-raw-text="" "="" data-textnode-index-1652755033716="211" data-index-1652755033716="3260" class="character">"+fileName))


  • 3.2appurls.pyurl
# ProjectName/App/urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('upload-image',views.paddle_image_upload)
]


  • 3.3appAPI
# ProjectName/urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('paddleApp/',include('paddleApp.urls'))
]


Vue


  • 4.1VueElement-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
        └─paddle
                textOcrPage.vue


  • 4.2router.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.3vue.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.4vue()
<div v-loading=<span data-raw-text="" "="" data-textnode-index-1652755033716="356" data-index-1652755033716="4821" class="character">"loading<span data-raw-text="" "="" data-textnode-index-1652755033716="356" data-index-1652755033716="4829" class="character">" :element-loading-text=<span data-raw-text="" "="" data-textnode-index-1652755033716="358" data-index-1652755033716="4853" class="character">"loadingText<span data-raw-text="" "="" data-textnode-index-1652755033716="358" data-index-1652755033716="4865" class="character">" element-loading-background=<span data-raw-text="" "="" data-textnode-index-1652755033716="360" data-index-1652755033716="4894" class="character">"rgba(122, 122, 122, 0.8)<span data-raw-text="" "="" data-textnode-index-1652755033716="360" data-index-1652755033716="4919" class="character">">
        <div  style=<span data-raw-text="" "="" data-textnode-index-1652755033716="368" data-index-1652755033716="4941" class="character">"border:1px solid black<span data-raw-text="" "="" data-textnode-index-1652755033716="368" data-index-1652755033716="4964" class="character">">
            <h1>
                文本 OCR 在线识别接口
            </h1>
        </div>
        <div style=<span data-raw-text="" "="" data-textnode-index-1652755033716="389" data-index-1652755033716="5061" class="character">"margin-top:100px<span data-raw-text="" "="" data-textnode-index-1652755033716="389" data-index-1652755033716="5078" class="character">">
            <el-upload
                class=<span data-raw-text="" "="" data-textnode-index-1652755033716="397" data-index-1652755033716="5124" class="character">"avatar-uploader<span data-raw-text="" "="" data-textnode-index-1652755033716="397" data-index-1652755033716="5140" class="character">"
                action=<span data-raw-text="" "="" data-textnode-index-1652755033716="401" data-index-1652755033716="5164" class="character">"/api/paddleApp/upload-image<span data-raw-text="" "="" data-textnode-index-1652755033716="401" data-index-1652755033716="5192" class="character">"
                :show-file-list=<span data-raw-text="" "="" data-textnode-index-1652755033716="405" data-index-1652755033716="5225" class="character">"false<span data-raw-text="" "="" data-textnode-index-1652755033716="405" data-index-1652755033716="5231" class="character">"
                :on-success=<span data-raw-text="" "="" data-textnode-index-1652755033716="409" data-index-1652755033716="5260" class="character">"handleAvatarSuccess<span data-raw-text="" "="" data-textnode-index-1652755033716="409" data-index-1652755033716="5280" class="character">"
                :before-upload=<span data-raw-text="" "="" data-textnode-index-1652755033716="413" data-index-1652755033716="5312" class="character">"beforeAvatarUpload<span data-raw-text="" "="" data-textnode-index-1652755033716="413" data-index-1652755033716="5331" class="character">">
            <img v-if=<span data-raw-text="" "="" data-textnode-index-1652755033716="421" data-index-1652755033716="5355" class="character">"imageUrl<span data-raw-text="" "="" data-textnode-index-1652755033716="421" data-index-1652755033716="5364" class="character">" :src=<span data-raw-text="" "="" data-textnode-index-1652755033716="425" data-index-1652755033716="5371" class="character">"imageUrl<span data-raw-text="" "="" data-textnode-index-1652755033716="425" data-index-1652755033716="5380" class="character">" class=<span data-raw-text="" "="" data-textnode-index-1652755033716="429" data-index-1652755033716="5388" class="character">"avatar<span data-raw-text="" "="" data-textnode-index-1652755033716="429" data-index-1652755033716="5395" class="character">" />
            <el-icon v-else class=<span data-raw-text="" "="" data-textnode-index-1652755033716="439" data-index-1652755033716="5433" class="character">"avatar-uploader-icon<span data-raw-text="" "="" data-textnode-index-1652755033716="439" data-index-1652755033716="5454" class="character">"><Plus></Plus></el-icon>
            </el-upload>
            <el-card shadow=<span data-raw-text="" "="" data-textnode-index-1652755033716="460" data-index-1652755033716="5531" class="character">"never<span data-raw-text="" "="" data-textnode-index-1652755033716="460" data-index-1652755033716="5537" class="character">">
                 <template #header>
                   <div class=<span data-raw-text="" "="" data-textnode-index-1652755033716="474" data-index-1652755033716="5605" class="character">"card-header<span data-raw-text="" "="" data-textnode-index-1652755033716="474" data-index-1652755033716="5617" class="character">">
                   <span>OCR 识别结果</span>
                   </div>
                 </template>
                 <div style=<span data-raw-text="" "="" data-textnode-index-1652755033716="498" data-index-1652755033716="5746" class="character">"text-align: center;font-size: 20px;color:royalblue<span data-raw-text="" "="" data-textnode-index-1652755033716="498" data-index-1652755033716="5797" class="character">" v-for=<span data-raw-text="" "="" data-textnode-index-1652755033716="502" data-index-1652755033716="5805" class="character">"o in resultText<span data-raw-text="" "="" data-textnode-index-1652755033716="502" data-index-1652755033716="5821" class="character">" :key=<span data-raw-text="" "="" data-textnode-index-1652755033716="506" data-index-1652755033716="5828" class="character">"o<span data-raw-text="" "="" data-textnode-index-1652755033716="506" data-index-1652755033716="5830" class="character">" class=<span data-raw-text="" "="" data-textnode-index-1652755033716="510" data-index-1652755033716="5838" class="character">"text item<span data-raw-text="" "="" data-textnode-index-1652755033716="510" data-index-1652755033716="5848" class="character">">{{o[1][0] ?o[1][0]:'' }}</div>
            </el-card>
          </div>
</div>
</template>
<script lang=<span data-raw-text="" "="" data-textnode-index-1652755033716="533" data-index-1652755033716="5948" class="character">"ts<span data-raw-text="" "="" data-textnode-index-1652755033716="533" data-index-1652755033716="5951" class="character">" 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.data
  resultText.value = resultData.result
  imageUrl.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 = true
  return true
}
</script>



:😛PythonVueJS

OCRExcel

相关文章
|
23天前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
2月前
|
文字识别
印刷文字识别使用问题之是否支持非标发票的识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
存储 文字识别 运维
印刷文字识别使用问题之如何开通统一识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
文字识别 容器
印刷文字识别使用问题之是否支持医疗检测报告识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
人工智能 文字识别 开发工具
印刷文字识别使用问题之是否支持识别并返回文字在图片中的位置信息
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
人工智能 JSON 文字识别
印刷文字识别使用问题之如何数电发票进行识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
文字识别 数据安全/隐私保护 iOS开发
印刷文字识别使用问题之如何识别礼品册上的卡号、密码信息
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
机器学习/深度学习 文字识别 API
印刷文字识别使用问题之是否支持识别香港和澳门食品经营许可证
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
2月前
|
文字识别 开发工具
印刷文字识别使用问题之是否支持识别手写体
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
印刷文字识别使用问题之是否支持识别手写体
|
2月前
|
文字识别 API 数据处理
印刷文字识别使用问题之对于带钢印的VIN图片如何提高识别准确率
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。