其他分享
首页 > 其他分享> > 用paddleocr打造一款“盗幕笔记”

用paddleocr打造一款“盗幕笔记”

作者:互联网

还在为听AI Studio课程等网络课程的时候

等问题而烦恼? 快来用paddleocr打造一款“盗幕笔记”吧!

您的浏览器不支持 video 标签。

PaddleOCR简介

OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STR),主要面向自然场景。虽然OCR是一个相对具体的任务,但涉及了多方面的技术,包括文本检测、文本识别、端到端文本识别、文档分析等等。

OCR产业实践需要一套完整全流程的解决方案,来加快研发进度,节约宝贵的研发时间。也就是说,超轻量模型及其全流程解决方案,尤其对于算力、存储空间有限的移动端、嵌入式设备而言,可以说是刚需。

在此背景下,产业级OCR开发套件PaddleOCR应运而生。

PaddleOCR的建设思路从用户画像和需求出发,依托飞桨核心框架,精选并复现丰富的前沿算法,基于复现的算法研发更适用于产业落地的PP特色模型,并打通训推一体,提供多种预测部署方式,满足实际应用的不同需求场景。

图18 PaddleOCR开发套件全景图

从全景图可以看出,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记笔记的想法,不仅记录文字,而且文字位置还原,实现“盗取”屏幕内容。

代码实现

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

标签:识别,paddleocr,boxes,笔记,盗幕,PaddleOCR,line,OCR,size
来源: https://blog.csdn.net/m0_63642362/article/details/122643371