还在为听AI Studio课程等网络课程的时候
等问题而烦恼? 快来用paddleocr打造一款“盗幕笔记”吧!
您的浏览器不支持 video 标签。PaddleOCR简介
OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STR),主要面向自然场景。虽然OCR是一个相对具体的任务,但涉及了多方面的技术,包括文本检测、文本识别、端到端文本识别、文档分析等等。
OCR产业实践需要一套完整全流程的解决方案,来加快研发进度,节约宝贵的研发时间。也就是说,超轻量模型及其全流程解决方案,尤其对于算力、存储空间有限的移动端、嵌入式设备而言,可以说是刚需。
在此背景下,产业级OCR开发套件PaddleOCR应运而生。
PaddleOCR的建设思路从用户画像和需求出发,依托飞桨核心框架,精选并复现丰富的前沿算法,基于复现的算法研发更适用于产业落地的PP特色模型,并打通训推一体,提供多种预测部署方式,满足实际应用的不同需求场景。
从全景图可以看出,PaddleOCR依托于飞桨核心框架,在模型算法、预训练模型库、工业级部署等层面均提供了丰富的解决方案,并且提供了数据合成、半自动数据标注工具,满足开发者的数据生产需求。
在模型算法层面,PaddleOCR对文字检测识别和文档结构化分析两类任务分别提供了解决方案。在文字检测识别方面,PaddleOCR复现或开源了4种文本检测算法、8种文本识别算法、1种端到端文本识别算法,并在此基础上研发了PP-OCR系列的通用文本检测识别解决方案;在文档结构化分析方面,PaddleOCR提供了版面分析、表格识别、关键信息抽取、命名实体识别等算法,并在此基础提出了PP-Structure文档分析解决方案。丰富的精选算法可以满足开发者不同业务场景的需求,代码框架的统一也方便开发者进行不同算法的优化和性能对比。
在预训练模型库层面,基于PP-OCR和PP-Structure解决方案,PaddleOCR研发并开源了适用于产业实践的PP系列特色模型,包括通用、超轻量和多语言的文本检测识别模型,和复杂文档分析模型。PP系列特色模型均在原始算法上进行了深度优化,使其在效果和性能上均能达到产业实用级别,开发者既可以直接应用于业务场景,也可以用业务数据进行简单的finetune,便可以轻松研发出适用于自己业务需求的“实用模型”。
在工业级部署层面,PaddleOCR提供了基于Paddle Inference的服务器端预测方案,基于Paddle Serving的服务化部署方案,以及基于Paddle-Lite的端侧部署方案,满足不同硬件环境下的部署需求,同时提供了基于PaddleSlim的模型压缩方案,可以进一步压缩模型大小。以上部署方式都完成了训推一体全流程打通,以保障开发者可以高效部署,稳定可靠。
在数据工具层面,PaddleOCR提供了半自动数据标注工具PPOCRLabel和数据合成工具Style-Text,助力开发者更方便的生产模型训练所需的数据集和标注信息。PPOCRLabel作为业界首个开源的半自动OCR数据标注工具,针对标注过程枯燥繁琐、机械性高,大量训练数据所需人工标记,时间金钱成本昂贵的问题,内置PP-OCR模型实现预标注+人工校验的标注模式,可以极大提升标注效率,节省人力成本。数据合成工具Style-Text主要解决实际场景真实数据严重不足,传统合成算法无法合成文字风格(字体、颜色、间距、背景)的问题,只需要少许目标场景图像,就可以批量合成大量与目标场景风格相近的文本图像。
技术方案
学习动手学OCR·十讲 课后,发现很有用,特别是发现OCR可以解决记笔记的问题,于是产生了一个用PaddleOCR记笔记的想法,不仅记录文字,而且文字位置还原,实现“盗取”屏幕内容。
-
界面选择:因为界面简单,选择了tkinter。
-
截图实现:本来想实现像微信那样用鼠标直接选定截图区域截图的,但是由于水平有限,选择了用keyboard和pyautogui配合鼠标实现视频区域定位,然后用pyautogui截图的方式。
-
OCR实现:PaddleOCR这么好用,当然是用PaddleOCR了,它不仅可以识别文字,还可以得到文字位置。
-
笔记记录:用PaddleOCR识别出的文字可以按照文字位置,还原到ppt文件中,这个基本实现了,未能实现图片和线条位置的定位与还原,还有待进一步改进。
代码实现
1、用tkinter实现图型界面
root = tk.Tk()
root.geometry("200x100+200+50")
root.attributes("-topmost", True)
root.mainloop()
2、用keyboard和pyautogui配合鼠标实现视频区域定位
def pos(self):
print('请用ctrl+1确定左上角位置:')
while True:
hotkey = keyboard.read_hotkey()
if 'ctrl' in hotkey and '1' in hotkey:
x1, y1 = pg.position()
print('左上角位置:',[x1,y1])
keyboard._pressed_events={}
break
print('\n请用ctrl+2确定右下角位置:')
while True:
hotkey2 = keyboard.read_hotkey()
if '2' in hotkey2 and 'ctrl' in hotkey2:
x2, y2 = pg.position()
print('右下角位置:',[x2,y2])
keyboard._pressed_events={}
break
self.size=[x1,y1,x2-x1,y2-y1]
return self.size
3、用PaddleOCR实现文字和位置识别
通过Python脚本使用PaddleOCR whl包,whl包会自动下载ppocr轻量级模型作为默认模型。
- 检测+方向分类器+识别全流程
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
def ocr(self,*event):
im=pg.screenshot(region=self.size)
img=cv2.cvtColor(np.asarray(im),cv2.COLOR_BGR2RGB)
cv2.imwrite('img.jpg',img)
img_path = 'img.jpg'
result = ocr.ocr(img_path, cls=True)
f = "biji.txt"
with open(f,"a") as file:
for line in result:
file.write(line[1][0] +"\n")
print(line[1][0])
file.write("\n")
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
4、用pptx把PaddleOCR识别出来的文字和位置还原到ppt中
def ppt(size,boxes,txts):
# 实例化 ppt 文档对象
try:
prs = Presentation('test.pptx')
except:
prs = Presentation()
# 插入幻灯片
blank_slide = prs.slide_layouts[6]
slide_1 = prs.slides.add_slide(blank_slide)
for i in range(len(boxes)):
# 预设位置及大小
left =Cm(boxes[i][0][0]/size[2]*25.4) # left,top为相对位置
top = Cm(boxes[i][0][1]/size[3]*19.05*0.9)
width = Cm((boxes[i][1][0]-boxes[i][0][0])/size[2]*25.4) # width,height为文本框的大小
height = Cm((boxes[i][3][1]-boxes[i][0][1])/size[3]*19.05)
# 在指定位置添加文本框
textbox = slide_1.shapes.add_textbox(left, top, width, height)
tf = textbox.text_frame
tf.margin_left=0
tf.margin_right=0
tf.margin_top=0
tf.margin_bottom=0
# 在文本框中写入文字
para = tf.add_paragraph() # 新增段落
para.text = txts[i] # 向段落写入文字
para.alignment = PP_ALIGN.LEFT # 居中
para.line_spacing = 0.0 # 0.0 倍的行距
### 设置字体
font = para.font
font.name = '微软雅黑' # 字体类型
#font.name = 'Calibri' # 字体类型
font.bold = False # 加粗
font.size = Pt(int((boxes[i][2][1]-boxes[i][0][1])*0.75)) # 大小
# 保存 ppt
prs.save('test.pptx')
软件
源码放在/home/aistudio/work目录下的dmbj.py文件里了
运行
python dmbj.py #需在本地电脑dmbj.py 目录运行
截图与UI界面
基于paddleocr和tkinter实现
使用方法
1、点截图区域设置按钮,鼠标移到视频左上角后,用"ctrl+1"设置左上角
2、鼠标移到视频右下角后用"ctrl+2"设置右下角
3、点“记笔记”按钮开始在截图区域进行“盗幕笔记”,记录在pptx文档中(见效果图)。
注:
1、为了避免重复,需在视频画面切换后用鼠标点“记笔记”按钮,笔记自动追加到pptx文档中,每个画面1页pptx文档。
2、同时保存一份文字笔记txt文件中。
笔记效果
我在AI Studio上获得钻石等级,点亮10个徽章,来互关呀~
https://aistudio.baidu.com/aistudio/personalcenter/thirdview/335435