Windows10 环境复现人脸登陆项目— —face-login

本贴最后更新于 1563 天前,其中的信息可能已经天翻地覆

Windows 10 环境复现人脸登陆项目— —face-login

项目简介

face-login 项目是一个利用人脸识别检测来注册登录项目。

项目的人脸检测基于:js 前端的粗略检测 + mtcnn ,而人脸识别使用的 facnet + 高效的 annoy 索引。前后端的连接使用 websocket

整个项目作者已经贴心的上传到百度云,项目原地址的 readme 文件里写了很多内容细节,但是原版本是基于 Linux 系统的,而且一些代码已经过时,本文章主要为 win10 开发者复现项目提供一些帮助,其中也涉及了一些网络知识。

安装 docker & 下载项目

首先根据教程:win10 安装 docker 教程安装 win 版本 docker ,注意以下几点:

  • win10 版本必须是专业版,不能是家庭版!
  • Windows 开启虚拟化
  • 一定要打开 Hyper-v

确保以上几步并安装好 win10 版的 docker 我们就可以继续复现项目了,使用百度云下载好项目,解压后把文件名改为 face-login

配置 docker 子网

Windows 版本 docker 需要先更改一下子网 ip ,这一点是网上搜了很久没搜到的。
运行 Docker Desktop ,右键docker 小鲸鱼选择设置,在 subnet 里面的 / 后面的 28 是子网掩码。因此只有在配置的 ip 以及这个掩码底下的 ip 才能和 docker 成功通信,关于子网掩码和 ip 地址的关系可以在这个答案中学习到。我将 192.168.3.0/28 理解为起始 ip 地址 与 能和它构成局域网的主机个数。因此想要和 docker 通信,必须在这个局域网下面。
image.png

添加 docker 国内镜像

更改好子网配置,接下来就是要更改 docker 的镜像,docker 的镜像我推荐腾讯的,实测比较快速。

  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ],

image.png

在 docker engine 中添加这段代码,我测试了几个镜像,就这个比较快。添加好镜像,一会 pull image 才会快。

更改 PHP 关于摄像头的代码

如果你现在就运行 readme 文件中安装容器的代码,在网址中输入 http://localhost:9988/login.php?op=login ,你会发现点击了小摄像头也不会有任何画面出现。这是第一个代码老旧导致的。参考知乎的这篇答案,我将项目内所有 PHP 代码中的 vedio.src=window.URl.createObjectURL(strem) 都改成了 vedio.srcObject = strem

这里的 strem 不是我拼错了,是代码里的变量就是 strem 。😆

更改 PHP 关于 MySQL 的代码&删除无用代码

接下来要完成的是 PHP 代码中与 MySQL 连接的部分,这部分代码在文件 DqMysql.php 中,其中 16-22 行更改如下

$user = 'root';                                  //数据库连接用户名
$pass = '*****';                                 //对应的密码
$dsn = "mysql:host=192.168.205.***;dbname=face;" //其中host对应的是在`win`中查看虚拟网卡的地址

这段更改中 host 对应的是虚拟网卡的 IP 地址,这个地址有两种查询方法:

  1. ipconfig 命令,在终端输入 ipconfig 查看虚拟网卡的 IP 地址。image.png
  2. 在网络管理中查看,在网络状态里右键有 Hyper-V 字样的网卡,选 IPv4 的属性就能看到 IP 地址了image.png

此外还要删除无用的代码,在 loginsucc.php 文件中有一行引用 DqLoader.php 的代码,这个 DqLoader.php 文件已经不存在了,可能是作者忘了删除,实测删除后没有产生问题,建议删除。

更改 MySQL 身份验证的方式

更改 PHP 端代码后, PHP不能正常连接 MySQL 。因为现在流行的 MySQL 已经是 8.0 及以上的版本了,参考文章了解到:新版 MySQL 已经更新了更安全的身份验证方式。文章中,要求在 my.config 文件中添加配置字段,但是可能会遇到没有这个文件的情况,参考文章对于 centos 系统的配置,我推测应该只要创建新的文件就可以了。创建新文件后,建议使用文本编辑器进行字段编写,不要用 win 自带记事本 !!!

添加完毕字段,还要特别的更改一下 root 用户的身份验证方式。再次参考文章得知,在运行更改用户身份验证方式的代码后一定要加入 flush privileges; 代码来更新系统表的状态!

更改 MySQL 远程连接的权限&建库和表

