期末大作业

期末大作业

第23大组 sudo rm -rf

一、选题简介

1.选题背景

疫情期间,无接触测温与人员进出登记带来的问题。

2.选题内容

通过超声波测距模块测定外来人员的距离,在合适的距离范围内触发拍照进行人脸识别(face_recognition),
进而通过MLX90614BAA红外测温模块测量温度,判断人员是否发热,
通过0.96寸OLED屏幕显示人员姓名温度,从而选择开门(舵机模拟),或者报警(短信+邮件+蜂鸣器)

二、设计

设计部分,分为三个部分 识别端、前端和后端

整体思路

1.识别端

(1).设计思路

识别端的主要任务是:从后端同步人脸特征向量,超声波测距,拍照识别,温度检测,回传签到信息,OLED屏显,蜂鸣器报警等

识别端电路

识别端工作流程图

(2).容器选用

容器上选择了第七次作业用到的集成好opencv的sixsq/opencv-python容器,在其基础上安装好 "picamera[array]" dlib face_recognition luma.oled requests smbus
然后部署我的代码

2.后端

Github https://github.com/zaqny/smart-door

(1).设计思路

arch

  1. 管理员通过浏览器访问前端页面(nginx),先上传人脸照片到人脸特征向量服务器(face_recognition+flask),服务器进行人脸的保存和转换,返回特征向量给前端。
  2. 前端提交相关信息和人脸相特征向量给Ktor服务器(tomcat),Ktor服务器把数据保存到数据库(mariadb)。
  3. 树莓派调用后端API(tomcat)进行人脸数据同步。
  4. 用户通过树莓派进行人脸识别、测温,如果温度正常则开门,否则会引起蜂鸣、短信警报和邮件警报(flask)。
  5. 管理员通过前端页面,可以查看签到记录、人脸录入信息。

(2).容器选用

  • nginx 用于访问前端静态页面,并提供反向代理
  • tomcat 运行Restful后端,为识别端和前端提供API接口(JWT进行身份验证)
  • mariadb 数据存储
  • aaftio/face_recognition 已预装python/opencv/face_recognition,添加flask后,可为前端提供生成人脸特征向量的接口
  • Python 短信\邮件警报服务

nginxtomcatmariadb三个容器耦合度较大,故使用docker-compose打包运行。人脸特征向量生成与警报服务单独运行,可以随时停用、重启,而不影响前三个容器的使用。

3.前端

前端主要包含四个页面,登录、登记注册、登记注册记录、签到记录

三、运行效果

后端容器:

ps

logs

识别端容器:

请看视频:

四、分工与贡献比

  • 识别端:33%
    16.5% 朱庆章 外围硬件的驱动和主程序的逻辑
    16.5% 潘海东 人脸识别和主程序的逻辑

  • 后端:34%
    18% 张庆焰 除特征向求算接口以外的其他所有接口
    16% 朱宏 求算特征向量接口、邮件报警和短信报警

  • 前端:33%
    18% 姚彬锟
    15% 陈梦雪

