【毕业设计】深度学习身份证识别系统 - 机器视觉 python

news2024/11/18 13:54:06

文章目录

  • 0 前言
  • 1 实现方法
    • 1.1 原理
      • 1.1.1 字符定位
      • 1.1.2 字符识别
      • 1.1.3 深度学习算法介绍
      • 1.1.4 模型选择
  • 2 算法流程
  • 3 部分关键代码
  • 4 效果展示
  • 5 最后


0 前言

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩 基于计算机视觉的身份证识别系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md

1 实现方法

1.1 原理

1.1.1 字符定位

在Android移动端摄像头拍摄的图片是彩色图像,上传到服务器后为了读取到身份证上的主要信息,就要去除其他无关的元素,因此对身份证图像取得它的灰度图并得到二值化图。

对身份证图像的的二值化有利于对图像内的信息的进一步处理,可以将待识别的信息更加突出。在OpenCV中,提供了读入图像接口函数imread, 首先通过imread将身份证图像读入内存中:

id_card_img = cv2.imread(path_img)

之后再调用转化为灰度图的接口函数cvtColor并给它传入参数COLOR_BGR2GRAY,它就可以实现彩色图到灰度图的转换,代码如下

gray_id_card_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)
preprocess_bg_mask = PreprocessBackgroundMask(boundary)

转化为二值化的灰度图后图像如图所示:

在这里插入图片描述

转换成灰度图之后要进行字符定位,通过每一行进行垂直投影,就可以找到所有字段的位置,具体如下:

在这里插入图片描述
然后根据像素点起始位置,确定字符区域,然后将字符区域一一对应放入存放字符的列表中:

 vertical_peek_ranges = extract_peek_ranges_from_array(
                vertical_sum,
                minimun_val=40,
                minimun_range=1)
            vertical_peek_ranges2d.append(vertical_peek_ranges)

最后的效果图如图所示:

在这里插入图片描述

1.1.2 字符识别

身份证识别中,最重要的是能够识别身份证图像中的中文文字(包括数字和英文字母),这里学长采用深度学习的方式来做:

1)身份证图像涉及个人隐私,很难获取其数据训练集。针对此问题,我采用获取身份证上印刷体汉字和数字的数据训练集的方法,利用Python图像库(PIL)将13类汉字印刷体字体转换成6492个类别,建立了较大的字符训练集;

2)如何获取身份证图片上的字符是在设计中一个重要问题。我采用水平和垂直投影技术,首先对身份证图像进行预处理,然后对图片在水平和垂直方向上像素求和,区分字符与空白区域,完成了身份证图像中字符定位与分割工作,有很好的切分效果;

3)在模型训练中模型的选择与设计是一个重要的环节,本文选择Lenet模型,发现模型层次太浅,然后增加卷积层和池化层,设计出了改进的深层Lenet模型,然后采用Caffe深度学习工具对模型进行训练,并在训练好的模型上进行测试,实验表明,模型的测试精度达到96.2%。

1.1.3 深度学习算法介绍

深度学习技术被提出后,发展迅速,在人工智能领域取得了很好的成绩,越来越多优秀的神经网络也应运而生。深度学习通过建立多个隐层的深层次网络结构,比如卷积神经网络,可以用来研究并处理目前计算机视觉领域的一些热门的问题,如图像识别和图像检索。

深度学习建立从输入数据层到高层输出层语义的映射关系,免去了人工提取特征的步骤,建立了类似人脑神经网的分层模型结构。深度学习的示意图如图所示

在这里插入图片描述

1.1.4 模型选择

在进行网络训练前另一项关键的任务是模型的选择与配置,因为要保证模型的精度,要选一个适合本文身份证信息识别的网络模型。

首先因为汉字识别相当于一个类别很多的图片分类系统,所以先考虑深层的网络模型,优先采用Alexnet网络模型,对于汉字识别这种千分类的问题很合适,但是在具体实施时发现本文获取到的数据训练集每张图片都是64*64大小的一通道的灰度图,而Alexnet的输入规格是224*224三通道的RGB图像,在输入上不匹配,并且Alexnet在处理像素较高的图片时效果好,用在本文的训练中显然不合适。

