【飞桨开发者说】陈千鹤,华中科技大学计算机科学与技术学院大一在读

任务背景

目前很多实用小工具都趋向收费模式,即使免费,不是功能不完整,就是有很多约束条件,在应用时效果无法达到我们的预期。于是我萌生一个想法:结合自己学习的计算机技术和开源的AI算法,尝试动手实现一些常用小工具,而不再仅依赖商业软件的限制。

机缘巧合,我了解到百度飞桨开源了OCR超轻量中英文识别模型,该模型才8.6M,对内存要求小,预测速度快,可以很方便的在CPU上实现模型预测,甚至可实现在手机上部署,于是我决定利用这个模型开发一个截图取字的任务。大体思路如下:

  • 第一步:截取需要识别的图像,作为模型输入。在截图过程中,需要实现鼠标框选区域截图,并将图片以数据流的形式在程序中使用,无需保存文件;

  • 第二步:利用飞桨OCR超轻量中英文识别模型进行预测,它的优势是模型小、精度高;

  • 第三步:将模型预测结果以.txt格式存储,并自动呈现内容。

在实现过程中关键点一是截图,二是对OCR模型的运用。从模型预测效果看,通过OCR模型识别出来的文本信息与源文本基本完全一致,如下图所示。

那什么是OCR呢?对于背景不熟悉的同学,在这里简单给大家背下书。

通常情况下,我们可以根据OCR的应用场景差异将其划分为专用OCR和通用OCR。

专用OCR是指对特定场景进行设计和优化,以达到最好的效果展示,比较典型的应用如:证件识别、车牌识别。

而通用OCR是指在更多、更复杂的场景下,可以拥有比较好的泛性。在这个过程中由于场景的不确定性,如:图片背景丰富、亮度不均衡、光照不均衡、残缺遮挡、文字扭曲、字体多样等等问题,都会给OCR识别会带来极大的挑战。

飞桨开源的OCR模型集成在PaddleHub中,通过chinese_text_detection_db_server或者chinese_text_detection_db_mobile两个OCR中文识别Module,可以实现一键文字识别。更多OCR原理可以参考如下链接:

https://aistudio.baidu.com/aistudio/projectdetail/507159

文字识别任务操作过程

重点来了,下面我将详细介绍下截图取字任务的操作过程,感兴趣的小伙伴可以一起试试。

第一步:图像截取,作为模型输入数据

Python中有很多可以实现截图的库或者函数,如:

  • Python调用windows API实现屏幕截图:灵活、速度快,但是写法繁琐、不跨平台;

  • 使用PIL的ImageGrab模块:速度慢,不太适合做即时截图;

  • Selenium截图:仅支持对Web(网页)截图。

但是上述三种方法仅能实现全屏截图或指定区域截图,而我们需要在鼠标框选范围截图,因此我采用重写PyQt5库的部分类实现截图功能。

PyQt5是一套Python绑定Digia QT5应用的框架,可用于Python 2和Python 3。PyQt5做为Python的一个模块,有620多个类和6000个函数和方法,是一个跨平台的工具包。可以运行在所有主流操作系统,如:UNIX、Windows、Mac OS。官网地址如下:

http://www.riverbankcomputing.co.uk/news。

想要实现鼠标框选范围截图,只需要把鼠标框选的起点和终点坐标传给Grab即可。那么如何获取鼠标框选的起点和终点呢?我们可以通过调用PyQt5并继承QWidget实现。

在代码演示前,先介绍下Qwidget的常用操作,如:点击鼠标、拖动&绘制截图框、释放鼠标,对应函数如下:

  • keyPressEvent(self, event):键盘响应函数

  • paintEvent(self, event):UI绘制函数

  • mousePressEvent(self, event):鼠标点击事件

  • mouseMoveEvent(self, event):鼠标移动事件

  • mouseReleaseEvent(self, event):鼠标释放事件

当然了,这部分有现成的轮子,可以直接使用,获取路径如下:

https://github.com/ianzhao05/textshot?u=5722964389&m=4508439520834016&cu=3655689037

