zoukankan      html  css  js  c++  java
  • 系统综合实践期末大作业 第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相关应用更加熟练了,实验过程中遇到的问题不少,最主要还是因为个人近期有考试安排导致实验时间不够。在实验遇到问题时和组员一起交流学习,有很多的收获。

  • 相关阅读:
    javascript定时器,取消定时器,及js定时器优化方法
    Systen,IO
    批量地理位置解析
    数据库分区分表(sql、mysql)
    数据库还原的多种方式
    js前端文件收集(一)
    NPOI解决由于excel删除数据导致空行读取问题
    echarts2.0tooltip边框限制导致tooltip显示不全解决办法
    数据库备份通用脚本
    echarts 用marlkline画线 同时配置中含有datazoom,怎么设置markline
  • 原文地址:https://www.cnblogs.com/zys99/p/13200736.html
Copyright © 2011-2022 走看看