0

0

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格

P粉084495128

P粉084495128

发布时间:2025-07-31 15:07:19

|

1015人浏览过

|

来源于php中文网

原创

该项目针对ocr识别签到记录时的形近字误判问题,提出“用错误打败错误”方案。通过paddleocr识别签到截图中带绿色对勾的姓名,生成花名册中姓名的图片并ocr识别,将两者结果匹配,解决如“佘大”被误判为“余大”的问题,实现一键统计签到并生成电子表格,提升效率。

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

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格

项目背景

懒人打卡统计:用OCR+花名册一键统计打卡结果

出席各种会议或活动时均需要进行签到,有的时候是纸质的签到表,有时候则是APP打卡,之后再人工将签到信息填入EXCEL表格中。为了避免人工操作,可以通过PaddleHub调用OCR模型,一键识别照片或者截图中的签到人姓名,并且通过字符匹配的方式,找到excel表格中的签到人进行标注。

OCR识别模型中的弊端

但OCR模型+字符匹配的方式会导致“误判”的情况发生,从而无法正确统计信息,例如:用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

“佘(she)大”同学按时出席并签到后,机器识别很有可能会识别为“余(yu)大”,从而无法在花名册excel文件中找到“佘(she)大”同学,最终“佘(she)大”同学每次都有旷到记录。

为了解决这个问题,可以利用**“错误”打败错误**。首先,生成包含“佘(she)大”同学姓名的图片A,进行识别。而后,将图片A的识别结果和签到表截图的识别结果进行匹配。如果匹配成功,则意味着“佘(she)大”同学签到成功。

具体介绍

懒人打卡统计:用OCR+花名册一键统计打卡结果

如下所示,对于这样的app打卡内容,如果人工找到打卡人姓名(带✔的方框),再在excel中将对应日期的对应姓名的同学标注为打卡成功会花费大量时间,影响我们打游戏。

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

解决方案

为了能一键完成工作安排,继续快乐打游戏,不妨试试PaddleOCR吧:

  • 使用OCR模型识别姓名的位置
  • 按照姓名的位置锚定右上角的绿色对勾
  • 将csv中带有绿色对勾的姓名的标注改为1

为了保护同学们的姓名隐私不在项目中提供截图对应的 打卡截图,花名册文件,仅提供一个随意生成的案例图片,花名册和代码

VIVA
VIVA

一个免费的AI创意视觉设计平台

下载

截图界面为微信小程序:接龙管家的打卡记录界面

由于手机型号/分辨率各有差别,使用本代码请务必对以下参数进行设定

img_dir='1.jpg'                        # 打卡截图name_csv='name_csv.csv'        # 花名册文件,表头为(name,1,2,3,4,5,6,7...),对应的内容分别为姓名,第一天的打卡结果,第二天的打卡结果...,其中姓名填入即可,其他方格可以留空save_dir='output.csv'               # 打卡后的结果保存路径block_size=25                          # 右上角的绿色对勾的区域大小w_bias=35                                # 绿色对勾相对于姓名位置的横向偏移量h_bias=-50                                # 绿色对勾相对于姓名位置的纵向偏移量threshold=175                         # 阈值,低于此阈值则为绿色,否则则偏向于灰色,可以根据像素点均值进行分类clock_in_col=1                          # 打卡条目,此处设为1对应第一天的打卡结果,结果会写入到第二行中

       

打卡前后截图示例

用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

用错误打败错误

为了解决OCR识别模型将形近字误判从而导致无法正确生成签到电子记录的情况发生,可以通过以下步骤生成签到人的“伪姓名”从而使用“伪姓名”获得正确的匹配结果。

下表以“佘大”同学的签到检测作为示例: 用错误打败错误:通过错误的识别将签到记录图片转化为电子表格 - php中文网        

可以看到通过这种生成“伪姓名”方式,就可以顺利地将“佘大”同学和签到表截图中地姓名匹配上啦~

