PPOCRLabel半自动工具标注自制身份证数据集


该项目基于PPOCRLabel半自动化标注工具,使用Python和PyQt5编写,支持多种语言模型,可实现OCR数据高效标注。项目通过代码生成身份证数据集,利用PPOCRLabel标注后用于OCR模型训练,还提供了配置好的环境及相关资料,鼓励用户加入SIG小组共同开发。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

项目简介

    本项目基于PPOCRLabel标注工具,PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,内置PPOCR模型对数据自动标注和重新识别,使用python3和pyqt5编写,支持矩形框标注和四点标注模式(多点标注我已经提交了PR,等待那边审核),导出格式可直接用于PPOCR检测和识别模型的训练。通过内置高质量的PPOCR中,英,法,日文等超轻量预训练模型,可以实现OCR数据的高效标注。CPU机器运行也是完全没问题的。

******** 标注环境 ********

  系统 : Windows + Anaconda
  解释器环境 : 安装Anaconda,(Python 3+)

       

按官方文档执行完以下命令

  • conda install pyqt=5

  • cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下

  • pyrcc5 -o libs/resources.py resources.qrc

  • python PPOCRLabel.py

SIG兴趣小组

SIG队伍:如果您对以上内容感兴趣或对完善工具有不一样的想法,欢迎加入我们的SIG队伍与我们共同开发。可以在此处完成问卷和前置任务,经过我们确认相关内容后即可正式加入,享受SIG福利,共同为OCR开源事业贡献(特别说明:针对PPOCRLabel的改进也属于PaddleOCR前置任务) 还会有各种精美百度定制小礼品,期待你的加入!

关于本项目

本项目基于自己生成身份证数据集代码及其使用PPOCRLabel标注工具来自制数据集,完*流OCR光学字符识别的从零开始到模型使用。对项目还存在的改进空间,希望大家多交流观点、介绍经验,共同学习进步,可以互相关注♥。个人主页

相关资料

已标注完毕身份证数据集链接

数据增广工具Style Text 这里就不多叙述了,在你的数据集不够的情况下可以使用数据增广工具Style Text. 可以参考这个项目 StyleText数据合成工具 

基于OCR身份证号码识别全流程 已经训练完,正在完善MD笔记

PPOCRLabel半自动标注工具的环境配置比较麻烦,所以这里作者把已经配置好的环境放在百度云盘里面,直接免费提供。点我直接下载

1、代码制作身份证数据集

In [1]
#导入所需要的包from PIL import Image, ImageDraw, ImageFontimport numpy as npimport cv2import random
   

1.1 存放所需属性Person抽象类

In [2]
class Person(object):
    def __init__(self, name, sex, national,
                years, month, day, address,
                id_card):
        self.name=str(name), 
        self.sex=str(sex), 
        self.national=str(national),
        self.years=str(years), 
        self.month=str(month), 
        self.day=str(day), 
        self.address=str(address),
        self.id_card=str(id_card)
   

1.2 定义生成姓名, 性别, 民族, 出生年月, 户籍地址, 身份证ID的函数

In [3]
def GBK2312():
    """
    功能 : 随机生成一个汉字
    """
    head = random.randint(0xb0, 0xf7)
    body = random.randint(0xa1, 0xf9)  # 在head区号为55的那一块最后5个汉字是乱码,为了方便缩减下范围
    val = f'{head:x}{body:x}'
    st = bytes.fromhex(val).decode('gb2312')    return stdef first_name():    
    """
    功能 : 随机取姓氏字典
    """
    first_name_list = [        '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许',        '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章',        '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳',        '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常',        '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹',        '姚', '邵', '堪', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞',        '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '魏']
    n = random.randint(0, len(first_name_list) - 1)
    f_name = first_name_list[n]    return f_namedef second_name():
    """
    功能 : 随机取数组中字符,取到空字符则没有second_name
    """
    second_name_list = [GBK2312(), '']
    n = random.randint(0, 1)
    s_name = second_name_list[n]    return s_namedef last_name():
    """
    功能 : 随机生成名字最后一位字
    """
    return GBK2312()def create_name():
    """
    功能 : 随机生成名字
    """
    name = first_name() + second_name() + last_name()    return namedef sex_word():
    """
    功能 : 随机生成性别
    """
    nums = random.randint(0,3)
    sex_list = [        '男', '女', '机器人', '未知']    
    return sex_list[nums]def address_name():  
    """
    功能 : 随机生成省份
    """
    first_name_list = [        '黑龙江省哈尔滨', '吉林省长春', '辽宁省沈阳', '河北省石家庄', '山西省太原', '青海省西宁', '山东省济南', '河南省郑州', '江苏省南京', '安徽省合肥',        '浙江省杭州', '福建省福州', '江西省南昌', '湖南省长沙', '湖北省武汉', '广东省广州', '台湾省台北', '海南省海口', '甘肃省兰州']
    n = random.randint(0, len(first_name_list) - 1)
    address_name = first_name_list[n]    return address_namedef random_id_card():
    """
    功能 : 随机生成18位身份证ID
    """
    num_str = ''
    _rand = random.randint(0, 100)    for i in range(17): #  
        # num_str=str(random.randint(0, 9)).zfill(17)
        num_str = num_str + str(random.randint(0, 9))    if _rand >= 92:
        num_str = num_str + 'X'
    else:
        num_str = num_str + str(random.randint(0, 9))    
    return num_strdef to_str(per):
    """
    功能 : 将元祖转为str
    """
    _str =''.join(per)    
    return _str
   

