刷脸开门-260612

更新-260612 | 发布-260612

✳️ CONTENT

实验简介

关于MTCNN和FaceNet


MTCNN(Multi-task Cascaded Convolutional Networks)是一种用于人脸检测的级联卷积网络。它通过三个子网络(P-Net、R-Net、O-Net)逐步筛选候选框,同时输出人脸边界框和五个关键点(双眼、鼻子、左右嘴角)。其优势在于兼顾检测精度和速度,且对遮挡、光照有一定鲁棒性。

FaceNet 是 Google 提出的人脸识别网络,核心思想是将人脸图像直接映射到 128 维或 512 维的欧几里得嵌入空间。它使用三元组损失(triplet loss)训练,使同一个人的人脸嵌入距离小、不同人的人脸嵌入距离大。FaceNet 可直接用于人脸验证(比较距离是否小于阈值)、识别(最近邻分类)和聚类,省去了传统的 softmax 分类层,特征泛化能力很强。

简单来说:MTCNN 负责“找出人脸在哪”,FaceNet 负责“判断是谁的人脸”,两者常串联构成完整的人脸识别流程。

关于开发板


本次实验将使用 kunpeng-log 鲲鹏开发板,完成推理验证。


实验任务


基于开发板,采用摄像头自动抓取人脸图像,小组成员的人脸能够识别,识别成功显示 “开门成功”,小组以外成员不能识别,显示 “开门失败”。


实验目的


通过本次实验,期望达成以下目的:

  1. 了解 MTCNN 和 FaceNet
  2. 做一个 刷脸开门 系统
  3. 进一步掌握开发板的使用
  4. 进一步熟悉 Linux 相关操作
  5. 增加解决问题的经验

账号信息


相关账号信息如下:

  • 开发板(账号/密码): HwHiAiUser / Mind@123
  • 开发板(账号/密码): root / Mind@123
  • WiFi(名称/密码) : b102 / b102b102

注意事项


敬请关注以下事项:

  • 🚫 禁止:水杯、水瓶等,不要放在桌上。临时放桌上,则要拧紧盖子。液体泼洒会损坏开发板。
  • 建议:书包等物品放实验室四周空闲处。以提高效率,并防止器材跌落。
  • 建议:电源线等,都从中间穿到桌面上。以提高效率,并防止器材跌落。

0-上电开机


插上电源即可开机:

  • 前面板有2个 Type-C,电源插入➡️边上那个。
  • 拿掉顶部的磁吸盖子,看到2个绿灯亮,✴️ 并且风扇在转,就表示开机完成。

1-连网线


将PC(个人电脑)和开发板用网线连起来:

  • 网线一端连接PC(个人电脑),另一端连接开发板的以太网口。
  • 开发板以太网口指示灯绿色常亮,黄灯闪烁,表示连线正常。

2-设置PC(个人电脑)IP


