铁甲小宝 发表于 2020-8-18 17:46:25

LattePanda&AI-人脸识别门禁系统

## LattePanda&AI-人脸识别门禁系统
## 概述
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别。

本项目中我们将实现摄像头人脸识别效果,包含人名标签和识别框,并结合灯带的亮灯状态制作人脸识别门禁系统。
(最终效果视频)

## 项目基础
##### 人脸识别
### 硬件准备:
AI主控:LattePanda
输入输出设备:5英寸显示屏、键盘、鼠标、摄像头

### 人脸信息录入:
1、双击桌面上的“startpage.sh”,打开JupyterLab,切换到“home/lattepanda/桌面/LattePanda&AI项目实战/”目录下,如下图,检查一下项目必需的3个文件;

2、双击进入“图片拍摄”文件夹;

3、双击打开程序,修改拍摄的照片数量,例如for index in range(3);

### 样例代码:

4、选择无其他人、无杂物的背景,正眼看着摄像头,然后运行程序,拍摄的图片会在程序同目录下依次出现;

5、双击图片查看拍摄效果;


6、选择效果最好的一张,重命名为此人的姓名;

7、将照片复制到“LattePanda&AI-人脸识别门禁系统”文件夹下。

## 程序编写:
1、双击打开“人脸识别.ipynb”;

样例代码:

#导入人脸识别模块
from faceRecognition import *

#人脸检测与识别文件调用
faceDetectorPath = "face-detection-retail-0005.xml"
landmarksPath = "landmarks-regression-retail-0009.xml"
faceReidentificationPath = "face-reidentification-retail-0095.xml"

#调用训练模型文件
model = Model()

model.load(faceDetectorPath = faceDetectorPath,
                  landmarksPath = landmarksPath,
                  faceReidentificationPath = faceReidentificationPath)
                  
#初始化摄像头与窗口
camera = Camera()
screen = Screen("人脸识别门禁系统", (0,0,0))

#打开手写数字交互窗口,按下“Q”键退出窗口
if_run = 1
while (if_run == 1):
    #从摄像头获取图片
    image = camera.read(flip = False)
    #图片剪裁
    image = model.clipResizeFrame(image)      
    screen.clear()
    #获取人脸识别结果并在屏幕上显示识别标签
    results = model.predict(image)
    screen.putImage(image, 80, 0, 640, 480)
    for roi, landmarks, identity in zip(*results):
      x, y = roi.position
      w, h = roi.size
      screen.putTag(identity, x+80, y, w, h, bg=(0,255,0))
      
    #打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环
    if screen.show():
      if_run = 0
      screen.quit()

2、运行程序,当执行到最后一个单元格时,会打开交互窗口。
未识别到人脸:

检测到未知人脸:

识别到已知人脸,并显示此人姓名:

3、按键盘上的“Q”键可退出交互窗口。

## 项目进阶
##### 人脸识别门禁系统
如果让人脸作为门禁系统的钥匙,会使我们的生活更方便快捷。当识别到主人的人脸时,灯带亮绿灯,表示准许进入;否则显示红灯。
### 硬件准备:
主控:Arduino UNO、IO 传感器扩展板 V7.1
模块:WS2812 RGB 全彩灯带
### 硬件连接图:

`*WS2812上有7个RGB灯,程序中的np表示第一个灯,程序中的np表示第二个灯。`

### 程序编写:
双击打开“人脸识别_灯带.ipynb”;

样例代码:


#导入人脸识别模块
from faceRecognition import *
import time
from pinpong.board import Board,Pin,NeoPixel

NEOPIXEL_PIN = Pin.D7
PIXELS_NUM = 1 #灯数,如果需要多个灯亮,请改此数值

#初始化,选择板型和端口号
Board("uno", "/dev/ttyUSB0").begin()

np = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM) #np表示第一个灯,np表示第二个灯,以此类推

#人脸检测与识别文件调用
faceDetectorPath = "face-detection-retail-0005.xml"
landmarksPath = "landmarks-regression-retail-0009.xml"
faceReidentificationPath = "face-reidentification-retail-0095.xml"

#调用训练模型文件
model = Model()

model.load(faceDetectorPath = faceDetectorPath,
                  landmarksPath = landmarksPath,
                  faceReidentificationPath = faceReidentificationPath)
                  
#初始化摄像头与窗口
camera = Camera()
screen = Screen("人脸识别门禁系统", (0,0,0))

#打开手写数字交互窗口,按下“Q”键退出窗口
if_run = 1
led = 0
count = 0
while (if_run == 1):
    #从摄像头获取图片
    image = camera.read(flip = False)
    #图片剪裁
    image = model.clipResizeFrame(image)      
    screen.clear()
    #获取人脸识别结果并在屏幕上显示识别标签
    results = model.predict(image)
    screen.putImage(image, 80, 0, 640, 480)
    for roi, landmarks, identity in zip(*results):
      x, y = roi.position
      w, h = roi.size
      screen.putTag(identity, x+80, y, w, h, bg=(0,255,0))
      
      #count>30,修改30可调节切换灯颜色的速度
      if identity != "未知人脸" and count>30:
            np = (0, 255 ,0) #设置第一个灯亮绿色
            #np = (0, 255 ,0) #设置第二个灯亮绿色
            count = 0
      elif identity == "未知人脸" and count>30:
            np = (255, 0 ,0) #设置第一个灯亮红色
            #np = (255, 0 ,0) #设置第二个灯亮红色
            count = 0
      count+=1

      
    #打开与显示交互窗口,如果按下Q键,将无法进入下一次while循环
    if screen.show():
      if_run = 0
      screen.quit()

### 运行效果:
当识别到已知人脸时,灯带的第一个灯亮绿色;

当屏幕中没有人脸或者是未知人脸时,灯带的第一个灯亮红色。


firehawk 发表于 2020-12-27 23:28:47

楼主,示例代码在哪里能看到?

三春牛-创客 发表于 2023-8-23 21:58:37

厉害厉害

三春牛-创客 发表于 2023-8-23 21:59:49

不错不错!

花生编程 发表于 2023-8-24 14:07:13

厉害厉害

花生编程 发表于 2023-8-24 14:08:15

赞赞赞赞赞!
页: [1]
查看完整版本: LattePanda&AI-人脸识别门禁系统