其次是Lenet模型,没有改进的Lenet是一个浅层网络模型,如今利用这个模型对手写数字识别精度达到99%以上,效果很好,在实验时我利用在Caffe下的draw_net.py脚本并且用到pydot库来绘制Lenet的网络模型图,实验中绘制的原始Lenet网络模型图如图所示,图中有两个卷积层和两个池化层,网络层次比较浅。

在这里插入图片描述

2 算法流程

在这里插入图片描述

3 部分关键代码

cv2_color_img = cv2.imread(test_image)
    ##放大图片
    resize_keep_ratio = PreprocessResizeKeepRatio(1024, 1024)
    cv2_color_img = resize_keep_ratio.do(cv2_color_img)    
    ##转换成灰度图
    cv2_img = cv2.cvtColor(cv2_color_img, cv2.COLOR_RGB2GRAY)
    height, width = cv2_img.shape
    ##二值化  调整自适应阈值 使得图像的像素值更单一、图像更简单
    adaptive_threshold = cv2.adaptiveThreshold(
        cv2_img, ##原始图像
        255,     ##像素值上限
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  ##指定自适应方法Adaptive Method,这里表示领域内像素点加权和
        cv2.THRESH_BINARY,  ##赋值方法(二值化)
        11,  ## 规定领域大小(一个正方形的领域)
        2)   ## 常数C,阈值等于均值或者加权值减去这个常数
    adaptive_threshold = 255 - adaptive_threshold

    ## 水平方向求和,找到行间隙和字符所在行(numpy)
    horizontal_sum = np.sum(adaptive_threshold, axis=1)
    ## 根据求和结果获取字符行范围
    peek_ranges = extract_peek_ranges_from_array(horizontal_sum)
    vertical_peek_ranges2d = []
    for peek_range in peek_ranges:
        start_y = peek_range[0]  ##起始位置
        end_y = peek_range[1]    ##结束位置
        line_img = adaptive_threshold[start_y:end_y, :]
        ## 垂直方向求和,分割每一行的每个字符
        vertical_sum = np.sum(line_img, axis=0)
        ## 根据求和结果获取字符行范围
        vertical_peek_ranges = extract_peek_ranges_from_array(
            vertical_sum,
            minimun_val=40, ## 设最小和为40
            minimun_range=1)  ## 字符最小范围为1
        ## 开始切割字符
        vertical_peek_ranges = median_split_ranges(vertical_peek_ranges)
        ## 存放入数组中
        vertical_peek_ranges2d.append(vertical_peek_ranges)

    ## 去除噪音,主要排除杂质,小的曝光点不是字符的部分
    filtered_vertical_peek_ranges2d = []
    for i, peek_range in enumerate(peek_ranges):
        new_peek_range = []
        median_w = compute_median_w_from_ranges(vertical_peek_ranges2d[i])
        for vertical_range in vertical_peek_ranges2d[i]:
            ## 选取水平区域内的字符,当字符与字符间的间距大于0.7倍的median_w,说明是字符
            if vertical_range[1] - vertical_range[0] > median_w*0.7:
                new_peek_range.append(vertical_range)
        filtered_vertical_peek_ranges2d.append(new_peek_range)
    vertical_peek_ranges2d = filtered_vertical_peek_ranges2d


    char_imgs = []
    crop_zeros = PreprocessCropZeros()
    resize_keep_ratio = PreprocessResizeKeepRatioFillBG(
        norm_width, norm_height, fill_bg=False, margin=4)
    for i, peek_range in enumerate(peek_ranges):
        for vertical_range in vertical_peek_ranges2d[i]:
            ## 划定字符的上下左右边界区域
            x = vertical_range[0]
            y = peek_range[0]
            w = vertical_range[1] - x
            h = peek_range[1] - y
            ## 生成二值化图
            char_img = adaptive_threshold[y:y+h+1, x:x+w+1]
            ## 输出二值化图
            char_img = crop_zeros.do(char_img)
            char_img = resize_keep_ratio.do(char_img)
            ## 加入字符图片列表中
            char_imgs.append(char_img)
    ## 将列表转换为数组
    np_char_imgs = np.asarray(char_imgs)
 
    ## 放入模型中识别并返回结果
    output_tag_to_max_proba = caffe_cls.predict_cv2_imgs(np_char_imgs)

    ocr_res = ""
    ## 读取结果并展示
    for item in output_tag_to_max_proba:
        ocr_res += item[0][0]
    print(ocr_res.encode("utf-8"))

    ## 生成一些Debug过程产生的图片
    if debug_dir is not None:
        path_adaptive_threshold = os.path.join(debug_dir,
                                               "adaptive_threshold.jpg")
        cv2.imwrite(path_adaptive_threshold, adaptive_threshold)
        seg_adaptive_threshold = cv2_color_img

