系统综合实践期末大作业 第32组

一、实验选题

本次期末大作业完成的是门禁系统,部署在树莓派上。通过调用人脸识别系统拍摄并识别人脸,如果识别到允许通行的人脸,则开门成功,将这条成功记录存入数据库,如果识别不到人脸,则需提示用户,否则存一条失败记录,里面有捕捉到的一张人脸图片。管理员可以在管理界面中查看门禁记录。

二、设计,重点说明系统部署所使用的容器

本次实验使用docker-compose定义与运行mysql容器和opencv容器,并使用各自的dockerfile构建镜像

首先是mysql数据库容器的构建


data文件夹是用于挂载数据库数据的文件
dockerfile用于构建mysql镜像并执行setup.sh以创建数据库
schema.sql包含了建表语句和allow表的初始数据插入语句
dockerfile

FROM   hypriot/rpi-mysql 
WORKDIR /usr/local/mysql
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD 123456
COPY setup.sh /usr/local/mysql/
COPY schema.sql /usr/local/mysql/
CMD ["sh","/usr/local/mysql/setup.sh"]

setup.sh

#!/bin/bash
set -e

echo `service mysql status`

echo 'starting mysql....'

service mysql start

sleep 3

echo `service mysql status`

echo 'creating database....'
mysql -uroot -p123456 < /usr/local/mysql/schema.sql

echo 'create database monitor successfully'

sleep 3

echo `service mysql status`
echo 'loading completed'

tail -f /dev/null

schema.sql

#创建数据库和表
drop database if exists monitor;
create database `monitor` default character set utf8 collate utf8_general_ci;

use monitor;

drop table if exists allow;

