毕业设计_基于K210的人脸识别门禁

  • 系统介绍
  • 硬件准备
  • 软件准备
  • 部分代码
  • tips
  • 写在最后

分享一则自己的毕业设计,基于人脸识别技术的门禁系统研究。系统硬件比较糙,可以集成化更高一点,基本控制是交由STM32处理,图像识别由K210处理。水平有限,恳请大家指正。

系统介绍

本系统设计以Kendryte K210为人脸图像识别的核心芯片,以STM32为系统逻辑控制芯片,同时加入语音模块、触摸屏和RFID模块。系统共四个功能模式,分别是人脸识别、口罩检测、特征学习、门禁通卡。人脸识别采用基于YOLO的人脸检测算法和特征提取算法,同时将模型部署至K210运行。系统可对人脸特征进行学习,实现了对人脸信息的实时录入,方便了门禁系统的管理。硬件方面系统还加入了RFID模块、语音播报模块、TFT触摸屏等。RFID模块主要实现了对用户ID卡识别,并将ID卡信息通过串口传送到STM32进行用户信息匹配。语音模块和触摸屏组成了系统人机交互部分,系统界面简洁操作简单,同时具备语音播报功能,智能化程度高。

硬件准备

STM32f103zet6、Maixduino、RFID模块、JZ-TRIG语音播报、触摸屏、LCD、摄像头、角度舵机、锂电池、稳压管(两个,一个给系统供电,一个单独给舵机供电)

软件准备

软件工具:MDK、Maixpy IDE、串口助手(调试用)
程序组成:人脸检测程序、人脸五点特征点提取、口罩检测程序、特征学习程序、RFID模块识别程序

部分代码

人脸识别、特征学习
代码参考Maixpy论坛一些前辈的经验,请大家多多支持Maixpy。

def face_recognize():global flag_enterglobal task_mask,task_ld,task_feglobal sum_3global sum_4global now_modeimg = sensor.snapshot()code = kpu.run_yolo2(task_fd, img)if code:for i in code:# Cut face and resize to 128x128a = img.draw_rectangle(i.rect())face_cut = img.cut(i.x(), i.y(), i.w(), i.h())face_cut_128 = face_cut.resize(128, 128)a = face_cut_128.pix_to_ai()# a = img.draw_image(face_cut_128, (0,0))# Landmark for face 5 pointsfmap = kpu.forward(task_ld, face_cut_128)plist = fmap[:]le = (i.x() + int(plist[0] * i.w() - 10), i.y() + int(plist[1] * i.h()))re = (i.x() + int(plist[2] * i.w()), i.y() + int(plist[3] * i.h()))nose = (i.x() + int(plist[4] * i.w()), i.y() + int(plist[5] * i.h()))lm = (i.x() + int(plist[6] * i.w()), i.y() + int(plist[7] * i.h()))rm = (i.x() + int(plist[8] * i.w()), i.y() + int(plist[9] * i.h()))a = img.draw_circle(le[0], le[1], 4)a = img.draw_circle(re[0], re[1], 4)a = img.draw_circle(nose[0], nose[1], 4)a = img.draw_circle(lm[0], lm[1], 4)a = img.draw_circle(rm[0], rm[1], 4)# align face to standard positionsrc_point = [le, re, nose, lm, rm]T = image.get_affine_transform(src_point, dst_point)a = image.warp_affine_ai(img, img_face, T)a = img_face.ai_to_pix()# a = img.draw_image(img_face, (128,0))del (face_cut_128)# calculate face feature vectorfmap = kpu.forward(task_fe, img_face)feature = kpu.face_encode(fmap[:])reg_flag = Falsescores = []for j in range(len(record_ftrs)):score = kpu.face_compare(record_ftrs[j], feature)scores.append(score)max_score = 0index = 0for k in range(len(scores)):if max_score < scores[k]:max_score = scores[k]index = kif max_score > 85:a = img.draw_string(i.x(), i.y(), ("%s :%2.1f" % (names[index], max_score)), color=(0, 255, 0), scale=2)sum_3+=1if sum_3 == 10:uart_A.write(b'i')print(sum_3)sum_3=0sum_4=0now_mode = 0else:a = img.draw_string(i.x(), i.y(), ("X :%2.1f" % (max_score)), color=(255, 0, 0), scale=2)#串口数据预留sum_4+=1if sum_4 == 10:uart_A.write(b'j')print(sum_4)sum_3=0sum_4=0now_mode = 0#特征值学习if flag_enter==1 :print('feature study')#features_data = uart_A.read()#if features_data:#stu_name = features_data.decode('utf-8')#print("stu_name=",stu_name)with open("/sd/features.txt", "a") as f:f.write(str(feature))  #信息写入SD卡record_ftrs.append(feature)            #人脸特征追加到record_ftrs列表#names.append(stu_name)          #追加到姓名列表f.write("\n")f.close()flag_enter=0uart_A.write(b'i')now_mode = 0sum_3=0sum_4=0#写入sd卡break

口罩检测

