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


    1、概述

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

    f369e3e0f88e493fe6a08675402eed8f.jpeg

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

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

    0bcd8ddbf9d74db8b7da54a3b338211a.png

     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服务
    1. # coding:utf-8
    2. from flask import Flask
    3. from flask import jsonify
    4. from flask import request
    5. import paddlehub as hub
    6. import cv2
    7. import numpy as np
    8. import base64
    9. app = Flask(__name__)
    10. @app.route("/api/ocr",methods=["POST"])
    11. def ocr():
    12. try:
    13. image_str = request.json.get("image")
    14. image_np = np.fromstring(base64.b64decode(image_str.split(';base64,')[1]), dtype=np.uint8)
    15. image_array = cv2.imdecode(image_np, cv2.IMREAD_COLOR)
    16. result = []
    17. #if is_blurry(image_array):
    18. #print("chpp")
    19. 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)
    20. #else:
    21. #print("mobile")
    22. #result = mobile_ocr.recognize_text(images=[image_array], box_thresh= 0.1, text_thresh= 0.1, angle_classification_thresh=0.9)
    23. data = [i["text"] for i in result[0]["data"]]
    24. return jsonify({"code":200,"data":data})
    25. except Exception as e:
    26. return jsonify({"code":400,"data":str(e)})
    27. def is_blurry(image_array):
    28. gray = cv2.cvtColor(image_array, cv2.COLOR_BGR2GRAY)
    29. fm = cv2.Laplacian(gray, cv2.CV_64F).var()
    30. print("blurry:" + str(fm))
    31. return fm < 550
    32. if __name__ == '__main__':
    33. global mobile_ocr
    34. global chpp_ocr
    35. mobile_ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
    36. print("加载mobile模型完成")
    37. chpp_ocr = hub.Module(name="ch_pp-ocrv3")
    38. print("加载chpp模型完成")
    39. app.config['JSON_AS_ASCII'] = False
    40. app.run(host="0.0.0.0", port=5000)
    • 运行服务

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

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

    • 接口测试

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

    22454ef230ef44d7966a4b2d232f3fb6.png

     

     

     

  • 相关阅读:
    【Linux】 uptime命令使用
    9 开源鸿蒙OpenHarmony上电的第一行代码,boot代码简述
    C++ list 的使用
    1、自然语言和单词的分布式表示(上)
    如何提高面试的成功率--校招
    Xylan-PEG-NHS|木聚糖-聚乙二醇-琥珀酰亚胺
    Docker启动特权容器
    【自然语言处理之语言模型】讲解
    iOS15.6 Beta 4如何更新 iOS15.6 Beta 4更新升级方法
    新概念英语(第二册)复习——Lesson 6 - Lesson10
  • 原文地址:https://blog.csdn.net/m0_43432638/article/details/127987027