class Snipper(QtWidgets.QWidget):def __init__(self, parent=None, flags=Qt.WindowFlags()):super().__init__(parent=parent, flags=flags)self.setWindowTitle("")self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Dialog)self.setWindowState(self.windowState() | Qt.WindowFullScreen)self.screen = QtGui.QScreen.grabWindow(QtWidgets.QApplication.primaryScreen(),QtWidgets.QApplication.desktop().winId(),)palette = QtGui.QPalette()palette.setBrush(self.backgroundRole(), QtGui.QBrush(self.screen))self.setPalette(palette)QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))self.start, self.end = QtCore.QPoint(), QtCore.QPoint()def keyPressEvent(self, event):if event.key() == Qt.Key_Escape:QtWidgets.QApplication.quit()return super().keyPressEvent(event)def paintEvent(self, event):painter = QtGui.QPainter(self)painter.setPen(Qt.NoPen)painter.setBrush(QtGui.QColor(0, 0, 0, 100))painter.drawRect(0, 0, self.width(), self.height())if self.start == self.end:return super().paintEvent(event)painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3))painter.setBrush(painter.background())painter.drawRect(QtCore.QRect(self.start, self.end))return super().paintEvent(event)def mousePressEvent(self, event):self.start = self.end = QtGui.QCursor.pos()self.update()return super().mousePressEvent(event)def mouseMoveEvent(self, event):self.end = QtGui.QCursor.pos()self.update()return super().mousePressEvent(event)def mouseReleaseEvent(self, event):if self.start == self.end:return super().mouseReleaseEvent(event)self.hide()QtWidgets.QApplication.processEvents()shot = self.screen.copy(QtCore.QRect(self.start, self.end))processImage(shot)QtWidgets.QApplication.quit()def processImage(img):buffer = QtCore.QBuffer()buffer.open(QtCore.QBuffer.ReadWrite)img.save(buffer, "PNG")pil_img = Image.open(io.BytesIO(buffer.data()))buffer.close()if __name__ == '__main__':QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)app = QtWidgets.QApplication(sys.argv)window = QtWidgets.QMainWindow()snipper = Snipper(window)snipper.show()sys.exit(app.exec_())

第二步:利用OCR模型进行预测,识别图片文字

在文字识别阶段,我使用飞桨OCR超轻量中英文识别模型。该模型同时支持中英文识别;支持倾斜、竖排等多种方向文字识别。值得推荐的是,当前该模型已经集成到飞桨PaddleHub中,通过预训练模型chinese_ocr_db_crnn_server或chinese_ocr_db_crnn_mobile即可实现一键预测。对于深度学习零基础的用户来讲,在操作上还是非常友好的。

更多OCR模型操作介绍可以参考如下链接:

https://www.paddlepaddle.org.cn/hub/scene/ocr

1. 将截取的图片传入模型。