两种起名方式

import random

def Unicode():    name = ""
    nums = random.randint(2,4)    for n in range(nums):
        val = random.randint(0x4e00, 0x9fbf)        name = name + chr(val)    return namename = Unicode()name
   

1.3 定义画板, 黑体等函数

In [4]
# 定义写字函数def add_txt(image, size, draw_x, draw_y, txt):
    # 字体字号
    setFont = ImageFont.truetype('IDTemplate/simhei.ttf', size)    # 定义画板
    draw = ImageDraw.Draw(image)    # 绘制
    draw.text((draw_x, draw_y), txt, font=setFont, fill=(0, 0, 0))    return image 
 
def make_fake_id_card(person):
    
    
    ori_image = cv2.imread('./IDTemplate/IDCard{}.png'.format(random.randint(0,8))) 
    print('==ori_image.shape:', ori_image.shape)
    ori_image = cv2.resize(ori_image, (0, 0), fx=0.4, fy=0.4)    print('==resize ori_image.shape:', ori_image.shape)    
    
    # 向图片上写字
    img = Image.fromarray(cv2.cvtColor(ori_image, cv2.COLOR_BGR2RGB))
    img = add_txt(img, 19, 97, 58, to_str(person.name)) #字体 x坐标 y坐标
    img = add_txt(img, 16, 97, 90, to_str(person.sex))
    img = add_txt(img, 16, 190, 90, to_str(person.national))
    img = add_txt(img, 16, 92, 118, to_str(person.years))
    img = add_txt(img, 16, 162, 118, to_str(person.month))
    img = add_txt(img, 16, 201, 118, to_str(person.day))
    img = add_txt(img, 16, 94, 155, to_str(person.address))
    img = add_txt(img, 16, 94, 176, '某某 666号')
    img = add_txt(img, 18, 147, 239, to_str(person.id_card))
 
    cv2.imwrite('./train_data/middleIMG/word.jpg', np.array(img)[..., ::-1]) 
