2020年系统综合实践 期末大作业 28组
1️⃣ 选题简介
-
选题名称
人脸识别门禁管理系统 -
选题背景
随着科技的发展,传统的门锁已经不能满足人们的安防需求,门禁系统也已经发展成为一套现代的,功能齐全的管理系统;然而老式门禁系统由于门禁卡复制成本低廉,指纹膜的可替代性;带来了一定的安全隐患。因此人脸识别门禁系统顺应时代潮流,结合人脸识别技术,通过扫描人脸图像,无感刷脸即可进门,不仅解决了老式门禁系统的安全隐患问题,还更加安全、便捷、智能,成为新时代的优秀产物。
-
选题内容
-
人脸识别管理系统
管理员通过账号密码登录系统;可进行添加住户信息,管理住户信息,修改密码等操作,还可以根据住户姓名,ID,楼号信息,日期等,查询住户信息和出入记录;并且可以查看陌生访客记录
-
人脸识别监控摄像
通过树莓派摄像头扫描人脸,若与数据库中住户信息的照片相匹配,则语音播报用户名,并且指示灯亮(代替开门操作);若与数据库中住户照片不匹配,则语音播报警告,指示灯暗
-
2️⃣ 系统设计
-
整体思路
借助树莓派的摄像头完成人脸识别的工作,实现身份认证、语音播报、灯光警报的功能。同时,利用docker搭建LNMP环境,部署一个基于人脸识别的门禁管理系统的web服务,以便使用者对住户的信息进行管理。
-
具体实现
-
人脸识别
最初的实现方案是将人脸识别的功能置于容器实现,但是在具体操作过程中,由于容器和宿主机之间存在较大的差异,具有很大的局限性,无法实现语音播报的功能。经过探讨和,我们最终决定将人脸识别的功能置于宿主机的python虚拟机中实现。在实际测试中,我们解决了容器中无法进行语音播报的问题,取得了不错的效果。(实现代码附于项目源码中)
-
LNMP(Linux+Nginx+MySql+PHP)环境搭建
结合了之前所学的课程,利用docker-compose实现LNMP环境的搭建。因为目前官方的MySql镜像不支持树莓派的arm架构,因此选用了支持arm架构的树莓派镜像hypriot/rpi-mysql作为MySql容器的基础镜像,而Nginx和PHP均为官方镜像。
- Nginx镜像构建相关文件
(1)dockerfile_nginx
FROM nginx MAINTAINER css<584979330@qq.com> EXPOSE 2020
(2)default.conf
server { listen 2020; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; # root /web/FaceRecognition; root /web ; location / { #root /web/html; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /web; fastcgi_pass myphp:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
- MySql镜像构建相关文件
(1)dockerfile_mysql
FROM hypriot/rpi-mysql MAINTAINER css<584979330@qq.com> ENV MYSQL_ROOT_PASSWORD 333 ENV MYSQL_ALLOW_EMPTY_PASSWORD no ENV MYSQL_USER pi ENV MYSQL_PASSWORD 123456 COPY ./my.cnf /etc/mysql/my.cnf
(2)my.cnf
# The MySQL database server configuration file. # # You can copy this to one of: # - "/etc/mysql/my.cnf" to set global options, # - "~/.my.cnf" to set user-specific options. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # This will be passed to all mysql clients # It has been reported that passwords should be enclosed with ticks/quotes # escpecially if they contain "#" chars... # Remember to edit /etc/mysql/debian.cnf when changing the socket location. [client] port = 3306 socket = /var/run/mysqld/mysqld.sock default-character-set=utf8 # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking character-set-server=utf8 # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 # This replaces the startup script and checks MyISAM tables if needed # the first time they are touched myisam-recover = BACKUP #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_limit = 1M query_cache_size = 16M # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. # As of 5.1 you can enable the log at runtime! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # # Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf. # # Here you can see queries with especially long duration #log_slow_queries = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M #binlog_do_db = include_database_name #binlog_ignore_db = include_database_name # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash # faster start of mysql but no tab completition [isamchk] key_buffer = 16M # # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/
- PHP镜像构建相关文件
(1)dockerfile_php
FROM php:7.4-fpm MAINTAINER css<584979330@qq.com> FROM php:7.4-fpm RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd
- docker-compose
(1)docker-compose.yml
version: "3" services: nginx: image: nginx container_name: mynginx build: context: . dockerfile: dockerfile_nginx ports: - "80:2020" volumes: - ./web:/web - ./default.conf:/etc/nginx/conf.d/default.conf php: image: php:7.4-fpm container_name: myphp build: context: . dockerfile: dockerfile_php environment: MYSQL_PASSWORD: 333 volumes: - ./web:/web mysql: image: mmysql container_name: mysql build: context: . dockerfile: dockerfile_mysql ports: - "3306:3306" volumes: - ./mysql_data:/var/lib/mysql
-
数据库结构
-
manager表
-
resident表
-
stranger表
-
record表
-
ResidentRecord视图
-
-
web服务——人脸识别管理系统( 项目源码 )
-
登录界面
-
功能界面
(1)住户管理:显示住户信息,可以通过不同的条件搜索目标信息,然后可以对搜索结果按选定条件进行排序,可对用户信息进行查看、修改以及删除操作。
(2)住户记录:显示住户进出记录,可以根据不同条件进行查询和排序。
(3)陌生访客:显示陌生访客的记录(包括时间和访问照片),可根据日期搜索陌生访客记录。
(4)添加住户:添加住户信息,主要包括住户的ID、姓名以及住址还有人脸图片。
(5)修改密码:修改管理员的信息。
-
3️⃣ 运行结果
第一步,启动容器
sudo docker-compose up
第二步,添加住户
第三步,住户管理界面查看信息
点击"查看"按钮即可查看用户相应信息,也可对其进行相应修改。
第四步,运行人脸识别代码
在人脸识别的基础,我们还增加了语音播报功能和亮灯功能。
python text.py
- 因语音播报无法用图片展示,可查看以下视频
链接:https://pan.baidu.com/s/1nDO7ODtDN1zxKvwZdnw6rw
提取码:uxao
第五步,查看住户记录
第六步,验证陌生访客功能
先删除住户陈珊珊的信息,然后进行人脸识别
在陌生访客界面即可看到陌生访客的信息
有陌生访客时会进行语音播报,播报内容为"抱歉,您不能进入",可查看以下视频验证语音播报功能
链接:https://pan.baidu.com/s/1jofXBdDc-OILXG-CGqbDIA
提取码:f2nv
-
人脸识别门禁系统介绍及具体操作视频
链接:https://pan.baidu.com/s/1b_qffc5FnOs72ev8wM1K4w
提取码:r79f
4️⃣ 组内分工
学号 | 姓名 | 承担工作 | 贡献比(100%) |
---|---|---|---|
031702311 | 陈珊珊 | 树莓派实际操作,系统运行测试, 博客撰写,前端部分模块的编写 |
35 |
031702336 | 林家伟 | 人脸识别代码的设计和编写, 前端主要模块的编写,数据库设计 |
30 |
031702321 | 林鑫灿 | 协调小组成员的工作,服务器功能模块的实现, 数据库设计,参与树莓派操作 |
35 |
5️⃣ 总结
-
陈珊珊
转眼之间,一学期就要过去了,刚开始的时候就觉得这门课结束以后自己会收获很多,果然是这样的!!!自己在这门课上付出了很多的时间,可能在完成作业的时候会因为遇到问题长时间没有找到方法解决的时候会有点崩溃,但是最后经过不懈努力解决了之后自己真的学会了很多,同时也变得更加有耐心。通过这门课,我从一无所知的状态下,到现在知道怎么样进行环境搭建、定义web容器及数据库容器等等,甚至懂得了利用树莓派进行人脸识别、语音播报、控制灯亮灭。真的感谢这门课的存在,让自己收获了很多知识,再次让我坚信有付出就会有回报!!!
-
林家伟
本次实验中,我主要负责前端设计,代码编写和人脸识别代码的编写;在前端代码的编写上,我设想将不同的功能封装成独立的模块聚集在一份html文件上,通过选择功能的按钮显示不同的功能模块界面,此外,动态的生成表格,显示与隐藏查询按钮组,动态生成日历等一些细节的功能,都给我带来了一些实现上的困难,开发过程中一度走在弯路上,做了很多无用功导致我十分痛苦(主要还是以前的实践更偏向与后端代码的编写,第一次感受到前端开发的痛苦);相比而言,人脸识别代码就友好很多了,在借鉴了上次实验的人脸识别代码,加入对数据库的交互操作,对视频帧的捕捉和保存等,算是比较简单轻松了。这学期下来,对于树莓派,docker部署等从一无所知到现在有了一定了解,认识到了树莓派的有趣的地方,点亮了一颗新的技能树,基础成就get。
-
林鑫灿
一个学期下来,自己在这门课上可以说下足了功夫,花费了大量的时间。好在付出的时间没有白白浪费,自己也有所收获。通过一个学期的学习和实践,我觉得最大的收获就是自己从一只一无所知的docker小白,逐步成长为能够熟练使用docker进行容器的部署和管理的小菜鸡,甚至能够利用docker进行简单项目的开发。另外一个收获就是接触了树莓派,学习了树莓派的基本特性和操作,利用树莓派实现了人脸识别、语音播报、接LED灯控制灯亮等功能,从实际开发过程中体会到了树莓派的魅力,初步认识了树莓派作为微型计算机的基本使用方式。希望在未来的学习或者工作中能够很好地学习和利用微服务进行一些具有实际意义的开发!(完结,撒花🌸🌸🌸~)