def mask_recognize():#print('Hello')global sum_1global sum_2global now_modecode = kpu.run_yolo2(task_mask, img)if code:totalRes = len(code)for item in code:confidence = float(item.value())itemROL = item.rect()classID = int(item.classid())if confidence < 0.52:a = img.draw_rectangle(itemROL, color=color_B, tickness=5)continue#有口罩if classID == 1 and confidence > 0.76:a = img.draw_rectangle(itemROL, color_G, tickness=5)if totalRes == 1:drawConfidenceText(img, (0, 0), 1, confidence)sum_1+=1if sum_1 == 10:uart_A.write(b'i')sum_1=0sum_2=0now_mode = 0blank()break#无口罩else:a = img.draw_rectangle(itemROL, color=color_R, tickness=5)if totalRes == 1:drawConfidenceText(img, (0, 0), 0, confidence)sum_2+=1if sum_2 == 10:uart_A.write(b'j')sum_1=0sum_2=0now_mode = 0blank()break

RFID程序

unsigned char ReadTagId(unsigned char *idout)
{unsigned char status;unsigned char i;unsigned char pkt[12];status = STATUS_ERR;if(Uart1RxDataConut > 0) //判断串口是否接收到数据{Delay(150000);  //等待串口接收完成,根据视情况调整延时if(Rx1Flag == 1)//判断串口是否接收到一帧完整数据{  Rx1Flag = 0;for(i=0;i<12;i++) //自动读卡号数据包固定为12字节{pkt[i] = Uart1RxBuf[i]; //将串口接收数组内的数据复制到pkt数组中}if(RxCheckSum(pkt,12) == STATUS_OK)  //判断校验和是否正确{if(pkt[4] == STATUS_OK) //判断是否正确的读到卡{//04 0C 02 20 00 04 00 45 96 B7 8A 3Fif((pkt[0] == 0x04)&&(pkt[1] == 0x0C)&&(pkt[2] == 0x02)&&(pkt[3] == 0x20))//对数据包进行判断{for(i=0;i<4;i++)//获取4字节卡号{idout[i] = pkt[i+7];//从数组的第7个字节开始为卡号,共4字节}if((idout[0] == 0xFD)&&(idout[1] == 0x68)&&(idout[2] == 0x01)&&(idout[3] == 0xAF)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else if((idout[0] == 0x5D)&&(idout[1] == 0xD2)&&(idout[2] == 0x56)&&(idout[3] == 0xAF)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else if((idout[0] == 0x4D)&&(idout[1] == 0xA0)&&(idout[2] == 0xFC)&&(idout[3] == 0xAE)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else if((idout[0] == 0x68)&&(idout[1] == 0x54)&&(idout[2] == 0xED)&&(idout[3] == 0x3D)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else if((idout[0] == 0x87)&&(idout[1] == 0x84)&&(idout[2] == 0xED)&&(idout[3] == 0x3D)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else if((idout[0] == 0xB6)&&(idout[1] == 0xDE)&&(idout[2] == 0xDC)&&(idout[3] == 0x6B)&&(Function4_Flag == 1))//对数据包进行判断{GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/three.jpg");Delay(4000000);TIM_SetCompare2(TIM2, 2500);Delay(20000000);TIM_SetCompare2(TIM2, 500);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}else {if(Function4_Flag == 1){GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_5);jpgDisplay("0:/four.jpg");TIM_SetCompare2(TIM2, 500);Delay(20000000);jpgDisplay("0:/one.jpg");Function4_Flag = 0;}}status = STATUS_OK;         //成功返回0}}}}for(i=0;i<Uart1RxDataConut;i++)//清空串口接收数组{Uart1RxBuf[i] = 0x00; }Uart1RxDataConut = 0x00;} return status;           //失败返回1
}

tips

1、人脸识别和口罩检测都是图像识别类的,在检测环境不良或者模型精度无法得到保证时,应该加入一个检测次数判断,比如设定识别成功10次才算成功,或者识别正确或者错误两者谁先达到这个阈值再判定最终结果。这个在我的人脸和口罩程序中均有体现,欢迎讨论。
2、STM32和K210的通信我没有采用通信协议,因为发送的字符串为简单的几个字母,且通信线长度很短,一般不用担心通信出错问题。
3、如果想要集成度高一点,大家可以采用串口屏,控制也可以用K210做,不过我用K210不够熟练,所以没采用它来干这活。
4、舵机最好跟控制系统分开供电,这样工作时不会影响系统的电压。(稳压管一定要调准确,不要接反。)

写在最后

我的这个课题属于视觉类,自己在一些底层识别算法的基础相较薄弱,大家如果跟我一样的话,建议先复刻一下别人的工程,再学习相关的识别算法,本人学习的是YOLO 相关的检测方法,内容大多跟卷积神经网络相关,数学要求较高,大家如果有什么学习的好办法欢迎分享鸭。这个工程大家如果有需要的可以联系我邮箱945520988@qq.com

