python基于OCR深度学习实现商品配料表识别

news2025/1/22 19:34:16

1、概述

        当前人民和国家对食品安全十分重视,但商家为了保证食品长时间储存,味道鲜美,在食品中添加超量或对人有严重危害得食品添加剂,严重危害到人民的安全,我们以方便面为例,一包方便面最多可有25种食品添加剂,常见的有谷氨酸钠、焦糖色、柠檬酸、特丁基对苯二酚等。儿童长期食用含柠檬酸的产品,可能导致低钙血症。所以在选择食品时,尽量选择优质、信誉好的大厂家生产的食品。并且要学会看食品配料表,尽量买食品添加剂少的食品。

        我就当前热点话题,对食品配料识别进行了研究和实现,目前调研常用的几个开源的OCR识别模型主要有几个如下表所示,简单说一下各个模型的优缺点,paddleocr用起来很方便是国产识别模型(baidu搞得),只需要用python安装对应模块即可,而且识别速度和效果是这几个中最好的(个人感觉),而且可以更换不同级别的模型,例如服务器级别的chinese_ocr_db_crnn_server、和手机端级别的chinese_ocr_db_crnn_mobile等。chineseocr_lite也是一个轻量级的识别模型但是相对比于paddleocr来说再复杂的识别场景下识别速度和效果没有paddleocr好其他的就不提了。

OCR模型
名称地址
paddleocrPaddleHub一键OCR中文识别(超轻量8.1M模型,火爆) - 飞桨AI Studio
chineseocr_liteGitHub - DayBreak-u/chineseocr_lite: 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M
chineseocrGitHub - chineseocr/chineseocr: yolo3+ocr
easyocrpip install easyocr

        传统OCR模型识别流程主要就是两个步骤:文字位置识别+文字识别,传统识别模型使用ctpn文本检测+crnn文本识别,在chineseocr_lite模型中使用yolov3+crnn实现。

 2、Docker+Flask搭建PaddleOCR识别环境

  • 基础环境搭建

# docker安装python

docker pull python:3.8.12

# 安装后创建服务环境

docker run  -dit -p 13000:5000 docker.io/python:3.8.12 --name api_server

# 进入环境

docker exec -it 5eba0c1402bc /bin/bash

  • 相关模块搭建

# 安装编译环境

apt-get update && apt-get install libgl1

apt install vim

# 安装paddleOCR

pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple

  • 搭建Falsk服务
# coding:utf-8
from flask import Flask
from flask import jsonify
from flask import request
import paddlehub as hub
import cv2
import numpy as np
import base64
app = Flask(__name__)

@app.route("/api/ocr",methods=["POST"])
def ocr():
    try:
        image_str = request.json.get("image")
        image_np = np.fromstring(base64.b64decode(image_str.split(';base64,')[1]), dtype=np.uint8)
        image_array = cv2.imdecode(image_np, cv2.IMREAD_COLOR)
        result = []
        #if is_blurry(image_array):
            #print("chpp")
        result = chpp_ocr.recognize_text(images=[image_array], box_thresh= 0.1, text_thresh= 0.1, angle_classification_thresh=0.9, det_db_unclip_ratio=1.5)
        #else:
            #print("mobile")
            #result = mobile_ocr.recognize_text(images=[image_array], box_thresh= 0.1, text_thresh= 0.1, angle_classification_thresh=0.9)
        data = [i["text"] for i in result[0]["data"]]
        return jsonify({"code":200,"data":data})
    except Exception as e:
        return jsonify({"code":400,"data":str(e)})

def is_blurry(image_array):
    gray = cv2.cvtColor(image_array, cv2.COLOR_BGR2GRAY)
    fm = cv2.Laplacian(gray, cv2.CV_64F).var()
    print("blurry:" + str(fm))
    return fm < 550

if __name__ == '__main__':
    global mobile_ocr
    global chpp_ocr
    mobile_ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
    print("加载mobile模型完成")
    chpp_ocr = hub.Module(name="ch_pp-ocrv3")
    print("加载chpp模型完成")
    app.config['JSON_AS_ASCII'] = False
    app.run(host="0.0.0.0", port=5000)
  • 运行服务

