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
,右键选择设置,在 subnet
里面的 /
后面的 28
是子网掩码。因此只有在配置的 ip
以及这个掩码底下的 ip 才能和 docker 成功通信,关于子网掩码和 ip 地址的关系可以在这个答案中学习到。我将 192.168.3.0/28
理解为起始 ip
地址 与 能和它构成局域网的主机个数。因此想要和 docker 通信,必须在这个局域网下面。
添加 docker 国内镜像
更改好子网配置,接下来就是要更改 docker 的镜像,docker 的镜像我推荐腾讯的,实测比较快速。
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
在 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
地址,这个地址有两种查询方法:
ipconfig
命令,在终端输入ipconfig
查看虚拟网卡的IP
地址。- 在网络管理中查看,在网络状态里右键有
Hyper-V
字样的网卡,选IPv4
的属性就能看到IP
地址了
此外还要删除无用的代码,在 loginsucc.php
文件中有一行引用 DqLoader.php
的代码,这个 DqLoader.php
文件已经不存在了,可能是作者忘了删除,实测删除后没有产生问题,建议删除。
更改 MySQL 身份验证的方式
更改 PHP
端代码后, PHP
还不能正常连接 MySQL
。因为现在流行的 MySQL
已经是 8.0 及以上的版本了,参考文章了解到:新版 MySQL
已经更新了更安全的身份验证方式。文章中,要求在 my.config
文件中添加配置字段,但是可能会遇到没有这个文件的情况,参考文章对于 centos
系统的配置,我推测应该只要创建新的文件就可以了。创建新文件后,建议使用文本编辑器进行字段编写,不要用 win 自带记事本 !!!
添加完毕字段,还要特别的更改一下 root
用户的身份验证方式。再次参考文章得知,在运行更改用户身份验证方式的代码后一定要加入 flush privileges;
代码来更新系统表的状态!
更改 MySQL 远程连接的权限&建库和表
由于 docker
与 MySQL
不在同一个 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
- 安装 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
- 安装 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
,我更改后的代码为:
挂载路径 path
为 C:/Users/***/Desktop/data1
这种路径,注意区分路径大小写。
- 安装 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
- 安装 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/
--net=host
亲测无效,只能使用-p
来占用固定端口,想要了解--net=host
的原理,可以参考这篇文章sed -i
命令是更改文件原文的措施,为了添加PHP
的一些扩展功能,必须写这两句,每次都要执行,具体sed
命令的使用,可以参考这篇文章。docker run
命令后面的/bin/bash
的作用是为了防止容器启动就销毁,但是我在win
版docker
上发现,加了-it
就可以不用加/bin/bash
,具体/bin/bash
的原理可以参考这篇文章。
这两个容器第一次安装需要一定时间,安装好后确认 MySQL 开启就可以进入下一步了。
后端算法部分更改&测试
删除原始的 lmdb
文件夹中的 mdb
文件和 annoy
算法所需的 nn
文件,文件夹是不用删除的。
做完以上所有任务,就可以进行测试了。在 Windows
系统中使用浏览器输入 http://localhost:9988/login.php?op=login
就可以访问页面了,如果你能正常的注册与登录就算是成功了,
小结&鸣谢
读完这篇文章可能很多人要问为什么想到要用 win
来实现这个项目。这里有必要解释一下,由于手头没有能用的云端服务器,但是课程设计又急需成果。我只好选择 win
版的 docker
来解“燃眉之急”。结果没想到遇到了比想象中多得多的问题。有的是因为自己对很多基础知识的不了解,有的也是因为一些老旧代码产生的坑,导致弄了 3-4
天才成果复现,最后要感谢期间给了我很多帮助的鞠老哥和男哥。之后一定要补一下计算机网络的知识!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于