将 PC(个人电脑)的 IP 地址设置为和开发板同一个网段,以便通过网线访问开发板。以 Windows 为例:打开 设置 | 网络和Internet,找到连接开发板的网络适配器(通常叫 以太网;如有多个,请修改连接开发板的那个),修改 IP 地址的相关设置。

  1. DHCP:手动(Manual)

  2. IPV4:ON

  3. IP地址:输入 192.168.137.111

    ✴️ 不能把PC(个人电脑)的 IP 地址,设置成 192.168.137.100。因为该地址是开发板的 IP 地址。

  4. 子网掩码(或子网掩码长度

    • 掩码:255.255.255.0
    • or 子网掩码长度:24
  5. (可选)网关192.168.137.1(不会用到)

  6. 点击 保存 按钮


3-ssh登录


可用 MobeXterm 软件登录,或在本地电脑执行:

ssh HwHiAiUser@192.168.137.100

如果遇到以下报错信息:

~ % ssh HwHiAiUser@192.168.137.100
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...

可以先执行以下命令:

ssh-keygen -R 192.168.137.100

然后再尝试 ssh HwHiAiUser@192.168.137.100


4-连接外网


开发板上电开机后,先让开发板连接外网,即能访问互联网。后续创建本次实验所需的 Python 虚拟环境,需要开发板能访问外网。

执行以下命令连接 WiFi:

sudo nmcli dev wifi connect "b102" password "b102b102"

连接成功后可看到屏幕提示信息类似如下:

(base) HwHiAiUser@orangepiaipro:~$ sudo nmcli dev wifi connect "b102" password "b102b102"
Device 'wlan0' successfully activated with '50e4b905-bffb-46d3-afbe-f35c2627e16b'.

连接外网后,在开发板上执行以下命令,验证是否确实能访问外网:

curl -fsSL www.baidu.com

5-获取源码


下载样例压缩包(源码+数据)到本地 PC(个人电脑),并上传开发板,然后解压缩。

  1. 下载样例压缩包江大云盘↗

    压缩包文件名是:mfacenet260612.zip

  2. 在开发板上新建目录:

    mkdir ~/oss0612
    

    (1)该目录的完整路径是:/home/HwHiAiUser/oss0612
    (2)oss 是 “open sesame 芝麻开门”的意思。

  3. 上传压缩包到开发板的实验目录中

    用 MobaXterm 软件传文件。请参考:MobaXterm简要说明↗ | 传文件

    或者在本地电脑敲命令传文件。请参考:Linux常用操作↗ | scp 远程复制文件/目录。比如进入压缩包保存的目录后,执行:

    scp mfacenet260612.zip HwHiAiUser@192.168.137.100:/home/HwHiAiUser/oss0612
    
  4. 在开发板上解压缩

    先切换目录:

    cd  ~/oss0612
    

    再解压缩:

    unzip mfacenet260612.zip
    

    解压缩后生成子目录 mfacenet,完整路径应该是:/home/HwHiAiUser/oss0612/mfacenet。


6-创建环境


在虚拟环境中开展实验,可和开发板上的其他项目互不影响。

  1. 创建 conda 虚拟环境

    conda create -n eoss0612 python=3.11
    
    • ✅ Conda 应该是正常的。如果不能成功创建虚拟环境,请实验室老师协助。
    • ❌ 不要参考AI的建议,对 Conda 的相关设置做修改。
    • 在虚拟环境中开展实验,可和开发板上的其他项目互不影响。
  2. 激活虚拟环境:

    conda activate eoss0612
    
  3. 在虚拟环境中安装 PyTorch (CPU 版)

    先安装 CPU 版本的 PyTorch 和 torchvision:

    pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cpu
    

    增加 --index-url ... 是避免安装不必要的 nvidia 相关的包。

    ✳️ 要先激活虚拟环境,从而确保在虚拟环境中安装相关软件(而不是安装到其他环境中)。相关操作请参考:Conda指南↗

  4. 安装其他依赖库

    先切换目录:

    cd ~/oss0612/mfacenet
    

    再安装其他需要的包:

    pip3 install -r requirements.txt
    

    如果安装速度较慢(主要是下载速度较慢),可以尝试:pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple



提示:

  • ✴️ Conda(Python)虚拟环境(本文名称样例是 eoss0612),创建一次即可。不需要反复重复创建。
  • ✳️ Conda 相关操作请参考:Conda指南↗

7-调通样例


先在开发板上调通样例。样例使用 GPU,开发板上没有 GPU(有类似的 NPU),先改成使用 CPU。主要涉及改动以下 2 个文件:face_detect.pypredictor.py。部分目录结构如下:

mfacenet
├── dataset
│   ├── lfw_test.txt
│   └── test.jpg
├── detection
│   ├── face_detect.py   # 待修改
│   └── utils.py
├── face_db
│   ├── yangmi.jpg
│   └── dilraba.jpg
├── infer.py             
├── models
│   ├── aamloss.py
│   ├── fc.py
│   └── mobilefacenet.py
├── requirements.txt
├── save_model
│   ├── mobilefacenet.pth
│   └── mtcnn
│       ├── ONet.pth
│       ├── PNet.pth
│       └── RNet.pth
├── train.py
├── utils
│   ├── predictor.py      # 待修改
│   ├── reader.py
│   ├── scheduler.py
│   ├── simfang.ttf
│   └── utils.py
└── webapp.py             # “5-增加Web客户端”步骤新增
  1. 尝试人脸识别

    先进入目录:

    cd ~/oss0612/mfacenet
    

    然后执行以下命令,尝试人脸识别:

    python3 infer.py --image_path=dataset/test.jpg --face_db_path=face_db --threshold=0.5
    

    –image_path:待识别的人脸图片的路径
    –face_db_path:人脸库图片的路径

  2. AI辅助尝试解决 CUDA 相关报错

    会有 CUDA(GPU相关) 相关报错,屏幕提示信息如下:

    ...
    NotImplementedError: Could not run 'aten::empty_strided' with arguments from the 'CUDA' backend. 
    This could be because the operator doesn't exist for this backend, or was omitted during the 
    selective/custom build process (if using custom build). 
    ...
    

    和 AI 交流,修改相关文件,即可解决。主要修改点:使用 GPU,改成使用 CPU。

    修改后,重复上述第 1 步操作。

    ✳️ 可以用 PC(个人电脑)上 VSCode远程连接开发板后修改代码。详见 VSCode指南↗。如下截图:

    • 左侧:浏览器窗口,显示实验指导手册,以及AI辅助编程信息
    • 右上:ssh 登录到开发板的 terminal 窗口
    • 右下:PC(个人电脑)上 VSCode 远程连接到开发板,可修改开发板上的代码

    sall

  3. 测试人脸识别

    python3 infer.py --image_path=dataset/test.jpg --face_db_path=face_db --threshold=0.5
    

    测试结果保存在 result.jpg 中,如下:

    result

修改后的样例代码

能调通的样例代码如下:

请复制到相应目录中:

mfacenet
├── detection
│   ├── face_detect.py
├── infer.py
├── utils
│   ├── predictor.py   

8-增加 Web 客户端


增加 Web 客户端,实现 刷脸开门 功能。

AI辅助实现


可以AI辅助实现功能。一般需要和 AI 交互多轮,才能得到预期的功能。以下是多轮交互后的样例提示词,仅供参考:

New Python program to implement a "Face Recognition Access" interface:

1. Use the USB camera connected to the development board to capture photos.
2. Display the camera's real-time video feed in the browser interface.
3. Overlay a largest possible yellow square frame on the live video. The yellow square should have the same side length as the shorter edge of the video frame. Only the area inside the yellow square is captured.
4. The captured image (inside the yellow square) should be displayed on the web interface.
5. There should be a button on the web interface labeled "Capture & Recognize". Recognition is triggered only when this button is clicked.
6. The recognition result should be displayed on the web interface, overlaid on the real-time camera feed. For the captured photo:
   - If no face is detected, display "No face detected".
   - If a face is detected but not recognized, display "Unknown".
   - If a face matches the face database, display the corresponding name followed by ", please come in".
7. Allow uploading faces (your own and your classmates') to the face database, and recognize them on the web interface.
8. The web interface must be in English.
9. The web interface should be stylish and high‑end:
   - Color scheme: monochromatic muted pastel.
   - Layout: card‑based design with layered elements.
   - Style: Neo‑minimalism.
   - Design philosophy: approachable sophistication.
10. Output a single program file named `webapp.py`. All HTML templates must be embedded within `webapp.py`.
11. The development board may have multiple cameras. Use the external USB camera.
12. When enrolling a face, add the option to capture a photo directly from the camera in addition to selecting an image file.
13. Display the already registered faces (photos and names) on the web interface.
14. The recognition similarity threshold should initially be set to 0.5.
15. Add the ability to delete registered faces from the web interface.

样例实现效果:

oss01

webapp.py样例代码

FAQ


可能遇到的问题:

  1. 开发板可能有多个摄像头。程序打开的摄像头,不是外接的 USB 摄像头。
  2. 拍摄光线、角度,会影响识别别准确度。

增加语音播报(可选)


AI辅助增加语音播报。比如:张三,请进。

多轮交互下得到的样例提示词如下,供参考:

6. Add voice broadcast

- If no face is detected, display "No face detected" and speak it out.

- If a face is detected but not recognized (unknown), display "Unknown person" and speak it out.

- If the face matches someone in the database, display "[Name], please come in" and speak it out: "[Name], please come in".

- The voice should sound natural and close to human speech, using edge-tts.

相关参考:


相关指南


可参考相关指南,已提高操作效率:


关机断电复位离开


实验结束后,请完成以下事项,再离开实验课。

  1. 关机断电

    开发板要先关机、再断电。🚫 严谨开机状态直接断电(拔电源)!

  2. 归还实验器材,给实验室老师

    • 开发板
    • 开发板电源
    • 网线
    • USB摄像头
    • 借用的其他器材
  3. 椅子复位

    • 每个桌子,配套 6 个椅子。请将椅子推到桌子下面。
    • 西侧玻璃门,前中后靠墙,各 6 个。共 18 个。请按此数量靠墙摆放。
  4. 带齐随身物品

✅ 上述事项完成后,可离开实验室。


致谢


本文主要参考资料:gitee_夜雨飘零/Pytorch-MobileFaceNet↗。在此致谢文章作者。

THE END