创建一个服务启动脚本如下使用nohup进行启动

nohup python api_server.py  > log.log 2>&1 &

  • 接口测试

使用apipost测试软件进行接口测试,发送数据类型是json字符串,传入image的base64字符即可。

 

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

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

相关文章

十年开发老手,深度解析企业用人标准为何越来越高?!

涛哥作为一个10多年的开发老手&#xff0c;经历过很多场面试&#xff0c;也面试过很多人&#xff0c;这么多年下来&#xff0c;切身体会到企业的用人标准越来越高&#xff0c;企业对开发工程师的要求也越来越"过分"。所以涛哥今天就借此机会&#xff0c;我们一起来分…

如何制定有效的项目计划,提高团队执行力

项目风险来源有很多&#xff0c;项目日程紧张&#xff0c;导致质量下降风险上升&#xff1b;甲方变更&#xff0c;管理者对变动控制不足&#xff1b;项目太大。 虽然从来不可能完全消除项目风险&#xff0c;但可以将危害减到最小。 一、确认项目计划 项目计划是一个项目启动…

SpringBoot读取properties中配置的List集合

实体类 Data NoArgsConstructor AllArgsConstructor Accessors(chain true) public class Person {private String name;private String age;private String content; } Component//将该类交由Spring管理 ConfigurationProperties(prefix "project") //自定义.pro…

【附源码】计算机毕业设计JAVA演唱会购票系统

【附源码】计算机毕业设计JAVA演唱会购票系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA myba…

听我一句劝好吗?放下那些老掉牙的性能优化笔记吧!又不是没有新的,跟不上时代的学了也没法直接用呀!

性能概述 公司投入人力物力成本开发出的程序&#xff0c;如果出现程序瘫痪、界面停顿、抖动、响应迟缓等问题&#xff0c;会大大降低用户体验&#xff0c;损失大量用户。对于上述问题&#xff0c;都是需要性能调优来解决的问题。 程序性能主要表现在代码的执行速度、软件系统…

数据结构之快速排序(重点)

快速排序 算法所需 一个基准点 左边是比其小的数&#xff0c;右边是比其大的数 先使所指的元素作为基准元素low 用一个piviot存储49 然后进行比遍历操作 就是high向左移动(high–)&#xff0c;到第一个比piviot小的元素进行一个data[low]data[high] 然后进行low&#xff0c;找…

基于最低水平面的三维装箱问题的启发式算法

⭐️ 前言 小编之前写过一篇博文&#xff1a;求解三维装箱问题的启发式深度优先搜索算法(python)&#xff0c;详述了基于空间选择的三维装箱算法。本文考虑了一个事实&#xff1a;在某些情况下&#xff0c;我们在摆放物品时&#xff0c;总是优先选择较低的平面&#xff0c;基于…

LIN通讯

LIN通讯 一、LIN通讯的背景与意义 随着汽车电子的发展&#xff0c;汽车上的电子零件正在逐渐地增加。而电子零件的增加也导致更多的设备&#xff08;传感器、执行器、电子控制器&#xff09;需要加入汽车的局部网络&#xff0c;这些零件的增加还会带来配线的增加&#xff0c;…

java-springboot基于机器学习得心脏病预测系统 的设计与实现-计算机毕业设计

项目介绍 基于机器学习得心脏病预测系统通过对机器学习心脏病数据大数据分析统计系统的建设以实现机器学习心脏病数据分析统计功能。通过对心脏疾病变化市场的充分研究&#xff0c;结合自身技术储备情况&#xff0c;设计并开发了一套基于SpringBoot后台框架、Mybaits数据库映射…

web课程设计网页规划与设计---公司网站(5页 带下拉菜单)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#…

动态规划算法学习二:最长公共子序列