代码逻辑

  1. 获取签到结果截图的OCR识别结果
  2. 获取花名册excel中第i个同学的姓名
  3. 通过上述方法生成“伪姓名”
  4. 将“伪姓名”和OCR识别结果匹配,若有匹配项,且签到标记存在,则对应同学签到成功,若否则签到失败
  5. i=i+1, 跳到第2步执行

代码

In [ ]
!pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
!pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple 
!pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
   
In [ ]
import cv2import paddlehub as hubimport pandas as pdimport numpy as npfrom PIL import ImageFont,ImageDraw,Image# 定义参数# define some parametersimg_dir='案例.jpg'             # 打卡截图name_csv='案例.csv'     # 花名册文件,表头为(name,1,2,3,4,5,6,7...),对应的内容分别为姓名,第一天的打卡结果,第二天的打卡结果...,其中姓名填入即可,其他方格可以留空save_dir='输出案例.csv'       # 打卡后的结果保存路径block_size=25               # 右上角的绿色对勾的区域大小w_bias=35                   # 绿色对勾相对于姓名位置的横向偏移量h_bias=-50                  # 绿色对勾相对于姓名位置的纵向偏移量threshold=175               # 阈值,低于此阈值则为绿色,否则则偏向于灰色,可以根据像素点均值进行分类clock_in_col=1              # 打卡条目,此处设为1对应第一天的打卡结果# 导入文字识别模型# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")ocr = hub.Module(name="chinese_ocr_db_crnn_server")# 读取测试文件夹test.txt中的照片路径img=cv2.imread(img_dir)
np_images =[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.8,           # 检测文本框置信度的阈值;
                    text_thresh=0.8)          # 识别中文文本置信度的阈值;# 匹配文字与识别结果# the function make codes shorterdef is_name_in_ocr(name,ocr_result):
    for item in ocr_result[0]['data']:        if item['text']==name:            return True, item['text_box_position']    return False,None# 根据指定文字生成图片并用ocr模型识别def generate_name_and_ocr(name,ocr):
    w=200
    h=100
    img = np.full((h,w,3),fill_value=255,dtype=np.uint8)
    fontpath = "simhei.ttf" #导入字体文件
    b,g,r,a = 0,0,0,0 #设置字体的颜色
    font = ImageFont.truetype(fontpath,30)#设置字体大小
    img_pil = Image.fromarray(img)#将numpy array的图片格式转为PIL的图片格式
    draw = ImageDraw.Draw(img_pil)#创建画板
    draw.text((w/2-10,h/2-20),name,font=font,fill=(b,g,r,a))#在图片上绘制中文
    img = np.array(img_pil)#将图片转为numpy array的数据格式
    results = ocr.recognize_text(
                    images=[img],         # 图片数据,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.8,           # 检测文本框置信度的阈值;
                    text_thresh=0.8)          # 识别中文文本置信度的阈值;
    return results[0]['data'][0]['text']# 检索识别框右上角的绿色方块,如果存在则打卡成功df=pd.read_csv(name_csv,encoding='gbk')for i in range(len(df)):
    name=df.iloc[i,0]
    name=generate_name_and_ocr(name,ocr) # 注释此行代码可以看到 案例 中的佘大同学签到失败了
    flag, text_box=is_name_in_ocr(name,results)    if flag:
        center_point=[(text_box[2][0]-text_box[0][0])/2+text_box[0][0],(text_box[2][1]-text_box[0][1])/2+text_box[0][1]]
        center_point=[int(x) for x in center_point]
        check_img=img[center_point[1]+h_bias:center_point[1]+h_bias+block_size,center_point[0]+w_bias:center_point[0]+w_bias+block_size,:]        # print(name,check_img.mean())
        if check_img.mean()<threshold:
            df.iloc[i,clock_in_col]=1df.to_csv(save_dir,index=None)
   

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 21万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

PHP课程
PHP课程

共137课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号