# 第9周：人工智能应用（二）- 人脸识别与MQTT - 讲义

## 教学目标

| 目标 | 内容 |
|-----|------|
| 知识目标 | 理解人脸检测vs人脸识别的区别、MQTT协议原理 |
| 能力目标 | 能够实现人脸识别门禁系统 |
| 情感目标 | 建立"把所有技术整合成一个产品"的系统思维 |

---

## 课程导入（10分钟）

### 9.1 开场Demo设计

**Demo名称：AI人脸门锁**

**演示流程：**
1. 老师走到摄像头前
2. 屏幕显示"Welcome, Li"（识别到人脸）
3. 继电器吸合，模拟开门

**引导语：**
> "同学们，刚才机器认出了我——这就是人脸识别。今天是综合应用课，把所有学过的技术整合起来。"

---

## 原理讲解（40分钟）

### 9.2 人脸检测 vs 人脸识别

#### 9.2.1 人脸检测 (Face Detection)

```
人脸检测 = 在图像中找到人脸的位置

技术方法：
• Haar级联分类器
• MTCNN (Multi-task Cascaded CNN)
• YOLO (You Only Look Once)

输出：人脸 bounding box (x, y, w, h)
```

#### 9.2.2 人脸识别 (Face Recognition)

```
人脸识别 = 确定这个人是谁

步骤：
1. 人脸检测 → 找到人脸位置
2. 人脸对齐 → 关键点检测
3. 特征提取 → 生成人脸特征向量 (128/512维)
4. 特征比对 → 与已知人脸库比对

常用算法：
• FaceNet (Google)
• ArcFace
• Dlib face_recognition
```

#### 9.2.3 区别

| 任务 | 输入 | 输出 | 难度 |
|------|------|------|------|
| 人脸检测 | 图像 | 位置框 | 较简单 |
| 人脸识别 | 人脸图片 | 身份ID | 复杂 |

---

### 9.3 MQTT协议

#### 9.3.1 什么是MQTT

```
MQTT = Message Queuing Telemetry Transport
       消息队列遥测传输

特点：
• 轻量级（最小包只有2字节）
• 基于发布/订阅模式
• 适合物联网
• QoS服务质量保证
```

#### 9.3.2 MQTT架构

```
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│                    MQTT Broker (服务器)                     │
│                    (例如: Mosquitto, EMQX)                  │
│                          ↑订阅   ↓发布                      │
│                         /    \                              │
│              ┌──────────┐  ┌──────────┐                    │
│              │ Publisher │  │Subscriber│                    │
│              │ (ESP32)   │  │ (手机APP)│                    │
│              └──────────┘  └──────────┘                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

发布者(ESP32)：
• 连接Broker
• 发布消息到某个主题

订阅者(手机APP)：
• 连接Broker
• 订阅感兴趣的主题
• 收到消息后处理
```

#### 9.3.3 MQTT主题

```
主题格式：device/sensor/data

示例：
• home/led/status     → 灯的状态
• home/door/control  → 门控制
• home/camera/alert   → 摄像头警报

通配符：
• #  → 匹配所有子主题 (home/#)
• +  → 匹配单级 (home/+/status)
```

#### 9.3.4 MQTT消息

```
消息格式：
┌─────────────────────────────────────────────────────────────┐
│  主题: home/door/status                                      │
│  载荷: {"door": "open", "time": "2024-01-01 10:00"}          │
│  QoS:  1 (至少一次)                                          │
└─────────────────────────────────────────────────────────────┘

QoS级别：
• QoS 0: 最多一次（可能丢失）
• QoS 1: 至少一次（可能重复）
• QoS 2: 恰好一次（保证到达）
```

---

### 9.4 人脸识别门禁系统

#### 9.4.1 系统架构

