PaddleOCR 识别表情包文字示例详解
作者:OldBirds 发布时间:2023-06-02 06:41:55
引言
最近在做个表情包的小程序,涉及到表情包搜索功能。我们上传表情包的时候,只有一张图,怎么搜索?这个时候我们想到就是将表情包的文字提取出来,作为搜索的内容。那么这就需要用到 ocr 技术了。
经过几个 ocr 的库的使用,小编强烈推荐使用 PaddleOCR,一款文本识别效果不输于商用的Python库!
对于 PaddleOCR 本文不会过多介绍,可自行搜索。重点是如何使用 PaddleOCR 解决我的问题。
安装 PaddleOCR
pip install paddlepaddle
pip install paddleocr
我这边安装后的版本:
paddleocr==2.5.0.3
paddlepaddle==2.3.1
在 macOS 安装后,项目运行报错报错,忘了截图,应该是与 setuptools 版本有关,解决方式:
pip install --upgrade setuptools==59.8.0
完成这些配置后,我们就可以愉快的玩耍了。
本地处理
import hashlib
import io
from PIL import Image
from paddleocr import PaddleOCR
def get_gif_pic_path(url):
'''下载图片,返回图片第一帧路径'''
response = requests.get(url)
filename = hashlib.md5(url.encode(encoding='utf-8')).hexdigest()
img = Image.open(io.BytesIO(response.content))
current = img.tell()
img_path = f'bqb/{filename}_{current}.png'
img.save(img_path)
return img_path
def ocr_get_gif_text_sec(url) -> str:
'''识别gif第一帧图片的文字'''
img_path = get_gif_pic_path(url)
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr(img_path, cls=True)
data = []
for item in result:
data.append(item[1][0])
return ",".join(data)
ocr_get_gif_text_sec('https://xxxxxx')
由于 gif 是个动图,所以我们需要取出图片的第一帧进行识别,get_gif_pic_path
实现了这个功能。ocr_get_gif_text_sec
从 gif 第一帧的图进行文字提取,返回的 result
是个数组,我们通过遍历进行提取出来。
提取 gif 图片的内容我们就完成了,两个函数的功能也比较简单。本文没做 gif 全部文字的提取,有兴趣可以挑战下。
在 flask 中处理
当我们想在上传图片的时候,进行对图片文字的处理怎么办?难道要将上传的图保存到路径再去识别么?这也是我在开发中遇到的一个问题,经过拆坑,答案是:不,你不需要。
思路:我们可以从表单中获取上传的图片的二进制,然后将这个二进制传给ocr.ocr()
,那么ocr.ocr()
支持这个类型么?经过查看此函数源码,我们可以让它支持。
将图片二进制转化为 nparray 类型即可。下面是这个过程的具体代码
from paddleocr import PaddleOCR
import numpy as np
import cv2
@app.route('/v1/upload_img', methods=['POST'])
def api_v1_upload_img():
if 'file' not in request.files:
return "no file part"
file = request.files['file']
if file.filename == '':
return "no selected file"
if file:
file_name = file.filename
# 获取图片的二进制
res = upload_image(bytes=file.read(), filename=file_name)
return res
else:
return "no file"
def upload_image(bytes, filename = None, mime_type = None):
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
## 核心步骤
np_arr = np.frombuffer(bytes, dtype=np.uint8)
img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
# 进行识别
result = ocr.ocr(img=img, cls=True)
ocr_result = []
for line in result:
ocr_result.append(line[1][0].strip())
img_content = ' '.join(ocr_result)
return img_content
在api_v1_upload_img
我们获取到图片二进制以及图片名,将这些作为参数传到upload_image
,在upload_image
中:
np_arr = np.frombuffer(bytes, dtype=np.uint8)
img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
上面两行代码是这个需求的核心突破点。
还有一点就是建议不要将此识别功能部署到性能差的机器上,并发一下,完全扛不住,默默的留下两行眼泪。
来源:https://juejin.cn/post/7133772101428707358


猜你喜欢
- B-Tree 索引不同的存储引擎也可能使用不同的存储结构,i如,NDB集群存储引擎内部实现使用了T-Tree结构存储这种索引,即使其名字是B
- 概述🌱记住日期是有点困难,但我们是程序员,使困难的事情更容易是我们唯一的工作,所以我们不记得日期为什么不自动化这个任务。在这篇文章中,我们将
- 前言最近空闲的时候看到了之前就关注的一个小站http://teahour.fm/,一直想把这里的音频都听一遍,可转眼间怎么着也有两年了,却什
- 前言简单的爬虫只有一个进程、一个线程,因此称为单线程爬虫。单线程爬虫每次只访问一个页面,不能充分利用计算机的网络带宽。一个页面最多也就几百K
- NumPy是一个关于矩阵运算的库,熟悉Matlab的都应该清楚,这个库就是让python能够进行矩阵话的操作,而不用去写循环操作。下面对nu
- 本文实例讲述了Python基于PyGraphics包实现图片截取功能的方法。分享给大家供大家参考,具体如下:先安安装PyGraphics包
- 我就废话不多说了,大家还是直接看代码吧~cmd := exec.Command("cmd") in := bytes.N
- 一、catplot函数catplot() 函数是 Seaborn 中一个非常有用的函数,它可以绘制分类变量的图形,并可以根据另一个或多个变量
- 简介这篇宏哥就带着小伙伴们分享一下如何连接模拟器(电脑版的虚拟手机),然后再安装一款APP-淘宝为例。一、appium+pycharm+连接
- 通过指定pandas.DataFrame和pandas.Series的index(下标),可以选择和获取行/列或元素的值。根据[]中指定的值
- 小鸟(image)游戏展示代码展示import pygame,syspygame.init()#初始化操作#保存窗口大小width,heig
- 前言日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开
- 在进行python的开发过程中一直倡导使用虚拟环境来进行项目隔离,这样不会因为python的包不同而导致各种问题,但是以往为了图省事简单,安
- 关于这个问题的解答,网络上有成千上万个版本,当然,出现问题的诱因不同,解决的途径也不同,所以我不排除其他解决此类问题的办法,但是这些办法都没
- 一般用 createProcessingInstruction 方法创建处理指令指定参数为 "xml","ve
- 遇到mysql ERROR 1045 这个问题搞了很久,自己记下来。方法是百度的,亲测有效。ERROR 1045 (28000): Acce
- 一、掩膜(mask)在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:数字图像处理中
- JavaScript 的历史虽短,但却发展迅速。最初NetScape开发了LiveScript语言,使得它的Navigator和W
- 统计在线人数是实时的吗?实现起来也比较简单,见下列代码:global.asa<SCRIPT LANGUAGE="V
- 本文实例讲述了PHP使用自定义key实现对数据加密解密的方法。分享给大家供大家参考,具体如下:客户端和服务端通信时,有个场景很常见,通过一个