首页 > 编程知识 正文

视觉传达毕业设计题目,人脸识别身份证

时间:2023-05-04 23:13:40 阅读:61795 作者:4366

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

前言今天,我们将向大家介绍一个非常广泛、非常有意义的毕业设计项目,基于机器视觉的身份证识别系统可以用于考场、网吧、政府机构、学校出入注册等各种现实生活场景。 1实现方法1.1原理1.1.1字符安卓移动摄像头拍摄的图像为彩色图像,上传到服务器后,为了读取身份证的主要信息,需要去除其他无关因素,因此对身份证图像绘制其灰度图

身份证图像的二值化有利于图像内的信息的进一步处理,能够更强调应识别的信息。 OpenCV提供了用于读取图像的接口函数imread,首先通过imread将身份证图像读取到内存中:

调用在id _ card _ img=cv2.im read (path _ img )后转换为灰度的接口函数cvtColor,传递参数COLOR_BGR2GRAY,如下代码所示

gray _ id _ card _ img=cv2.cvtcolor (color _ img,cv2.COLOR_BGR2GRAY ) preprocess _ BG _ mask=preprocess bacocess bacolor

转换为灰度后,进行文字对齐。 通过垂直投影每行,可以找到所有字段的位置。 具体情况如下:

然后,根据像素点的开始位置确定字符区域,并将字符区域一对一地放入存储字符的列表中。

vertical _ peek _ ranges=extract _ peek _ ranges _ from _ array (vertical _ sum,minimun_val=40,minimun_rray

1.1.2字符识别在身份证识别中,最重要的是能识别身份证图像中的中文字符(包括数字和字母),在这里前辈通过深度学习的方式进行。

1 )由于身份证图像涉及隐私,很难得到其数据训练集。 针对这个问题,我采用了获取身份证上活字汉字和数字数据训练集的方法,利用Python图像库(PIL )将13种汉字活字字体转换为6492种,制作了一个较大的文字训练集。

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

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

1.1.3深度学习算法在深度学习技术提出后发展迅速,在人工智能领域取得了良好的成绩,诞生了越来越多优秀的神经网络。 通过构建多个隐藏层的深网络结构(如卷积神经网络),深度学习可用于研究和处理当前计算机视觉领域中热门的问题,如图像识别和图像检索。

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

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

首先,汉字识别是一个相当于一个范畴的图像分类系统,所以考虑深层的网络模型,优先采用Alexnet网络模型,虽然适合汉字识别这样的千分类问题,但在具体实施时,本文得到的数据训练Lenet机型的输入规格为224*224通道的RGB图像,而Alexnet的灰度大小为64个通道,不适合输入。 未改进的Lenet是一种浅网络模型。 现在,使用该模型对对方的数字识别精度达到99%以上,很有效果。 在实验中,我们使用Caffe下的draw_net.py脚本,使用pydot库绘制了Lenet的网络模型图。 实验绘制的原始Lenet网络模型图如图所示。 图中显示

2算法流程

3部分键码cv2 _ color _ img=cv2.im read (test _ image ) #放大图像resize _ keep _ ratio=preprocessresizekeepratio (1024 )

_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 最后

学长亲自接毕业设计,有需要的同同学:
(q扣)
746876041

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。