```
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│                    人脸识别门禁系统                          │
│                                                             │
│   ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────┐   │
│   │ESP32-CAM │ → │ 人脸检测 │ → │ 特征提取 │ → │ 比对 │   │
│   │  摄像头   │   │          │   │          │   │      │   │
│   └──────────┘   └──────────┘   └──────────┘   └──────┘   │
│                                                ↓            │
│                    ┌──────────┐                    ┌──────┐ │
│                    │ MQTT云   │ ←───────────────── │ 继电器│ │
│                    │ 服务器   │                    │ 开门 │ │
│                    └──────────┘                    └──────┘ │
│                          ↓                                     │
│                    ┌──────────┐                               │
│                    │ 手机APP   │                               │
│                    │ 收到通知   │                               │
│                    └──────────┘                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

#### 9.4.2 ESP32人脸识别方案

```
方案1：ESP32-S3自带人脸识别
• ESP32-S3有AI加速指令
• 可以运行轻量级人脸识别

方案2：云端识别
• ESP32采集图像 → 上传到云 → 云端识别 → 返回结果

方案3：使用预训练模型
• MTCNN + FaceNet量化模型
• 在ESP32上本地运行
```

---

## 实验操作（40分钟）

### 9.5 实验：人脸识别门禁

#### 实验目的
- 综合运用摄像头、WiFi、MQTT
- 实现人脸识别门禁原型

#### 实验器材
- ESP32-CAM × 1
- 继电器模块 × 1
- FTDI编程器

#### 实验步骤

**1. 连接硬件**
```
继电器模块：
• VCC → 5V
• GND → GND
• IN  → GPIO12
```

**2. MQTT Broker准备**
```
可以使用公共MQTT测试服务器：
• broker.mqtt-dashboard.com
• test.mosquitto.org

或使用OneNET、阿里云IoT等国内平台
```

**3. 代码实现**
```cpp
#include <WiFi.h>
#include <PubSubClient.h>
#include "esp_camera.h"
#include "face_recognition.h"

// WiFi配置
const char* ssid = "WiFi名称";
const char* password = "WiFi密码";

// MQTT配置
const char* mqtt_server = "broker.mqtt-dashboard.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "home/door/control";

WiFiClient espClient;
PubSubClient client(espClient);

// 继电器控制
#define RELAY_PIN 12

void callback(char* topic, byte* payload, unsigned int length) {
  // 收到开门指令
  if (strstr(topic, "door/control")) {
    digitalWrite(RELAY_PIN, HIGH);  // 开门
    delay(2000);  // 2秒后关闭
    digitalWrite(RELAY_PIN, LOW);
  }
}

void setup() {
  // 初始化继电器
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  
  // 设置MQTT
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  
  // 连接MQTT
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      client.subscribe(mqtt_topic);
    }
  }
  
  // 初始化摄像头
  camera_init();
}

void loop() {
  client.loop();
  
  // 采集图像
  camera_fb_t *fb = esp_camera_fb_get();
  
  // 人脸检测
  if (detectFace(fb)) {
    // 人脸检测到，发布消息
    client.publish("home/door/alert", "Face detected!");
    
    // 继电器开门
    digitalWrite(RELAY_PIN, HIGH);
    delay(2000);
    digitalWrite(RELAY_PIN, LOW);
  }
  
  esp_camera_fb_return(fb);
  delay(1000);
}
```

---

## 知识总结

### 9.6 技术整合

```
Week1-3: 基础 → ESP32, Arduino, GPIO
Week4:   通信 → I2C, UART
Week5:   WiFi → 网络连接
Week6:   语音 → 麦克风, 关键词识别
Week7:   图像 → 摄像头, OV2640
Week8:   AI  → CNN, 模型部署
Week9:   综合 → 人脸识别 + MQTT + 门禁
```

---

## 课后作业

1. **理论题**：解释MQTT的发布/订阅模式
2. **实践题**：完成人脸检测+MQTT发布实验
3. **思考题**：如何把人脸识别和语音播报结合起来？

---

## 延伸阅读

- MQTT官方文档：https://mqtt.org
- 《自己动手设计物联网》第6章