create table allow (
  `pictureID` int(5) not null auto_increment,
  `name` varchar(20) default '',
  `src` varchar(50) ,
  primary key (`pictureID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

drop table if exists record;

create table record (
  `ID` int(5) not null auto_increment,
  `dated`date ,
  `permitted` int(1) default 0,
  `src` varchar(50) ,
  primary key (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

drop table if exists face;

create table face(
  `faceID` int(5) not null auto_increment,
  `code` varchar(4095) ,
  `sourceID` int(5) not null,
  primary key (`faceID`),
  foreign key(`sourceID`) references allow(`pictureID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
#初始化allow表
insert into allow(name,src)
values ('liudehua','/usr/local/opencv/allow/liudehua.jpg'),('guofucheng','/usr/local/opencv/allow/guofucheng.jpg');

然后是opencv容器的构建

allow用于存放允许进入的人脸照片;photo用于存放opencv拍摄的照片;python用于存放项目代码
so是用于换源; .whl文件用于离线安装所需的python库;dockerfile用于创建镜像和环境安装

dockerfile

FROM sixsq/opencv-python
MAINTAINER gg
WORKDIR /usr/local/opencv
COPY ./face_recognition-1.3.0-py2.py3-none-any.whl /usr/local/opencv
COPY ./dlib-19.20.0-cp37-cp37m-linux_armv7l.whl /usr/local/opencv
COPY ./so /usr/local/opencv
COPY ./dlib-19.20.0-cp35-cp35m-linux_armv7l.whl  /usr/local/opencv
COPY ./face_recognition_models-0.3.0-py2.py3-none-any.whl  /usr/local/opencv
RUN sudo cat /usr/local/opencv/so > /etc/apt/sources.list && \
    sudo apt-get update && \ 
    sudo apt-get install -y python3-tk && \
    sudo pip install -i  https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip && \
    pip install PyMySQL -i https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    pip install --upgrade -i  https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=500 "picamera[array]" && \
#实在没办法,pip下载太慢了。。。
    python3 -m pip install wheel dlib-19.20.0-cp35-cp35m-linux_armv7l.whl && \
    python3 -m pip install wheel face_recognition_models-0.3.0-py2.py3-none-any.whl && \
    python3 -m pip install wheel face_recognition-1.3.0-py2.py3-none-any.whl 
这里简单介绍一下python文件夹中的py模块的功能和实现


allow.py:

包含getAllow()函数,实现从allow表中获取所有的允许通行的人脸的图片路径

face.py:

init_face()函数:实现调用getAllow()函数获取图片并通过face_recognition获取这些人脸图片的人脸特征码,并存入face表中,完成对face表的初始化; 

coding_to_str(face_encoding):将由face_recognition获得的人脸特征码由list类型转换成string类型
str_to_coding(str):将数据库face表中获得的特征码(string类型)转回list类型
insert_face(code,ID):向face表中插入数据
get_codes():获取face表中所有的人脸特征码
get_name():获取allow表中人脸的名字

record.py:

getRecords():获取record表中的所有记录
insert(src,permit):向record表中插入一条记录

init_face.py:

调用init_face(),实现face表的初始化,必须且只需要运行一次

compare.py:

compare(face_encoding): 调用get_codes(),获取人脸特征码,通过face_recognition.compare()函数与参数face_encoding比较,得到matches(类似['True','False',....]的List),如果matches里有一个为True,则说明有匹配的人脸,返回1,否则返回0;

getpicture.py:

take_photos(): 调用picamera模块进行拍照,并保存至/usr/local/opencv/photo/,并用拍摄时间(name=time.time())作为文件名,.jpg为文件后缀,                  
                                                                       返回图片保存路径

window.py: 实现GUI和两个按钮的点击事件

点击事件1:take_photos(): 调用getpicture.take_photos(),并用face_recognition模块载入该图片,获得该图片中人脸的locations,若len(locations) ==0,说明没有拍摄到人脸,此时会弹出消息框“there is no any face in this picture”,否则调用face_recognition模块获取该人脸所有的face_encodings,并调用compare.compare()函数一一比对,若有匹配的人脸数据则弹出消息框“Got it,you can now enter”,否则提示“you are not allow to get in”。

点击事件2:check():调用getRecord()获取record表中的所有记录,并一一显示出来

最后是docker-compose,yml文件

这里多的nginx和php容器是因为原本目标设计是靠php网页来实现程序的GUI并调用opencv容器里的人脸识别程序获取结果的,结果网上搜索不到相应的资料,于是只好采用在容器内部运行python GUI程序来实现程序的界面;然后我们觉得这个对我们其他容器没什么影响,就没有做修改。

version: "3"
services:nginx:
  image: mynginx
  container_name: mynginx_1
  build:
   context: .
   dockerfile: dockerfile_nginx
  ports:
   - "8081:8081"
  volumes:
   - ./web:/usr/html/
   - ./default.conf:/etc/nginx/conf.d/default.conf
  links:
   - php:php
 php:
  image: myphp
  container_name: myphp_1
  build:
   context: .
   dockerfile: dockerfile_php
  environment:
   MYSQL_PASSWORD: 123456
  volumes:
   - ./web:/usr/php
  links:
   - mysql:mysql
 mysql:
  image: mysql_0
  container_name: mysql_1
  build:
   context: ./mysql
   dockerfile: dockerfile
  ports:
   - "3306:3306"
  volumes:
   - ./mysql/data:/var/lib/mysql
 opencv:
  image: opencv
  container_name: opencv_1
  build:
   context: ./opencv
   dockerfile: dockerfile
  volumes:
   - ./opencv:/usr/local/opencv
   - ./web:/usr/local/web
   - /tmp/.X11-unix:/tmp/.X11-unix       #共享本地unix端口
  environment:
   DISPLAY: unix$DISPLAY                          #修改环境变量DISPLAY
  links:
   - mysql:mysql
  devices:                                                            #挂载视频设备
   - /dev/vchiq
   - /dev/video0

三、运行结果,展示容器启动后,程序的运行结果

gif

演示视频链接:
点我

四、组内分工+贡献比

学号 | 姓名 | 分工 | 贡献比 |
:-: | :-: | :-: | :-: | :-:
031702518 | 吴长星| 容器构建和实机操作|6|
031702526 | 周华| 数据库构建| 2 |
031702103 | 朱雅珊| 人脸识别代码的构建| 2 |

五、总结

  • 吴长星:这次实验用到了前几次实验的内容,特别是第二次和第七次实验,可以说这次大作业就是在这两次实验的基础上做好的,其中还学习了一些python代码的基础知识和简单GUI编程,对dockerfile与docker-compose.yml文件的编写有了更深入的理解,遇到的最大的困难还是队友离得太远,网络上交流终究还是有些吃力不讨好的感觉。

  • 周华:在本次实验之前,我对人脸识别只有一些粗略的了解,通过本次实验,加深了我对人脸识别原理的理解,也学到了很多东西,更明白了团队合作的重要性,在队友的帮助下,我的学习能力也取得了很大的进步,这门实验课让我受益匪浅。

  • 朱雅珊:通过本次实验,对opencv相关应用更加熟练了,实验过程中遇到的问题不少,最主要还是因为个人近期有考试安排导致实验时间不够。在实验遇到问题时和组员一起交流学习,有很多的收获。

posted @ 2020-06-28 00:45  两三  阅读(177)  评论(0编辑  收藏  举报