• 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

     

     

     

  • 相关阅读:
    超级简单学习Shiro会话管理
    Obsidian Publish的开源替代品Perlite
    Redis之主从复制,哨兵模式,集群
    内存操作函数(memcpy、memmove、memset、memcmp)---- C语言
    渐变圆角边框css
    【Spring容器的启动过程】
    K8S:Pod
    stm32 用定时器的编码器模式来检测正反转
    unity-协程详解
    【红包雨接口设计】
  • 原文地址:https://blog.csdn.net/m0_43432638/article/details/127987027