OCR卡证识别

news2024/12/22 23:55:54

文章目录

  • 前言
  • 一、DBNet多分类
  • 二、步骤
    • 1.训练、训练模型推理、模型转换
    • 2.通过推理模型进行推理
  • 三、解决思路
    • 1、查看模型
    • 2、tools/infer/predict_det.py修改
    • 3、utility.py修改
  • 总结


前言

最近涉及到了身份证识别,为了便于匹配识别结果的属性,如姓名、身份证号、地址等,便想到在dbnet的基础上加个分类的分支,本篇便用于记录过程中遇到的bug。


一、DBNet多分类

当自己产生这个想法的时候,先通过度娘查看了一下是否有实现的案例,结果发现已有大佬实现,所以就直接参考大佬的代码进行了修改,参考链接为:DBNet多分类。这个想法可以适应于身份证、银行卡等证件的识别。

二、步骤

1.训练、训练模型推理、模型转换

根据上文提到的链接或者PaddleOCR里的PaddleOCR/applications/快速构建卡证类OCR.md进行代码修改即可,亲测可行。

2.通过推理模型进行推理

在这里插入图片描述
这里直接运行的话,虽然不会报错,但是推理的结果可能不尽人意,如下图(图片是自己合成的,忽略信息):
在这里插入图片描述
从上图可见,框的位置不对,并且没有显示类别,我想实现的结果为:
在这里插入图片描述

那么如何达到我的目标呢?解决方案继续往下看。

三、解决思路

1、查看模型

刚开始,想的是自己的模型转换不对,便用netron查看了转换后的模型,netron网页版网址为:netron
如果你的模型打开后是这样的
在这里插入图片描述

那说明你的模型有问题,先去用自己的训练模型去推理,看结果是否正确。如果你的模型是这样:
在这里插入图片描述
那说明你的模型转换也是对的,请继续往下走。

2、tools/infer/predict_det.py修改

首先我们在大约250行左右输出下outputs,如图:
在这里插入图片描述
输出结果如下:
在这里插入图片描述
运行结果中看,我们有2个输出,那说明成功了一半。第一个输出类型为int,而我们在二、1中改的代码中class分支的输出为int类型,由此猜想,是不是第一个输出为分类的,第二个是dbnet的。再结合我们的结构图:
在这里插入图片描述
由此,我们可以将第一个输出定为class分支,第二个输出定为dbent的,所以有如下更改:

这里修改完成后,后处理的输入就之前我们改的部分就对应上了,拿到后处理的结果后,只需要按照如上方式,对展示部分进行修改即可,如下:
在这里插入图片描述
在这里插入图片描述
其中用到的draw_det_res_and_label()函数和args.num_classes等均在下一步呈现。

3、utility.py修改

首先我们需要增加两个参数,如下:

在这里插入图片描述
这里类别数和类别标签文件路径都改为自己的即可,当不想展示类别时,将num_classes的默认值改为None即可。其次,我们还需要添加一个用于可视化结果的函数,和原来的进行区分开:如下:

def draw_det_res_and_label(dt_boxes, classes, label_file_path, img):
    label_list = label_file_path
    labels = []
    if label_list is not None:
        if isinstance(label_list, str):
            with open(label_list, "r+", encoding="utf-8") as f:
                for line in f.readlines():
                    labels.append(line.replace("\n", ""))
        else:
            labels = label_list
    if len(dt_boxes) > 0:
        import cv2
        index = 0
        src_im = img
        for box in dt_boxes:
            box = box.astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(src_im, [box], True, color=(255, 255, 0), thickness=2)

            font = cv2.FONT_HERSHEY_SIMPLEX
            src_im = cv2.putText(src_im, labels[classes[index]], (box[0][0][0], box[0][0][1]), font, 0.5, (255, 0, 0), 1)
            index += 1
        return src_im

改到这里就OK了,大家可以去亲自实践下。


总结

这就是本篇的全部内容,如果有自己理解错误的地方,烦请评论区指正,最后再次感谢大佬的贡献,https://blog.csdn.net/YY007H/article/details/124491217

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二) AIGC—Stable Difussion (1)

1. 前置知识 目前通用的图像生成模型一般包含三个组件: Text Encoder 根据文字生成向量生成模型 根据向量和Noise 生成 缩小版本的图像Image Decoder 根据小分辨率图像生成大分辨率图像 2. Text Encoder 文字的Encoder对于结果的影响很大,增大Diffusio…

华为p60系列超级快充 Turbo技术,轻松搞定充电困扰!

随着手机的功能越来越丰富,电量消耗也越来越快,当手机电量剩余20%时,是否有电量焦虑。为了满足大家快速充电的需求,华为P60系列配备了超级快充Turbo充电技术,让我们手机充电更快,用的更久,从此告…

Python爬虫解读

爬虫: Python爬虫是指利用计算机程序或者脚本自动抓取网站数据的一种行为,通常是为了提取网站数据或者进行数据分析等目的。 Python 爬虫可以分为手动爬虫和自动爬虫两种。手动爬虫是指完全由人工编写代码来实现的爬虫,这种方式需要编写大量的…

ES使用小结

ES使用总结 1.查询es全部索2.根据es索引查询文档3.查看指定索引mapping文件4.默认查询总数10000条5.删除指定索引文档6.删除所有数据包括索引7.設置窗口值8. logstash简单配置Logstash配置:logstash 控制台输出 9. filebenat配置 1.查询es全部索 localhost:9200/_c…

