码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【OCR】合同上批量贴印章


    【OCR】【专题系列】二、数据获取-合同数据合成方法

    目录

    一、需求

    二、原理实现      

    2.1 随机印章样式

     2.2 随机印章位置角度

    2.3 随机合同样式

    三、秀效果


    一、需求

            OCR算法在处理合同等文件时,会由于印章等遮挡导致文本误识别。因此在OCR预处理时,有一个很重要的步骤是“去除印章”。其中本文主要聚焦在“去除印章”任务中的数据构建步骤:“合同+伪印章”的数据构建。下面直接放几张批量合成后效果。

    二、原理实现      

            合成合同印章的步骤有三个“随机”需要控制。1.印章样式需要“随机”;2.印章“随机”角度、位置贴在合同上的;3.合同版面色泽需要“随机”。

    2.1 随机印章样式

            我采用的是第三方接口,这里借鉴了这位大佬方法二的思路:【Python】实现公章自动化生成以及自动盖章效果-CSDN博客,实现批量生成。主要的调用思路是,通过调用第三方印章生成网址跑批生成。

    1. def func_get_stamp_png(name,use,seal_type):
    2. # 定义API的地址
    3. out_put_name = os.path.join(seal_output_path,name+".png")
    4. url = "http://www.yinzhang8.com.cn/seal/index.php?name={}&str={}&type={}".format(str(name),str(use),str(seal_type))
    5. # 发送HTTP请求
    6. response = requests.get(url)
    7. assert response.status_code == 200
    8. assert 1<=types<=4
    9. # 将返回的二进制数据保存为本地文件
    10. with open(out_put_name, "wb") as f:
    11. f.write(response.content)

    然而第三方网址需要公司名,这里我采用的是faker库,随机生成公司名然后去调用跑批。代码如下。这里公司长度一般在[8,11]字长范围较合适

    1. #批量随机生成公司名
    2. def get_faker_company(self,n,control_len):
    3. # 一般公司名的字长范围为,限制 control_len = [8,11]
    4. from faker import Faker
    5. my_fake = Faker("zh-CN")
    6. comany_list = set()
    7. while len(comany_list) < n:
    8. tmp_company = my_fake.company()
    9. if control_len[0]<=len(tmp_company)<=control_len[1]:
    10. comany_list.add(tmp_company)
    11. return list(comany_list)

     2.2 随机印章位置角度

            在贴上合同的时候,需要用PIL的paste函数中的position来实现控制位置,随机角度需要采用PIL.Image库首先将印章完成旋转,然后再贴上去。部分代码如下。

    1. # 随机选择一个倾斜角度
    2. angle = random.randint(-15, 15)
    3. watermark = watermark.rotate(angle)
    1. # 计算印章可以放置的位置范围
    2. x_range = [int(doc_width * 0.2),int(doc_width * 0.8)]
    3. y_range = [int(doc_height * 0.5),int(doc_height * 0.9)]
    4. # 随机选择一个位置
    5. x_position = random.randint(x_range[0], x_range[1])
    6. y_position = random.randint(y_range[0], y_range[1])
    7. watermark = watermark.resize((int(doc_width*0.1),int(doc_height*0.1)))
    8. # 将水印添加到基本图像
    9. base_image.paste(watermark, (x_position,y_position), watermark)

    2.3 随机合同样式

            这部分考虑到,由于是做图像复原任务,所以在torch里做比较好,对image和label做同一个转换,就能保持图像前后的一致性。

    三、秀效果

            随便贴张图,展现效果。全部源码传送门:coming soon。

  • 相关阅读:
    从入门开始手把手搭建千万级Java算法测试-斐波那契额数列的三种实现方法比较
    HTML做一个传统节日端午节 带设计报告4500字
    MYSQL下载及安装完整教程
    【雅思口语】安娜口语学习记录part1
    Hive详解(超详细)
    ES6 入门教程 6 正则的扩展 6.1 RegExp 构造函数 & 6.2 字符串的正则方法 & 6.3 u 修饰符
    【计算机网络仿真实验-实验2.6】带交换机的RIP路由协议
    猿创征文|[云原生] docker查看日志用法笔记
    推荐系统工业界顶会论文总结——WSDM 2021
    基于python找到并显示100以内的素数
  • 原文地址:https://blog.csdn.net/weian4913/article/details/133695000
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号