import os
os.environ['HUB_HOME'] = "./modules"
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PIL import Image
import io
import sys
import numpy as np
import paddlehub as hubclass Snipper(QtWidgets.QWidget):def __init__(self, parent=None, flags=Qt.WindowFlags()):super().__init__(parent=parent, flags=flags)self.setWindowTitle("TextShot")self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Dialog)self.setWindowState(self.windowState() | Qt.WindowFullScreen)self.screen = QtGui.QScreen.grabWindow(QtWidgets.QApplication.primaryScreen(),QtWidgets.QApplication.desktop().winId(),)palette = QtGui.QPalette()palette.setBrush(self.backgroundRole(), QtGui.QBrush(self.screen))self.setPalette(palette)QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))self.start, self.end = QtCore.QPoint(), QtCore.QPoint()def keyPressEvent(self, event):if event.key() == Qt.Key_Escape:QtWidgets.QApplication.quit()return super().keyPressEvent(event)def paintEvent(self, event):painter = QtGui.QPainter(self)painter.setPen(Qt.NoPen)painter.setBrush(QtGui.QColor(0, 0, 0, 100))painter.drawRect(0, 0, self.width(), self.height())if self.start == self.end:return super().paintEvent(event)painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3))painter.setBrush(painter.background())painter.drawRect(QtCore.QRect(self.start, self.end))return super().paintEvent(event)def mousePressEvent(self, event):self.start = self.end = QtGui.QCursor.pos()self.update()return super().mousePressEvent(event)def mouseMoveEvent(self, event):self.end = QtGui.QCursor.pos()self.update()return super().mousePressEvent(event)def mouseReleaseEvent(self, event):if self.start == self.end:return super().mouseReleaseEvent(event)self.hide()QtWidgets.QApplication.processEvents()shot = self.screen.copy(QtCore.QRect(self.start, self.end))processImage(shot)QtWidgets.QApplication.quit()def processImage(img):buffer = QtCore.QBuffer()buffer.open(QtCore.QBuffer.ReadWrite)img.save(buffer, "PNG")pil_img = Image.open(io.BytesIO(buffer.data()))buffer.close()np_images = [np.array(pil_img)]results = ocr.recognize_text(images=np_images,  # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;use_gpu=False,  # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量output_dir='ocr_result',  # 图片的保存路径,默认设为 ocr_result;visualization=True,  # 是否将识别结果保存为图片文件;box_thresh=0.5,  # 检测文本框置信度的阈值;text_thresh=0.5)  # 识别中文文本置信度的阈值;text = []for result in results:data = result['data']save_path = result['save_path']for infomation in data:print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ',infomation['text_box_position'])text.append(str(infomation['text']) + '\n')print(text)

2. 加载预训练模型,进行预测。

if __name__ == '__main__':# 加载移动端预训练模型# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")# 服务端可以加载大模型,效果更好ocr = hub.Module(name="chinese_ocr_db_crnn_server")QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)app = QtWidgets.QApplication(sys.argv)window = QtWidgets.QMainWindow()snipper = Snipper(window)snipper.show()sys.exit(app.exec_())

从预测结果看,输出信息中每一行文字的置信度都达到了0.96以上,可见飞桨OCR模型的效果是非常棒的。

第三步:预测结果以.txt形式自动呈现。

    text = []for result in results:data = result['data']save_path = result['save_path']for infomation in data:print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ',infomation['text_box_position'])text.append(str(infomation['text']) + '\n')print(text)with open('data.txt', 'w') as f:for i in text:f.write(str(i))os.system(r'data.txt')

从模型预测效果看,通过OCR模型识别出来的文本信息与源文本基本完全一致。

相关参考

结果很有趣吧,大家也可以尝试识别其他图片信息,效果同样值得期待:)在科技的快速发展之下,基于OCR识别技术,则能实现图片文字信息的快速识别。它可以解决综合文字识别、视频文字识别、证件识别、票据识别、车牌Vin码识别、银行卡识别、云识别等多种费时费力的问题,使我们的生活更加便捷。

截图&OCR项目地址:

https://github.com/chenqianhe/screenshot_and_ocr

如果您想使用自定义数据训练超轻量模型,可以参考8.6M超轻量模型的打造方式,从PaddleOCR提供的基础算法库中选择适合自己的文本检测、识别算法,进行自定义的训练。PaddleOCR提供了详细的训练和模型串联指导:

https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/customize.md

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:703252161。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

更多PaddleOCR的应用方法,欢迎访问项目地址:

GitHub:

https://github.com/PaddlePaddle/PaddleOCR

Gitee:

https://gitee.com/PaddlePaddle/PaddleOCR

官网地址:

https://www.paddlepaddle.org.cn

飞桨开源框架项目地址:

GitHub:

https://github.com/PaddlePaddle/Paddle

Gitee:

https://gitee.com/paddlepaddle/Paddle

END