#        color = (255, 0, 0)
#        for rect in rects:
#            x, y, w, h = rect
#            pt1 = (x, y)
#            pt2 = (x + w, y + h)
#            cv2.rectangle(seg_adaptive_threshold, pt1, pt2, color)

        color = (0, 255, 0)
        for i, peek_range in enumerate(peek_ranges):
            for vertical_range in vertical_peek_ranges2d[i]:
                x = vertical_range[0]
                y = peek_range[0]
                w = vertical_range[1] - x
                h = peek_range[1] - y
                pt1 = (x, y)
                pt2 = (x + w, y + h)
                cv2.rectangle(seg_adaptive_threshold, pt1, pt2, color)
            
        path_seg_adaptive_threshold = os.path.join(debug_dir,
                                                   "seg_adaptive_threshold.jpg")
        cv2.imwrite(path_seg_adaptive_threshold, seg_adaptive_threshold)

        debug_dir_chars = os.path.join(debug_dir, "chars")
        os.makedirs(debug_dir_chars)
        for i, char_img in enumerate(char_imgs):
            path_char = os.path.join(debug_dir_chars, "%d.jpg" % i)
            cv2.imwrite(path_char, char_img)

4 效果展示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5 最后

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

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

相关文章

第八章: 项目质量管理

一、规划质量管理 识别项目及其可交付成果的质量要求和标准,并书面描述项目将如何证明符合质量要求和标准的过程。主要作用为整个项目期间如何管理和核实质量提供指南和方向。 输入工具与技术输出 1.项目章程 2.项目管理计划 需求管理计划风险管理计划相关方参与计…

C++ opencv图像直方图

1.图像直方图概念 图像有很多基础概念,在我们学习的过程中因为一些原因无法涉及,但这并不代表它们不重要 今天,我们就来介绍一个概念——图像直方图 图像直方图,是图像处理中很重要的一个基础概念, 有很多的算法&…