文章目录前言一、问题描述二、DP实现1、最优子结构性质*****2、状态表示*****3、状态递归方程*****4、计算最优值*****5、代码实现&#xff1a;输出最长公共子序列6、代码实现&#xff1a;输出最优解前言 一、问题描述 列举X的所有子序列&#xff0c;然后检查它是否也是Y的子序…

Java设计模式很难吗,这篇带你熟悉设计模式

3.1 概述 可以发现&#xff0c;设计模式好像都是类似的。越看越感觉都着不多。其实都是类似面向接口编程的一种体现&#xff0c;只不过侧重点不一样或者说要体现的结果不一样。 3.2 使用场景 问题一&#xff1a;应对可能变化的对象实现 方案&#xff1a;间接创建 模式&…

pycharm远程连接服务器

遇到的问题&#xff1a; 在服务器上配环境 流程&#xff1a; 先安装anaconda&#xff08;去其官网下载个脚本文件到服务器上&#xff0c;然后启动脚本即可&#xff09; bash Anaconda3-5.3.1-Linux-x86_64.sh然后创建 python环境 conda create -n pytorch python3.10去pyt…

【Linux】搞懂进程地址空间

文章目录1、从程序地址空间开始1.1 在C/C中看到的地址实际是&#xff1f;1.2 感性理解虚拟地址空间2、进程地址空间2.1 进程地址空间是怎样被描述的&#xff1f;2.2 进程地址空间和内存的关系2.3 为什么需要进程地址空间&#xff1f;1、从程序地址空间开始 1.1 在C/C中看到的地…

并发:线程状态

java的线程状态分为六种 新建 NEW 当一个线程对象被创建&#xff0c;但是还没有调用start方法时处于新建状态 此时未与操作系统底层线程关联 可运行 RUNNABLE 调用了start方法&#xff0c;就会由新建进入可运行状态 此时与底层线程关联&#xff0c;由操作系统调度执行 &…

python就是学不会怎么办?

编程从来都不是只看&#xff0c;只照葫芦画瓢就能学会的学科要想学会&#xff0c;必须是要有你个人是思考的&#xff0c;学会掌握编程逻辑&#xff0c;在学的过程中想为什么这么写&#xff0c;应该怎么去实现这个功能&#xff0c;拆分为几步不断的实操练习才能让你真的掌握知识…

并发,并行,串行,同步,异步,进程,进程池,线程,线程池

并发&#xff0c;并行&#xff0c;串行&#xff0c;同步&#xff0c;异步&#xff0c;进程&#xff0c;进程池&#xff0c;线程&#xff0c;线程池 进程 什么是进程&#xff1a; 开发写的代码称之为程序&#xff0c;将程序运行起来&#xff0c;就是进程 进程是申请一块内存空…

vue中动态引入图片为什么要是require, 你不知道的那些事

相信用过vue的小伙伴,肯定被面试官问过这样一个问题:在vue中动态的引入图片为什么要使用require 有些小伙伴,可能会轻蔑一笑:呵,就这,因为动态添加src被当做静态资源处理了,没有进行编译,所以要加上require, 我倒着都能背出来… emmm… 乍一看好像说的很有道理啊,但…

Linux实现文件定期本地备份/异地备份/删除备份的脚本

一.背景 1.总会出出现环境上的数据丢失&#xff0c;在没有备份的情况下会非常的被动&#xff0c;不管是由于病毒还是人为的原因造成的程序、数据被删除&#xff0c;有时候后悔已经来不及&#xff0c;不如提前做到数据的备份&#xff0c;而异地备份也更加的保险一点。 2.数据备…

【Servlet】1:踏入JavaWeb的第一把钥匙

目录 第一章 | JavaWeb序章 | 章节概述 | JavaWeb项目运行流程 | 静态与动态资源 | Javaweb开发人员的三个任务 第二章 | HTTP网络协议 | 章节概述 | HTTP简介 | HTTP请求三要素 | HTTP请求包、响应包 | HTTP状态码 | HTTPS vs HTTP 本文章属于后端全套笔记的第三部…