五、总结

  • 朱庆章:
    1.作为这个大组的组长,首先感谢队友们的通力合作,让我在答辩的时候胸有成竹。
    2.因为我主要负责识别端这边的设备驱动和逻辑编写,翻阅了很多datasheet,特别是测温的模块,网上没用什么使用树莓派驱动它的资料,都是51和Arduino为主。之前也没怎么涉及过硬件驱动的编写,所以上手前花了不少时间查阅资料。到后来上手写起来发现还是比较容易的。
    3.队友对于各自的业务都很熟悉且能力强,沟通上几乎毫无障碍。定好题目后,辅以processon的流程图,我们在逻辑上交流探讨很顺畅,队友对我的需求都能准确了解,使我可以安心完成我这边的程序,而不用花费过多时间来沟通。
    4.在这次的实验中,从收获方面来说,我对于Python的面向对象和多线程有了更好的理解。涉及到外设的驱动我全部封装成类(这会儿再写面向过程就很不合适)。由于这些外围设备的存在,显然,我们的程序需要写成多线程的形式,然而Python的threading类并没有结束线程的方法,这不能满足我们程序的需求,优雅地结束线程而不犯错是我这次比较大的收获。

  • 张庆焰:通过这次实验,算是完成了第一个完整的后端项目,尝试了一个比较新的Web框架Ktor,并且学习了如何把应用部署到服务器上,学到了很多后端知识。比较让我印象深刻的就有:前后端分离产生的跨域问题、nginx多路由的配置、热部署、JWT认证、MySQL字符集问题、用gradle打包war等等。很多时候遇到bug光看服务器端的日志还不够,要对请求进行抓包才能分析出来,于是学会了Fiddler的使用。和前端进行联调的时候,也学习到了一些前端知识。总的来说收获满满。

  • 潘海东:在本次大作业中,我负责的是识别代码的编写,与庆章同学两个共同完成树莓派端的功能。具体流程为:讨论确认好需要完成的功能、制作功能能流程图、个人代码编写、代码整合与调试、最终功能实现。我主要负责与硬件功能无关的流程实现,然后庆章同学负责实现与硬件相关的代码功能,之后再把两部分代码链接在一起。我整个代码编写过程是比较顺利的,我把它归功于前期讨论得比较充分吧,并没有遇到难以解决的问题,也可能是有过相关经验吧,我曾经做过类似的项目,基于face_recognition实现点名签到的app。由于硬件实现的难度比较大,庆章同学比我花更多的时间去完成喝测试代码。由于是居家线上教学,我们小组内也都是通过线上交流,线上合作。相对于线下,还是有挺多需要克服的地方。如代码的测试,硬件功能的调试等,只能分给单独的某个同学去实现,负担会比较大。但这也是为以后的工作累积宝贵的经验,也学到了很多之前没有接触过的新知识。

  • 朱宏:在本次项目实验任务中,我主要负责后端短信报警和邮件报警api的编写与部署以及特征向量的获取。 特征向量的获取比较简单属于之前实验中的部分并稍微加以修改。短信报警主要是利用twilio的云通信短信SMSapi,加以框架flask后上线后端。邮件报警是以SMTP服务api,同样包装框架flask。因为之前对这两部分api以及flask框架完全不了解,现学了一些知识。这中间有碰到Windows下flask框架上线后 ,放进docker里却跑不起来 ,后面发现是twilio属于国外服务器 中间的信息交互太慢 也导致我的短信可能会收不到但是后台有数据。总之,通过小组间的项目实战还是更加了解了后端的运行以及flask框架的应用,学的时候虽然很懵,但是上线完后还是很有成就感的。

  • 姚彬锟:本次实验我主要的任务是前端页面代码的编写以及和后端的交互,我用的是web前端开发,在这门课之前虽然有涉及了解到一些html、css和js、php等知识,不过自己写出一个完整web项目的界面还是没有的,通过ajax获取后端的数据来进行显示。本次实验遇到的困难还是很多的,就比如后台获取和发送数据到后端,以前没有涉及,不过万事开头难,在学习了相关知识后也是克服了这一问题。不过主要还是自己对这些知识没有一个很完整的框架,对很多属性了解的也不多,要开发一个美观的界面并不是那么容易,不过好在也是设计了一个不会很丑的界面。虽然过程艰辛,但是获得的也很多,特别是激发了我对开发这一方面的兴趣,也体验到了团队之间,分工合作,然后一起讨论一起交流,寻求帮助,完成一项任务的乐趣。不过遗憾的是只能在线上交流,没办法聚在一起线下完成一些东西,从而学到更多。

  • 陈梦雪:本次实验我主要负责的是前端这一块,说实话之前我很少接触到web,仅在计算机图形学这门课有接触到,但实际上对前后端交互是完全不懂的。依靠百度慢慢做起来,但是我学的比较慢,可能也和经验少有关,虽然用datatable这个插件做了下一页和排序,但是效果不好就弃用了。总之这段时间我虽然做出来的成果不够多,但是摸索却摸索了很久,对ajax和datatable有了自己的理解。这其中我们的组长大人和彬锟同学还有我没有选这门课的舍友也给了我非常大的帮助,特别是我们的组长大人实在是伟大,这大概就是强者的能力吧○| ̄|_

posted @ 2020-06-28 01:00  Jorgensen  阅读(2753)  评论(1编辑  收藏  举报
#site_nav_under { display: none; } .c_ad_block, .ad_text_commentbox { display: none; margin: 0; padding: 0; } #ad_under_google { height: 0; overflow: hidden; } #ad_under_google a { display: none; }