基于K210的人脸识别门禁相关推荐

  1. 人脸识别门禁系统:基于Android的人脸识别门禁系统 毕业设计完整代码详细教程

    完整代码:https://download.csdn.net/download/qq_38735017/87382371 一.研究目的 传统的门禁系统以钥匙作为验证手段,便捷程度低,丢失钥匙之后会导致 ...

  2. 基于OpenCV的人脸识别门禁系统

    ======================================================================== 注:以下只是个玩具.比较成熟的2D人脸识别可以参考 & ...

  3. K210开发板学习笔记(一)——K210人脸识别门禁+SD卡实现人脸数据存储(附代码解读)

    基于K210的人脸门禁系统演示(按键录入人脸ID.人脸断电存储) 哔哩哔哩链接:https://b23.tv/MHXjhGa K210人脸识别门禁系统 一个按键实现所有功能. 具体功能: 在线人脸录入 ...

  4. python人脸识别门禁系统毕设_人脸识别门禁系统 毕业设计 可移植树莓派

    [实例简介] 基于python的人脸识别门禁系统,实现对人脸的录入与识别功能 ,毕业设计 附论文 可移植树莓派 [实例截图] [核心代码] 人脸识别毕业设计源码 └── 人脸识别毕业设计源码 ├── ...

  5. 基于Qt设计的人脸识别门禁系统(录入、识别、对比、删除)

    一.前言 随着现代科技的不断发展,现在的中国已经迈入5G时代,人工智能技术也正逐步广泛运用到了各行各业中,尤其人脸识别技术,已在各大行业中广泛使用.人脸识别门禁系统,可以防止陌生人尾随进入园区,大大降 ...

  6. 【毕业设计】人脸识别门禁系统

    基于MAIX BIT(K210)的人脸识别门禁系统 一. PCB设计 二. 硬件部分: 语音播报功能 16个ADC矩阵按键 一个蜂鸣器 一个压力检测模块 一块显示屏幕 语音播报可通过串口控制,可以容纳 ...

  7. 下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?

    通常情况下,工厂园区的人员流动都是比较频繁且巨大的.厂区的人员不断的进进出出,主要集中在上下班的时间段里面.对于工厂园区的管理人员来说,怎样管理好人员的进出安全与快捷高效通行,与此同时完成上下班的考勤 ...

  8. 商汤科技发布新一代SensePass工业级可视人脸识别门禁全新升级

    http://ex.chinadaily.com.cn/exchange/partners/77/rss/channel/cn/columns/4m6872/stories/WS5ce3b1ada31 ...

  9. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(二)

    一. 门禁考勤系统硬件设计 1 .硬件总体结构 PC端的intel处理器作为硬件平台的核心,是衡量系统能否达到标准的主要标志.本文结合考勤系统,采用intel i5处理器的PC与51单片机共同构建了门 ...

  10. 人脸识别门禁为何倍受青睐?

    传统门禁系统功能单一,随着技术迭代逐指纹.虹膜.人脸识别等等现代门禁越来越先进,近两年来人脸识别门禁的应用越来越多,尤其是在今年新冠肺炎下,人脸识别门禁系统发挥出了巨大的作用,人体测温+无接触开门避免 ...

最新文章

  1. 如何找同服务器下网站,利用bing查询同一服务器IP下的所有网站
  2. linux下使用C++操作mysql
  3. Zookeeper的ZAB协议和Leader选举过程剖析
  4. 图解TCPIP-传输层 UDP
  5. 爱奇艺开源轻量级插件化方案 Neptune
  6. 去除Vue在WebStorm中报命名空间的错误
  7. Gym 101915A(模拟)
  8. 声明,本博客文章均为转载,只为学习,不为其他用途。感谢技术大牛的技术分享,让我少走弯路。...
  9. MSN机器人-头像显示
  10. envi自定义坐标系
  11. Qt Creator启动慢的解决方法
  12. Error in driver during machine creation: Machine didn‘t return an IP after 120 seconds, aborting
  13. pc端下载微信视频号中的视频
  14. matlab计算复活节概率,复活节是几月几日_计算复活节日期_我爱历史网
  15. 最新苹果审核被拒4.3解决方案总结(2020年7月)
  16. html5怎么实现雨滴效果,HTML5实现晶莹剔透的雨滴特效
  17. uniapp打开地图选择位置(查看位置)详解
  18. 盘古开源:大数据赋能业务运营,自主研发实现新突破
  19. 通用对话框——FolderBrowserDialog
  20. object-position/object-fit

热门文章

  1. 让coreseek支持拼音检索
  2. 计算机的音量打不开,电脑没声音。音量控制也打不开怎么处理?
  3. 什么是列联表分析(Contingency table analysis)?
  4. Python小白基础--集合set
  5. mysql数据文件后缀名_数据文件的后缀名_MySQL
  6. python层次分析法案例_在R语言中使用层次分析法-案例1
  7. SEO面试的一些常见问题整理
  8. 不租服务器,自建个人商业网站(如何购买域名)
  9. 大小写转换(金额转换)
  10. 金仓数据库 KingbaseGIS使用手册(2. 简介)