由于 dockerMySQL 不在同一个 IP 地址下,属于局域网之间的连接,是远程连接范畴,需要配置 MySQL 远程权限。参考文章,可以轻松配置远程权限。同样注意,配置好权限后要用代码 flush privileges; 刷新系统表状态。

更改完权限后,手动在 MySQL 中建 face 库,建 face_user 表:

create database face;
CREATE TABLE `face_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `img` varchar(1024) NOT NULL DEFAULT '',
 `user_name` varchar(1024) NOT NULL DEFAULT '',
 `email` varchar(1024) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

docker run 部分代码的更改

原文章中给出的代码为:

假设项目路径为/data1/face-login

  1. 安装 face_server 容器
docker run -it --name=face_server --net=host  -v /data1:/data1  shareclz/python2.7.10-face-image /bin/bash
cd /data1/face-login
rm -rf  /data1/face-login/models/facedetect/20180408-102900/._model-20180408-102900.meta
python face_server.py
  1. 安装 face_web 容器
docker run -it --name=face_web --net=host  -v /data1:/data1   shareclz/php7.2.14 /bin/bash
sed -i "s/extension='swoole.so'//g"  /usr/local/lib/php.ini          
sed -i "s/extension='pthreads.so'//g" /usr/local/lib/php.ini          
cd /data1/face-login;
php -S 0.0.0.0:9988 -t ./web/ 

针对 win 版本的 docker ,我更改后的代码为:
挂载路径 pathC:/Users/***/Desktop/data1 这种路径,注意区分路径大小写

  1. 安装 face_server 容器
docker run -it --name=face_server -p 9999:9999  -v path:/data1  shareclz/python2.7.10-face-image /bin/bash
cd /data1/face-login
rm -rf  /data1/face-login/models/facedetect/20180408-102900/._model-20180408-102900.meta
python face_server.py
  1. 安装 face_web 容器
docker run -it --name=face_web -p 9988:9988  -v path:/data1   shareclz/php7.2.14 /bin/bash
sed -i "s/extension='swoole.so'//g"  /usr/local/lib/php.ini          
sed -i "s/extension='pthreads.so'//g" /usr/local/lib/php.ini          
cd /data1/face-login;
php -S 0.0.0.0:9988 -t ./web/
  1. --net=host 亲测无效,只能使用 -p 来占用固定端口,想要了解 --net=host 的原理,可以参考这篇文章
  2. sed -i 命令是更改文件原文的措施,为了添加 PHP 的一些扩展功能,必须写这两句,每次都要执行,具体 sed 命令的使用,可以参考这篇文章
  3. docker run 命令后面的 /bin/bash 的作用是为了防止容器启动就销毁,但是我在 windocker 上发现,加了 -it 就可以不用加 /bin/bash,具体 /bin/bash 的原理可以参考这篇文章

这两个容器第一次安装需要一定时间,安装好后确认 MySQL 开启就可以进入下一步了。

后端算法部分更改&测试

删除原始的 lmdb 文件夹中的 mdb 文件和 annoy 算法所需的 nn 文件,文件夹是不用删除的。
做完以上所有任务,就可以进行测试了。在 Windows 系统中使用浏览器输入 http://localhost:9988/login.php?op=login 就可以访问页面了,如果你能正常的注册与登录就算是成功了,

小结&鸣谢

读完这篇文章可能很多人要问为什么想到要用 win 来实现这个项目。这里有必要解释一下,由于手头没有能用的云端服务器,但是课程设计又急需成果。我只好选择 win 版的 docker 来解“燃眉之急”。结果没想到遇到了比想象中多得多的问题。有的是因为自己对很多基础知识的不了解,有的也是因为一些老旧代码产生的坑,导致弄了 3-4 天才成果复现,最后要感谢期间给了我很多帮助的鞠老哥男哥。之后一定要补一下计算机网络的知识!

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    490 引用 • 916 回帖 • 2 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 人脸识别
    2 引用 • 4 回帖
  • 项目复现
    1 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • w2220942

    楼主你好啊,我也在用 windows 做这个项目,但是我安装了容器 输入 http://localhost:9988/login.php?op=login 这个链接浏览器没有反应。。

    两个容器都装了,状态如下:

    image.png

    image.png

    不知道是我步骤出了什么问题吗。。还请赐教

    1 回复
  • jkjkiiiii
    作者

    你好,项目久远很多细节我已经不记得了.....不过浏览器没反应你可以试试别的链接,看看 flask 有没有反应根据反应改一改