• 期末大作业(第十七小组)


    1.选题简介

    A.选题:

    我们的选题是付款认证应用。本次选题是在人脸识别的基础上进行扩展的应用功能。

    B.选题原因:

    人脸认证在生活中已经被广泛应用,无论是付款时的刷脸付款,亦或者门禁时进行的身份识别,方方面面都存在。我们选用了付款认证这一角度的实践,既是基于功能较为简单的实现,也有比较现实的意义。

    C.预期结果

    我们的付款认证应用基于网页端和树莓派进行实现,在网页端上进行付款的操作,在树莓派中实现人脸识别的脚本
    (1)网页端上拥有注册的功能,注册过程中需要上传一张带有人脸的照片进行数据的录入,以便其后进行人脸识别的认证。
    (2)网页端上拥有付款登录的功能,输入账户密码后,系统会要求用户进行人脸识别认证。利用树莓派的摄像头进行交互后,系统会依据后台的数据进行人脸识别,识别成功后则显示付款成功。
    (3)我们后续也许会添加更多的功能,以完善付款认证的应用。

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

    我们的项目包括网页前端,后端,和微服务部署三个部分

    A.微服务部署:

    我们刚开始预想的设计是按照之前的作业搭建LNMP服务器(Linux+Nginx+Mysql+PHP),但由于错误拉取镜像的缘故,导致浪费了大量时间,严重延缓了大作业的完成进度

    • 具体错误的原因:树莓派的linux系统架构是armv7,而拉取的mysql镜像却是amd架构(mysql官方镜像不支持arm),导致镜像不兼容,容器一运行便进入exit1状态(异常退出)

    更换为可用的镜像后,继续运行容器时,发现php容器始终无法工作

    • 具体错误的原因:php容器没有监听默认端口9000,导致nginx无法连接php

    寻找解决办法无果后,无奈之下拉取了网上现成的镜像直接运行容器(Nginx+PHP),没有搭建Mysql数据库

    并没有编写dockerfile,而是直接由命令运行容器

    • 容器运行:
    docker run -itd -P --name php --restart always -v /data:/data olivercj/php-fpm-arm:0.1 ##运行php容器
    docker run -itd -p 80:80 -p 443:443 --name nginx --link php --restart always -v /data:/data olivercj/ningx-arm:0.1 ##运行nginx容器
    
    • 创建nginx配置文件目录
    cd /data/webconfig/nginx/conf.d/
    
    • nginx配置文件default.conf
    server {
        listen       80;
        server_name  pi-board.local.com;//域名
    
        access_log   /data/web_log/nginx_log/pi_access.log main;
        error_log   /data/web_log/nginx_log/pi_error.log error;
    
        root /data/web_root/pi-dashboard/;
        location / {
            index  index.php index.html index.htm;
            try_files $uri $uri/ =404;
        }
    
        location ~ .php$ {
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            include        fastcgi.conf;
        }
    
    • 创建站点根目录
    cd /data/web_root
    
    • 拉取示例代码
    git clone https://github.com/spoonysonny/pi-dashboard.git
    

    然后将nginx重启,网页服务器搭建成功

    B.后端代码

    • 人脸识别代码
    import face_recognition
    import cv2
    import numpy as np
    import os
    video_capture = cv2.VideoCapture(0)
    
    known_face_encodings=[]
    known_face_names=[]
    face_locations = []
    face_encodings = []
    face_names = []
    process_this_frame = True
    
    def read_directory(directory_name):
        for filename in os.listdir(r"./"+directory_name):
            user_image=face_recognition.load_image_file(directory_name + "/" + filename)
            user_face_encoding = face_recognition.face_encodings(user_image)[0]
            known_face_encodings.append(user_face_encoding)
            known_face_names.append(filename)
    
    read_directory("picture")
    
    while True:
        ret, frame = video_capture.read()
    
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    
        rgb_small_frame = small_frame[:, :, ::-1]
    
    
        if process_this_frame:
    
            face_locations = face_recognition.face_locations(rgb_small_frame)
            face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
    
            face_names = []
            for face_encoding in face_encodings:
                matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
                name = "unknown"
                face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
                best_match_index = np.argmin(face_distances)
                if matches[best_match_index]:
                    name = known_face_names[best_match_index]
                    print('success')
                    
                    os.exit(0)
    
                face_names.append(name)
    
        process_this_frame = not process_this_frame
    
    
        for (top, right, bottom, left), name in zip(face_locations, face_names):
    
            top *= 4
            right *= 4
            bottom *= 4
            left *= 4
    
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
    
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
            font = cv2.FONT_HERSHEY_DUPLEX
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
            
        cv2.imshow('Video', frame)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        
    video_capture.release()
    cv2.destroyAllWindows()
    

    3.运行结果,展示容器启动后,程序的运行结果

    网站首页&&登录界面

    注册界面

    上传照片

    人脸识别

    识别失败

    识别成功

    4.最终的组内分工+贡献比

    • 严喜:编写人脸识别代码;20%
    • 古力亚尔:编写前端网页代码,编写博客;30%
    • 吕瑞峰:补充前后端代码,部署docker服务,编写博客;50%

    5.总结(组员分别撰写,统一提交)

    • 严喜:实现python代码的过程中,因为是初次接触python,所以遇到了很多问题,在组长的帮助下,最终还是完成了python脚本。在实现过程中,遇到的最大的问题是动态的获取图片的信息,网上找到的很多教程都不一样。经过这次实验,充分体会到了分工合作的重要性。
    • 古力亚尔:在编写前端代码过程中,遇到最大的问题就是php嵌入到html中,不过在队友的帮助下也解决了这个问题。在协助队友在树莓派上docker中完成web服务器搭建过程中,查阅了很多关于这方面资料,因此对微服务加深了理解,对docker容器有了更清楚的认识,虽然没帮到队友很大的忙,但是自己进步了很多,学习到很多陌生的知识。
    • 吕瑞峰:这次大作业的过程十分的坎坷,更遗憾的是还是没有做完。由于其他事物占据了部分时间,本次大作业的实验做的十分紧迫,我在负责搭建docker容器的过程中,遇到了很多难以解决的问题,因为树莓派和docker在国内的相关资料都相对稀少,解决问题的时候遇到了非常大的阻力,导致直到作业截止前几天进度依然非常缓慢。对我而言,一个人搭建docker容器是特别煎熬的过程,虽然在这过程中也有获得很多关于docker的知识,但还是希望以后不要在经历这种事了。
  • 相关阅读:
    vue 自定义指令
    vue 插槽
    vue 菜单跳转 页面错乱
    vue项目中使用elementUI的el-tabs组件 浏览器卡死问题 解决办法
    vue 环境配置
    移动端页面 问题 注意事项
    定义全局 强制刷新指令
    手机端样式 处理
    手机访问电脑本地开发的页面
    百度AI
  • 原文地址:https://www.cnblogs.com/ruifeng1/p/13200965.html
Copyright © 2020-2023  润新知