为什么说网络安全行业是IT行业最后的红利?

前言 2023年网络安全行业的前景看起来非常乐观。根据当前的趋势和发展,一些趋势和发展可能对2023年网络安全行业产生影响: 5G技术的广泛应用:5G技术的普及将会使互联网的速度更快,同时也将带来更多的网络威胁和安全挑战。网络安全…

DHCP 给内网客户端分配ip地址

~ 为 InsideCli 客户端网络分配地址,地址池范围: 192.168.0.110-192.168.0.190/24; ~ 域名解析服务器:按照实际需求配置 DNS 服务器地址选项; ~ 网关:按照实际需求配置网关地址选项; ~ 为…

JAVAWeb08-手动实现 Tomcat 底层机制+ 自己设计 Servlet

1. 前言 先看一个小案例, 引出对 Tomcat 底层实现思考 1.1 完成小案例 ● 快速给小伙伴完成这个小案例 0. 我们准备使用 Maven 来创建一个 WEB 项目, 老师先简单给小伙伴介绍一下 Maven 是什么, 更加详细的使用,我们还会细讲, 现在先使用一把 先创建…

【MySQL】带你了解MySQL 如何学习MySQL以及MySQL的用途以及意义

目录 1 MySQL的起源和发展 1.0.1 数据库管理系统 1.1 MySQL的起源 命名由来: 1.2 MySQL的发展历程 2 什么是MySQL? 2.1 数据库 2.1.1 我们之前存储数据的格式: 2.1.2 使用数据库的目的: 2.1.3 数据库分类 2.2 SQL语句 2…

STM32-HAL-串口的printf重定向

一、C语言的格式化输出 C语言的printf是一个标准库函数,用于将格式化的数据输出到标准的输出设备(通常是终端) 基本语法: int printf(const char *format, ...);其中的第一个参数const char *format表示输出格式,后面…

Kubernetes核心组件及资源介绍

文章目录 一、Kubernetes架构二、Kubernetes核心组件三、Kubernetes核心资源四、拓展1、Service和Ingress的区别是什么?2、Replicaset和Deployment的区别是什么?3、Deployment和Statefulset的区别是什么?4、Job和Cronjob的区别是什么&#xf…

【FAQ】统一扫码服务常见问题及解答

1.隐私政策是怎么样的?收集哪些信息? 关于Scan Kit的隐私政策及收集的信息,请查看SDK隐私安全说明。 Android:SDK隐私安全说明 iOS:SDK隐私安全说明 2.如何使用多码识别?多码模式下如何实现指定条码&am…

vue生命周期的理解?

目录标题 一、什么是生命周期?二、生命周期的流程图: 一、什么是生命周期? Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译版、挂载Dom ->染、更新 ->渲染、卸载 等一系列过程,称这是Vue的生…

简单清晰了解B树和B+树

一.学习背景 在MySQL的学习中,我们了解到了索引的知识,而关于MySQL索引背后的数据结构,我们在这里进行学习. 首先,我们要了解到的是,MySQL的索引用到的数据结构为B树. 使用B树是因为,在数据量大的时候,内存不够用,大部分数据只能存放在磁盘上,只有需要…

【Linux命令行与Shell脚本编程】第七章 Linux文件权限

Linux命令行与Shell脚本编程 第七章 Linux文件权限 文章目录 Linux命令行与Shell脚本编程七,Linux文件权限7.1,Linux的安全性7.1.1,用户信息 /etc/passwd文件7.1.2,用户密码 /etc/shadow文件7.1.3,useradd 添加新用户7.1.4,userdel 删除用户7.1.5, 修改用户1,usermod2,passwd…

Hystrix Dashboard图形化监控

👉🏻 SpringCloud 入门实战系列不迷路 👈🏻: SpringCloud 入门实战(一)什么是SpringCloud?SpringCloud 入门实战(二)-SpringCloud项目搭建SpringCloud 入门实…

【云计算•云原生】1.什么是云计算?它为什么这么火?

文章目录 1.云计算基础什么是云计算云计算的分类开源软件、自由软件、免费软件 2.云计算机制云基础设施机制云管理机制云安全机制基本云架构 3.虚拟化技术服务器虚拟化服务器虚拟化技术CPU虚拟化内存虚拟化设备和I/O虚拟化存储虚拟化网络虚拟化桌面虚拟化 KVM 4.网络与存储基础…

90后,第一批接棒白酒的“年轻人”

【潮汐商业评论/原创】 又到了每月的公司团建,“团建必喝酒”似乎已经成为了大家的共识。 但在酒水的选择上,有红的、啤的、洋的,还有低度果酒,唯独不见听谁说聚会喝白的。当Jason询问为什么没有白酒时,得到了几乎一…

C语言函数大全-- o 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- o 开头的函数 1. obstack_init,obstack_free,obstack_alloc,obstack_blank,obstack_grow 1.1 函数说明 函数声明函数功能void obstack_init(struct obstack *obstack_ptr);它是 POSIX …

Python采集某网站小sp内容, m3u8内容下载

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 环境使用: Python 3.8 Pycharm 模块使用: import requests >>> pip install requests import re 正则表达式 解析数据 import json 本次案例所用知识点: python基础语法: 字典创建/取值 print输出函数使用…

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算 文章目录 【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算一. RNN简介1.1 概念简介1.2 方法使用简介 二. 编码层embedding2.1 embedding的参数2.2 embedding的理解 三. Linear层与CrossEnt…