def make_white_mask(person, nums):
    # 生成一个空白的模板mask
    ori_image = cv2.imread('./IDTemplate/IDCard{}.png'.format(random.randint(0,8)))
    ori_image = cv2.resize(ori_image, (0, 0), fx=0.4, fy=0.4)
    mask_image = np.ones_like(ori_image)
    mask_image *= 255
    print(mask_image.shape,' {}.jpg'.format(nums))
    cv2.imwrite('./train_data/middleIMG/mask.jpg', mask_image) 
    # 往空白模板上写字(这里只能用PIL写,因为OpenCV写中文会乱码)
    img = Image.fromarray(cv2.cvtColor(ori_image, cv2.COLOR_BGR2RGB))
    img = add_txt(img, 19, 97, 58, to_str(person.name)) #字体 x坐标 y坐标
    img = add_txt(img, 16, 97, 90, to_str(person.sex))
    img = add_txt(img, 16, 190, 90, to_str(person.national))
    img = add_txt(img, 16, 92, 118, to_str(person.years))
    img = add_txt(img, 16, 162, 118, to_str(person.month))
    img = add_txt(img, 16, 201, 118, to_str(person.day))
    img = add_txt(img, 16, 94, 155, to_str(person.address))
    img = add_txt(img, 16, 94, 176, '某某 666号--自制数据集')
    img = add_txt(img, 18, 147, 239, to_str(person.id_card))
 
    mask_image_txt = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    cv2.imwrite('./train_data/middleIMG/mask_image_txt.jpg', mask_image_txt)
    gray = cv2.cvtColor(mask_image_txt, cv2.COLOR_BGR2GRAY)    # 高斯模糊,制造边缘模糊效果哦
    gray_Gaussianblur = cv2.GaussianBlur(gray, (3, 3), 0) 
    # 使用阈值对图片进行二值化
    th, res = cv2.threshold(gray_Gaussianblur, 200, 255, cv2.THRESH_BINARY)
    res_inv = cv2.bitwise_not(res)
    cv2.imwrite('./train_data/middleIMG/res_inv.jpg', res_inv) 
    # 写字的模板保留文字部分
    img_bg = cv2.bitwise_and(mask_image_txt, mask_image_txt, mask=res_inv)
    cv2.imwrite('./train_data/middleIMG/img_bg.jpg', img_bg)    # 原图保留除文字的其他部分
    img_fg = cv2.bitwise_and(ori_image, ori_image, mask=res)
    cv2.imwrite('./train_data/middleIMG/img_fg.jpg', img_fg)    # 将两张图直接进行相加,即可
    final = cv2.add(img_bg, img_fg)
    cv2.imwrite('./train_data/{}.jpg'.format(nums), final)
    In [5]
!mkdir -p train_data/middleIMG
    In [6]
if __name__ == '__main__':    # make_fake_id_card()
    for i in range(3200):
        person = Person(name=create_name(), sex=sex_word(), national='汉',
                    years=str(random.randint(1970, 2025)), month=str(random.randint(1, 12)), 
                    day=str(random.randint(1, 28)), address=address_name(), id_card=random_id_card())
        make_white_mask(person, str(i).zfill(4))
   

1.4 自制数据集各个文件展示

二值化:train_data/middleIMG/res_inv.jpg             

写字的模板保留文字部分:train_data/middleIMG/img_bg.jpg             

原图保留除文字的其他部分:train_data/middleIMG/img_fg.jpg             

最终效果 :

原图和写字的两张图直接进行相加:train_data/0000.jpg             

1.5 存储自制数据集,准备放入PPOCRLabel自行标注

In [7]
#解压zip !zip -q -r train_data.zip train_data/
   

2、PPOCRLabel半自动标注工具

2.1 解压标注工具在本地

git clone https://github.com.cnpmjs.org/paddlepaddle/PaddleOCR.git

       

2.2 PyCharm 打开项目 (用别的工具也可以)

PPOCRLabel半自动标注工具的环境配置比较麻烦,所以这里作者把已经配置好的环境放在百度云盘里面,直接免费提供。点我直接下载

2.3 环境配置

    第一步 : 要有Anaconda Navigator (Anaconda3) ,推荐去官网下载,下载完! 打开文件夹环境所在位置,例如我的环境是(D:\Anaconda3\envs)

   下载完百度云盘的LabelImg.zip文件之后,解压到自己的 Anaconda3\envs 文件夹下。完整目录就是 D:\Anaconda3\envs\LabelImg 。

运行环境百度云链接与提取码---->链接:https://pan.baidu.com/s/1zYrmVkwkL69mziO_wnUNDg 提取码:6666

示例如下图所示:

       

   第二步 : 接下来图文操作, Ctrl + Alt + S 打开设置

       

   第三步 : 在pycharm终端运行更新资源指令: pyrcc5 -o libs/resources.py resources.qrc

       

    最后一步 : 运行即可 PaddleOCR\PPOCRLabel\PPOCRLabel.py  运行PPOCRLabel.py

开始会下载已经训练好的模型权重,如下图 :

       

运行成功截图 :

       

3、使用PPOCRLabel标注工具标注

3.1 选择好我们生成的train_data数据集文件

       

3.2 点标注或者四点矩形框标注

    用过标注工具的同学,应该都知道怎么标注了。 按 W 是四点矩形框标注 ,按 Q 是点标注,我已经在SIG小组实现四点及其以上的标注框,欢迎大家参加SIG小组,为开源做贡献

       