用HTML+CSS做一个漂亮简单的旅游网站——旅游网页设计与实现(6页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

(八)Java算法:堆排序(详细图解)

目录一、前言1.1、概念1.2、大根堆特点二、maven依赖三、流程解析3.1、初始建堆3.2、堆化第一步3.2、堆化第二步3.3、堆化第三步3.4、堆化第四步3.5、堆化第五步3.6、堆化第六步四、编码实现4.1、代码实现4.2、运行结果:扩展一、前言 1.1、概念 根据堆的结构可以分…

彩印图文版《Elasticsearch实战》文档,阿里内部共享,堪称精品

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候…

Lesson1强化学习(RL)初印象 学习笔记

一、强化学习引入 ​ 人的智能可以遗传获得也可以通过后天学习;学习有两种,模仿前人的经验是一种学习;如果没有前人的经验可以学习,就需要和环境进行交互,得到反馈来学习。 #mermaid-svg-XUxguPj6VHcJMK3W {font-famil…

the account is locked

感谢阅读问题描述解决方案1.WinR打开命令行输入:sqlplus ,或者使用sqlplus / as sysdba;无需输入密码。2.假设我们要解锁的账户是scott3.修改密码,从而避免再次被锁4.重启服务或者客户端(看你是桌面版还是服务器版)&am…

警惕,3D建模为什么选3dsMAX不选MAYA

如今现在的游戏建模都是次世代建模,3DMAX确实是主流软件之一,但是为什么说MAYA更好呢❓ 首先,两款软件都很适合用现代的建模,但是难度上有一定的差异❌ • 软件区别 🍀3DSMAX: 它是目前使用最广泛的3d软…

十、Mysql的DQL语句

Mysql的DQL语句十、Mysql的DQL语句select的查询一、查看系统参数二、select常用函数三、select的单表查询1、from子句2、where子句2.1 where配合等值查询2.2where配合比较操作符(> < > < <>)2.3where配合逻辑运算符(and or )2.4where配合模糊查询2.5where配合…

流量控制可靠传输机制停止-等待协议

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录链路层流量控制和传输层的流量控制区别停止-等待协议为什么要有停止等待协议无差错情况滑动窗口协议后退N帧协议GBN选择重传协议SR可靠传输流量控制&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f3…

供应链全流程计划与排产解决方案核心功能概要

通过数字智能化运营实现将本增效至为重要。 许多企业的业务现状是销售、生产计划与市场不匹配&#xff0c;企业的运营效率低且成本高&#xff1a; 销售计划计划需要大量的人员进行沟通&#xff0c;销售预测的分析维度少、粒度粗&#xff0c;不仅效率低&#xff0c;且预测只是一…

【mycat】常用分片规则

一、 常用分片规则 1、取模 ​ 此规则为对分片字段求摸运算。也是水平分表最常用规则 2、分片枚举 ​ 通过在配置文件中配置可能的枚举 id&#xff0c;自己配置分片&#xff0c;本规则适用于特定的场景&#xff0c;比如有些业务需要按照省份或区县来做保存&#xff0c;而全…

Delphi Enterprise具有强大视觉设计功能

Delphi Enterprise具有强大视觉设计功能 Delphi可帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Enterprise适用于构建客户端/服务器或多层应用程序、REST服务等的开发团队。 Delphi功能 单一代码库-用更少…

小程序在线客服完整实现

1、先注册公众号》小程序(需实名认证) 2、开发》测试》上传》审核发布》发布》使用 3、公众号(订阅号或服务号)与小程序(此为在线客服)通过同一主体绑定可以打通调用 建议 内测完成后再上传。如果多次上传demo会处罚的。 添加客服人员列表(授权)可以电脑、手机端均…

(免费分享)springboot论坛bbs系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入010领取下载链接 开发工具&#xff1a;IDEA 数据库mysql5.7 技术&#xff1a;springbootjpashiroredislayui 前台截图&#xff1a; 后台截图&#xff1a; package com.qxczh.admin.service.impl;impor…

云南美食介绍 简单静态HTML网页作品 美食餐饮网站设计与实现 学生美食网站模板

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

A puma at large

New words and expressions puma n. 美洲狮 spot v. 看出,发现 evidence n. 证据 accumulate v. 积累,积聚 oblige v. 使……感到必须 hunt n. 追猎;寻找 blackberry n. 黑莓 Pumas are large, cat-like animals which are found in America. When reports came i…

点击化学PEG试剂巯基吡啶-PEG-叠氮,OPSS-PEG-azide,OPSS-PEG-N3

点击化学PEG试剂OPSS-PEG-azide&#xff08;OPSS-PEG-N3 &#xff09;化学试剂其中文名为巯基吡啶-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Orthopyridyl disulfide (OPSS) PEG。 其分子量均可定制&#xff0c;有&#xff1a;2K 巯基吡啶-PEG-叠氮、5k OPSS-PEG-N3、…

TCP/IP协议、UDP协议及网络基础概念

网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络知识&#xff0c;也可以编写出高质量的网络通信程序。 1.局域网与因特网 …

如何快速实现根因分析/业务大盘

Ideas Worth Spreading 写在前面的话 特别感谢 感谢在最早开发鱼骨图带领我前进的技术负责人-佳哥&#xff08;总监&#xff09;。他一丝不苟的技术态度、严密的逻辑和高要求&#xff08;这里大家都懂的&#xff09;&#xff0c;让我成长。这里是他在语雀的博客&#xff0c;其…