截屏就可以转文字?飞桨带您体验OCR超轻量中英文识别模型相关推荐

  1. 截屏快捷键(windows)自带截屏,不需要安装任何插件

    截屏快捷键(windows)自带截屏,不需要安装任何插件 方案一:电脑自带截屏,不需要QQ Shift+win+s即可截图(推荐使用) 方案二:搜狗输入法下载自带:Ctrl+Shift+x poste ...

  2. 百度BML飞桨训练营(十一)paddle-OCR车牌识别

    百度BML&飞桨训练营(十一)paddle-OCR车牌识别 第一步:配置Notebook 1.创建Notebook任务,点击配置 开发语言:Python3.7 AI框架:PaddlePaddl ...

  3. 百度BML飞桨训练营(五)商品种类识别

    百度BML&飞桨训练营(五)商品种类识别 文章相关内容资料已经取得百度BML允许,仅用与交流学习,请不要用于商业传播. 这一期继续来手把手教学如何进行视觉上对商品饮料分类. 下载商品识别模板( ...

  4. 飞桨助力动车3C车载智能识别,为动车组运行保驾护航

    项目背景 动车组车载接触网运行状态检测装置(3C)是指在运营动车组上安装的车载接触网运行状态检测装置.其随动车组运行,全天候等速在线检测监测接触网.弓网匹配运行状态,检测监测接触网⼏何参数.红外图像. ...

  5. 飞桨带你使用度量学习,提升人脸识别准确率

    小测试 想必在日常生活中,我们总会有一种感觉,身边认识的一些人,明明没有任何血缘关系,但是长得却可能很像,尤其对于脸盲的同学,真的是傻傻分不清楚. 我们这里有一组题,来测测大家的人脸识别水平. 先来一 ...

  6. 使用【飞桨】实现【手写数字识别】

    使用[飞桨]动态图实现[手写数字识别]可分5步走: 1.获取数据,2.定义模型,3.训练模型,4.测试模型,5.使用模型 当然依赖少不了 #引入依赖 import os import random i ...

  7. 百度Aistudio飞桨七日游体验python爬虫和分析数据

    前言 在某天,老妹给我发了一个截图,百度飞桨举办小白入门到大神的python,而且还有奖品.最近玩拼多多的多多消游戏第133关卡了一个星期废话(建议体验  前期智商碾压游戏 后期靠游戏眷顾) ,回归主 ...

  8. PaddlePaddle飞桨OCR文本检测——识别模型训练(三)

    上一篇检测模型训练https://blog.csdn.net/weixin_42845306/article/details/112689152 飞桨的OCR模型分为检测.识别和分类,今天讨论识别. ...

  9. 『NLP经典项目集』05:新年到,飞桨带你对对联

    基于seq2seq的对联生成 对联,是汉族传统文化之一,是写在纸.布上或刻在竹子.木头.柱子上的对偶语句.对联对仗工整,平仄协调,是一字一音的汉语独特的艺术形式,是中国传统文化瑰宝.这里,我们将根据上 ...

最新文章

  1. 京东面试官问我:“聊聊MySql事务,MVCC?”
  2. 【android】错误集锦及解决办法
  3. shell 提取sql 的字段名表名_SQL代码风格规范
  4. 论文浅尝 \ 联合知识图谱实例和本体概念的通用表示学习
  5. python最常用的编程方式是什么_python常用模块和对象编程
  6. Kinect SDK v1.7 新特性、交互框架与新概念
  7. 太香了!4999元就能入手iPhone 11 最高降价达900元
  8. C#调用exe工作目录
  9. curl命令多行执行
  10. 应用程序无法正常启动 0xc0150002
  11. 【常用模块】电容触摸按键模块(原理讲解、STM32实例操作)
  12. UE4地编大型开放世界~制作烘焙全流程
  13. 投稿时文章脚注数字如何去掉
  14. ORACLE的语言从中文修改为英文
  15. Idea如何设置类头注释(图片步骤直接到位)
  16. 影之刃服务器维护,影之刃无法联机到服务器怎么办 解决办法
  17. go语言程序设计学习笔记-1
  18. 电信校园招聘计算机真题,2019中国电信校园招聘试题(一)
  19. 迭代重建算法中投影矩阵的计算
  20. HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)

热门文章

  1. matlab预测缺失,matlab数据缺失预测
  2. 2021第二届全球工业互联网算法大赛-榜单
  3. 了解爬虫的工作流程及相关概念
  4. 小小新闻发布会资料_小小新闻发布会
  5. Embedding之padding_idx学习
  6. 数字疗法 | 精神障碍患者的救命稻草
  7. 中兴OLTC220单播的配置
  8. 怎么关闭计算机用户账户控制面板,win7系统用户账户控制设置|win7关闭/取消用户账户控制的方法-系统城...
  9. 随身科技无线旅游综合服务系统帮助张家界景区打造“自由行”旅游新模式
  10. Android-MVP模式详解,一篇文章帮你解答