3.3 切换对应模型重识别,更高效的自动标注

    PPOCRLabel人性化的推出了各个常见语言的训练模型,

    如下图 :

   1.中文与英文模型权重 
    
   2.英文模型权重 
   
   3.法语模型权重 
   
   4.德语模型权重 
   
   5.韩文模型权重 
   
   6.日文模型权重
       

       

3.4 生成给Det的标注文件分别为如下三个

Cache.cach : 标注的缓存文件

fileState.txt : 标注的每个图片的状态文件 1 则是确认标注 0 则是未确认

Label.txt : 训练Det所需要的训练文件,数据集格式属于:SimpleDataSet

       

3.5 如何生成给Rec的标注文件

    打开菜单点击导出rec识别的label即可,如右图文所示 :         

    导出结果会生成一个截出框的图片文件夹,以及对应的rec标签

       


# python  # git  # windows  # 工具  # ai  # pycharm  # 百度 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: 百度APP搜索框ai怎么关 百度APP搜索框ai图标去除  批改网AI检测工具如何对接学校系统_批改网AI检测工具系统对接与数据同步【步骤】  轻松制作圣经视频:无需露脸也能赚钱的教程  美图秀秀AI抠图如何换背景_美图秀秀AI背景替换与贴纸添加【攻略】  Wrike:AI赋能的项目管理平台,提升电商效率与团队协作  AI 和 Plagiarism Checker:SEO 内容创作的终极指南  如何用AI帮你进行竞品功能对比分析?轻松制作对比矩阵  在线歌曲歌词生成器:创意歌词轻松创作指南  播客成功的秘诀:打造高转化率的内容和社区  可灵ai怎么生成招聘JD文案_可灵aiJD生成要素与岗位描述优化【技巧】  如何通过 DeepSeek 优化分布式存储系统架构  唇语解读的界限:名人的隐私与公众的好奇心  百度AI搜索怎样设置搜索偏好_百度AI搜索偏好设置与个性化推荐【技巧】  AI赋能营销:5分钟快速生成品牌营销素材全攻略  tofai官网网页版入口 tofai最新网页版登录链接  AI生成克里希纳短视频:一步步教程,快速爆款!  ChatGPT如何进行数据可视化构思 ChatGPT图表设计指南  AI赋能QA:测试管理的未来趋势与实践  如何用AI帮你检查代码中的潜在安全漏洞?  AI助手高效获取谷歌评论:提升本地商家曝光率的终极指南  图像分割技术详解:定义、类型、技术与应用  在线奇幻名称生成器:打造独一无二的角色名  Power BI: 如何在 Power Query 中更改数据类型  OpenArt:终极AI内容创作平台,图像、视频和角色一致性  Thesis AI:一键生成高质量学术论文的秘密武器  AI心理测试生成工具有哪些_一键生成趣味测评的AI工具推荐  AI加持:2025年最佳人工智能潜在客户生成工具  播客数据深度分析:揭秘全球听众分布及增长策略  如何用AI帮你创建自定义表情符号(Emoji)?聊天斗图更有趣  AI学习秘籍:3个高效黑科技,解锁智能学习新时代  AI客服工具:24/7全天候支持业务增长的秘密武器  ChatGPT新手指南:大学生如何高效利用AI工具?  简历没回改:利用AI润色让你的文字更专业  lovemo网页版直接进入 lovemo官网在线登录  AI卡通视频制作终极指南:轻松打造百万流量  银行对账单解读完全指南:掌握财务状况,优化资金管理  ChatGPT背后的AI革命:OpenAI的崛起与Google的危机  AI动画制作教程:Adobe Express一键语音转动画  Kling 2.0终极指南:AI视频创作秘籍,告别低质量  QRCODE.AI深度评测:AI驱动的二维码生成器优缺点分析  Semrush Summary Generator: 高效总结长篇文章的终极指南  想做自媒体?教你用AI批量生成视频脚本,实现内容自由  Claude怎么用新功能会议纪要_Claude纪要生成使用【步骤】  tofai怎么调整层级顺序 tofai图层上下移动方法【步骤】  在线图像分割:可信模糊聚类算法详解与应用  Excel Copilot:AI驱动的强大新功能与实用案例解析  Roblox Studio AI 助手:创意构建与无限可能  3步教你用AI总结会议录音,再也不怕错过重点  lovemo手机网页版 lovemo官方入口地址  使用 Claude 4 和 n8n 实现 AI 工作流自动化 

 2025-07-22

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.