539 lines
15 KiB
Markdown
539 lines
15 KiB
Markdown
|
|
# AI算法更新指南
|
|||
|
|
|
|||
|
|
## 📋 概述
|
|||
|
|
|
|||
|
|
本文档为后续接手项目的同事提供详细的AI算法更新指导。当客户提供新的AI算法文件时,需要按照本指南进行算法替换和系统集成。
|
|||
|
|
|
|||
|
|
**AI算法位置**:`firefly_esp32/main/AI2/` 目录
|
|||
|
|
|
|||
|
|
**当前AI功能**:
|
|||
|
|
- 🔥 **火灾检测** - 基于热成像的火源识别
|
|||
|
|
- 👤 **人员检测** - 基于TensorFlow Lite的人员识别
|
|||
|
|
- 🌡️ **热源分析** - 温度异常和热点扩散检测
|
|||
|
|
|
|||
|
|
## 🎯 AI算法架构
|
|||
|
|
|
|||
|
|
### 当前文件结构
|
|||
|
|
```
|
|||
|
|
AI2/
|
|||
|
|
├── 🔥 火灾检测模块
|
|||
|
|
│ ├── FireDetect.h # 火灾检测类声明
|
|||
|
|
│ ├── FireDetect.cpp # 火灾检测实现
|
|||
|
|
│ ├── thermal_flags.h # 热成像参数配置
|
|||
|
|
│ └── thermal_flags.c # 热成像算法实现
|
|||
|
|
│
|
|||
|
|
├── 👤 人员检测模块
|
|||
|
|
│ ├── PersonDetect.h # 人员检测类声明
|
|||
|
|
│ ├── PersonDetect.cpp # 人员检测实现
|
|||
|
|
│ └── tinycnn_model_data.h # TensorFlow Lite模型数据
|
|||
|
|
│
|
|||
|
|
├── 🌡️ 热源处理模块
|
|||
|
|
│ ├── HeaterPersonProcessor.h # 热源人员处理器
|
|||
|
|
│ ├── HeaterPersonProcessor.cpp # 热源处理实现
|
|||
|
|
│ ├── esp32_thermo_preproc.h # 热成像预处理
|
|||
|
|
│ ├── esp32_thermo_preproc.c # 预处理算法实现
|
|||
|
|
│ └── esp32_thermo_tflm_pipeline.h # TensorFlow Lite管道
|
|||
|
|
│
|
|||
|
|
└── 🔧 辅助模块
|
|||
|
|
├── esp32_preproc_simple.h # 简单预处理
|
|||
|
|
├── esp32_preproc_simple.c # 预处理实现
|
|||
|
|
└── esp32_thermo_tflm_pipeline_stride_u8.h # U8格式管道
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 算法更新类型
|
|||
|
|
|
|||
|
|
### 类型1:TensorFlow Lite模型更新
|
|||
|
|
**涉及文件**:`tinycnn_model_data.h`
|
|||
|
|
**更新频率**:最常见
|
|||
|
|
**影响范围**:人员检测精度
|
|||
|
|
|
|||
|
|
### 类型2:火灾检测算法优化
|
|||
|
|
**涉及文件**:`FireDetect.cpp`, `thermal_flags.h`
|
|||
|
|
**更新频率**:中等
|
|||
|
|
**影响范围**:火灾检测准确性
|
|||
|
|
|
|||
|
|
### 类型3:热成像预处理算法
|
|||
|
|
**涉及文件**:`esp32_thermo_preproc.c`
|
|||
|
|
**更新频率**:较少
|
|||
|
|
**影响范围**:整体算法性能
|
|||
|
|
|
|||
|
|
### 类型4:完整算法架构升级
|
|||
|
|
**涉及文件**:所有AI2文件
|
|||
|
|
**更新频率**:很少
|
|||
|
|
**影响范围**:整个AI系统
|
|||
|
|
|
|||
|
|
## 📝 更新步骤详解
|
|||
|
|
|
|||
|
|
### 步骤1:备份现有算法
|
|||
|
|
|
|||
|
|
#### 1.1 创建备份目录
|
|||
|
|
```bash
|
|||
|
|
# 在项目根目录执行
|
|||
|
|
mkdir -p backup/AI2_backup_$(date +%Y%m%d_%H%M%S)
|
|||
|
|
cp -r firefly_esp32/main/AI2/* backup/AI2_backup_$(date +%Y%m%d_%H%M%S)/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.2 记录当前版本信息
|
|||
|
|
```cpp
|
|||
|
|
// 在更新前记录当前算法版本
|
|||
|
|
// 查看 FireDetect.cpp 或 PersonDetect.cpp 中的版本信息
|
|||
|
|
ESP_LOGI("AI_UPDATE", "Current AI version: [记录当前版本号]");
|
|||
|
|
ESP_LOGI("AI_UPDATE", "Model size: %d bytes", model_tflite_len);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤2:分析新算法文件
|
|||
|
|
|
|||
|
|
#### 2.1 确定更新类型
|
|||
|
|
**检查客户提供的文件**:
|
|||
|
|
- 如果只有 `.tflite` 或 `.h` 模型文件 → **类型1:模型更新**
|
|||
|
|
- 如果有 `FireDetect.*` 文件 → **类型2:火灾算法更新**
|
|||
|
|
- 如果有 `esp32_thermo_preproc.*` 文件 → **类型3:预处理更新**
|
|||
|
|
- 如果提供完整AI2目录 → **类型4:完整更新**
|
|||
|
|
|
|||
|
|
#### 2.2 检查兼容性
|
|||
|
|
```cpp
|
|||
|
|
// 检查新模型的输入输出尺寸
|
|||
|
|
// 在新的 tinycnn_model_data.h 中查找
|
|||
|
|
const unsigned int model_tflite_len = [新的大小];
|
|||
|
|
|
|||
|
|
// 检查是否与当前传感器兼容
|
|||
|
|
// 当前:32x32 (1024像素)
|
|||
|
|
// 新传感器:60x40 (2400像素)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤3:执行算法更新
|
|||
|
|
|
|||
|
|
#### 3.1 类型1:TensorFlow Lite模型更新
|
|||
|
|
|
|||
|
|
**最常见的更新类型**
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. **替换模型文件**
|
|||
|
|
```bash
|
|||
|
|
# 备份原文件
|
|||
|
|
cp firefly_esp32/main/AI2/tinycnn_model_data.h firefly_esp32/main/AI2/tinycnn_model_data.h.backup
|
|||
|
|
|
|||
|
|
# 替换为新模型
|
|||
|
|
cp [客户提供的新模型文件] firefly_esp32/main/AI2/tinycnn_model_data.h
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查模型大小变化**
|
|||
|
|
```cpp
|
|||
|
|
// 在 tinycnn_model_data.h 文件末尾检查
|
|||
|
|
const unsigned int model_tflite_len = [新的数值];
|
|||
|
|
|
|||
|
|
// 如果模型变大,可能需要调整内存配置
|
|||
|
|
// 在 sdkconfig 中增加:
|
|||
|
|
CONFIG_ESP_MAIN_TASK_STACK_SIZE=16384 // 如果模型>20KB
|
|||
|
|
CONFIG_FREERTOS_HEAP_SIZE_MIN=65536 // 如果模型>50KB
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **验证编译**
|
|||
|
|
```bash
|
|||
|
|
cd firefly_esp32
|
|||
|
|
idf.py build
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **测试新模型**
|
|||
|
|
```cpp
|
|||
|
|
// 在 PersonDetect.cpp 中添加测试代码
|
|||
|
|
void test_new_model() {
|
|||
|
|
ESP_LOGI("AI_TEST", "Testing new model...");
|
|||
|
|
ESP_LOGI("AI_TEST", "Model size: %d bytes", model_tflite_len);
|
|||
|
|
|
|||
|
|
// 使用测试数据验证模型
|
|||
|
|
uint16_t test_data[1024] = {0}; // 或2400 for 60x40
|
|||
|
|
PERSON_RESULT result = detect(test_data, 32, 32); // 或60, 40
|
|||
|
|
|
|||
|
|
ESP_LOGI("AI_TEST", "Model test result: score=%d, pos=(%d,%d)",
|
|||
|
|
result.score, result.x, result.y);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2 类型2:火灾检测算法更新
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. **替换火灾检测文件**
|
|||
|
|
```bash
|
|||
|
|
# 备份原文件
|
|||
|
|
cp firefly_esp32/main/AI2/FireDetect.h firefly_esp32/main/AI2/FireDetect.h.backup
|
|||
|
|
cp firefly_esp32/main/AI2/FireDetect.cpp firefly_esp32/main/AI2/FireDetect.cpp.backup
|
|||
|
|
|
|||
|
|
# 替换为新文件
|
|||
|
|
cp [客户提供的FireDetect.h] firefly_esp32/main/AI2/
|
|||
|
|
cp [客户提供的FireDetect.cpp] firefly_esp32/main/AI2/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查参数配置变化**
|
|||
|
|
```cpp
|
|||
|
|
// 检查 thermal_flags.h 中的参数是否需要更新
|
|||
|
|
#define TF_T_ABS 50.0f // 热点检测阈值
|
|||
|
|
#define TF_DANGER_T 60.0f // 危险温度阈值
|
|||
|
|
#define TH_W 32 // 传感器宽度
|
|||
|
|
#define TH_H 32 // 传感器高度
|
|||
|
|
|
|||
|
|
// 如果升级到60x40传感器,需要修改:
|
|||
|
|
#define TH_W 60
|
|||
|
|
#define TH_H 40
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **检查API兼容性**
|
|||
|
|
```cpp
|
|||
|
|
// 检查 FIRE_RESULT 结构是否有变化
|
|||
|
|
typedef struct tagFIRE_RESULT {
|
|||
|
|
bool burning_alert;
|
|||
|
|
bool danger_temp_alert;
|
|||
|
|
// ... 检查是否有新增字段
|
|||
|
|
} FIRE_RESULT;
|
|||
|
|
|
|||
|
|
// 检查 detect 方法签名是否变化
|
|||
|
|
FIRE_RESULT detect(uint16_t* data_pixel);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3 类型3:热成像预处理更新
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. **替换预处理文件**
|
|||
|
|
```bash
|
|||
|
|
# 备份原文件
|
|||
|
|
cp firefly_esp32/main/AI2/esp32_thermo_preproc.h firefly_esp32/main/AI2/esp32_thermo_preproc.h.backup
|
|||
|
|
cp firefly_esp32/main/AI2/esp32_thermo_preproc.c firefly_esp32/main/AI2/esp32_thermo_preproc.c.backup
|
|||
|
|
|
|||
|
|
# 替换为新文件
|
|||
|
|
cp [客户提供的预处理文件] firefly_esp32/main/AI2/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查函数接口变化**
|
|||
|
|
```cpp
|
|||
|
|
// 检查主要预处理函数是否有变化
|
|||
|
|
// 在 esp32_thermo_preproc.h 中查找主要函数声明
|
|||
|
|
void preprocess_thermal_data(uint16_t* input, float* output, int width, int height);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **验证数据流兼容性**
|
|||
|
|
```cpp
|
|||
|
|
// 确保预处理输出格式与后续算法兼容
|
|||
|
|
// 检查数据类型:uint16_t → float → int8_t 的转换链
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.4 类型4:完整算法架构更新
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. **完整替换AI2目录**
|
|||
|
|
```bash
|
|||
|
|
# 备份整个目录
|
|||
|
|
mv firefly_esp32/main/AI2 firefly_esp32/main/AI2_backup_$(date +%Y%m%d)
|
|||
|
|
|
|||
|
|
# 复制新的AI2目录
|
|||
|
|
cp -r [客户提供的AI2目录] firefly_esp32/main/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **检查CMakeLists.txt更新**
|
|||
|
|
```cmake
|
|||
|
|
# 检查 firefly_esp32/main/CMakeLists.txt 是否需要更新
|
|||
|
|
set(COMPONENT_SRCS
|
|||
|
|
"main.cpp"
|
|||
|
|
# AI2相关文件
|
|||
|
|
"AI2/FireDetect.cpp"
|
|||
|
|
"AI2/PersonDetect.cpp"
|
|||
|
|
"AI2/HeaterPersonProcessor.cpp"
|
|||
|
|
"AI2/esp32_thermo_preproc.c"
|
|||
|
|
"AI2/thermal_flags.c"
|
|||
|
|
"AI2/esp32_preproc_simple.c"
|
|||
|
|
# ... 检查是否有新增或删除的文件
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **检查依赖库变化**
|
|||
|
|
```cmake
|
|||
|
|
# 检查是否需要新的依赖库
|
|||
|
|
target_link_libraries(${COMPONENT_LIB}
|
|||
|
|
idf::tflite-micro # TensorFlow Lite
|
|||
|
|
# ... 检查是否有新增依赖
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤4:主程序集成更新
|
|||
|
|
|
|||
|
|
#### 4.1 检查主程序调用
|
|||
|
|
|
|||
|
|
**位置**:`firefly_esp32/main/main.cpp` (或相应主文件)
|
|||
|
|
|
|||
|
|
**检查AI调用代码**:
|
|||
|
|
```cpp
|
|||
|
|
// 火灾检测调用
|
|||
|
|
FireDetect* fire_detector = FireDetect::Inst();
|
|||
|
|
FireDetect::FIRE_RESULT fire_result = fire_detector->detect(thermal_data);
|
|||
|
|
|
|||
|
|
// 人员检测调用
|
|||
|
|
PersonDetect* person_detector = PersonDetect::Inst();
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, 32, 32);
|
|||
|
|
|
|||
|
|
// 检查这些调用是否需要修改参数或处理返回值
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.2 更新传感器适配
|
|||
|
|
|
|||
|
|
**如果同时升级传感器到60x40**:
|
|||
|
|
```cpp
|
|||
|
|
// 原代码 (32x32)
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, 32, 32);
|
|||
|
|
|
|||
|
|
// 修改为 (60x40)
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, 60, 40);
|
|||
|
|
|
|||
|
|
// 或者使用宏定义
|
|||
|
|
#ifdef USE_HTPA60x40
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, 60, 40);
|
|||
|
|
#else
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, 32, 32);
|
|||
|
|
#endif
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.3 更新网络传输
|
|||
|
|
|
|||
|
|
**检查AI结果传输**:
|
|||
|
|
```cpp
|
|||
|
|
// 检查火灾检测结果的网络传输
|
|||
|
|
if (fire_result.burning_alert) {
|
|||
|
|
// 发送火灾报警
|
|||
|
|
send_fire_alert(fire_result.cx, fire_result.cy, fire_result.peak_c);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查人员检测结果的传输
|
|||
|
|
if (person_result.score > threshold) {
|
|||
|
|
// 发送人员检测结果
|
|||
|
|
send_person_detection(person_result.x, person_result.y, person_result.score);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保这些函数调用与新算法的输出格式兼容
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🧪 测试验证步骤
|
|||
|
|
|
|||
|
|
### 第1步:编译测试
|
|||
|
|
```bash
|
|||
|
|
cd firefly_esp32
|
|||
|
|
idf.py clean
|
|||
|
|
idf.py build
|
|||
|
|
|
|||
|
|
# 检查编译输出,确保没有错误
|
|||
|
|
# 特别注意内存使用警告
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 第2步:功能测试
|
|||
|
|
|
|||
|
|
#### 2.1 AI算法基础测试
|
|||
|
|
```cpp
|
|||
|
|
void test_ai_algorithms() {
|
|||
|
|
ESP_LOGI("AI_TEST", "=== AI Algorithm Test Start ===");
|
|||
|
|
|
|||
|
|
// 测试火灾检测
|
|||
|
|
FireDetect* fire_detector = FireDetect::Inst();
|
|||
|
|
if (fire_detector->setup()) {
|
|||
|
|
ESP_LOGI("AI_TEST", "✅ Fire detection setup OK");
|
|||
|
|
} else {
|
|||
|
|
ESP_LOGE("AI_TEST", "❌ Fire detection setup failed");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试人员检测
|
|||
|
|
PersonDetect* person_detector = PersonDetect::Inst();
|
|||
|
|
if (person_detector->setup()) {
|
|||
|
|
ESP_LOGI("AI_TEST", "✅ Person detection setup OK");
|
|||
|
|
} else {
|
|||
|
|
ESP_LOGE("AI_TEST", "❌ Person detection setup failed");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试模型大小
|
|||
|
|
ESP_LOGI("AI_TEST", "Model size: %d bytes", model_tflite_len);
|
|||
|
|
ESP_LOGI("AI_TEST", "Free heap: %d bytes", esp_get_free_heap_size());
|
|||
|
|
|
|||
|
|
ESP_LOGI("AI_TEST", "=== AI Algorithm Test End ===");
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2 实际数据测试
|
|||
|
|
```cpp
|
|||
|
|
void test_with_real_data() {
|
|||
|
|
ESP_LOGI("AI_TEST", "Testing with real thermal data...");
|
|||
|
|
|
|||
|
|
// 获取真实热成像数据
|
|||
|
|
uint16_t thermal_data[TH_PIX]; // 1024 or 2400
|
|||
|
|
if (thermal_sensor.getData(thermal_data, TH_PIX)) {
|
|||
|
|
|
|||
|
|
// 测试火灾检测
|
|||
|
|
FireDetect::FIRE_RESULT fire_result = fire_detector->detect(thermal_data);
|
|||
|
|
ESP_LOGI("AI_TEST", "Fire detection - Alert: %s, Temp: %.1f°C",
|
|||
|
|
fire_result.burning_alert ? "YES" : "NO", fire_result.peak_c);
|
|||
|
|
|
|||
|
|
// 测试人员检测
|
|||
|
|
PersonDetect::PERSON_RESULT person_result = person_detector->detect(thermal_data, TH_W, TH_H);
|
|||
|
|
ESP_LOGI("AI_TEST", "Person detection - Score: %d, Pos: (%d,%d)",
|
|||
|
|
person_result.score, person_result.x, person_result.y);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 第3步:性能测试
|
|||
|
|
```cpp
|
|||
|
|
void test_ai_performance() {
|
|||
|
|
ESP_LOGI("PERF_TEST", "=== AI Performance Test ===");
|
|||
|
|
|
|||
|
|
uint16_t test_data[TH_PIX];
|
|||
|
|
memset(test_data, 0, sizeof(test_data));
|
|||
|
|
|
|||
|
|
// 测试火灾检测性能
|
|||
|
|
uint32_t start_time = esp_timer_get_time();
|
|||
|
|
for (int i = 0; i < 10; i++) {
|
|||
|
|
FireDetect::FIRE_RESULT result = fire_detector->detect(test_data);
|
|||
|
|
}
|
|||
|
|
uint32_t fire_time = (esp_timer_get_time() - start_time) / 10;
|
|||
|
|
|
|||
|
|
// 测试人员检测性能
|
|||
|
|
start_time = esp_timer_get_time();
|
|||
|
|
for (int i = 0; i < 10; i++) {
|
|||
|
|
PersonDetect::PERSON_RESULT result = person_detector->detect(test_data, TH_W, TH_H);
|
|||
|
|
}
|
|||
|
|
uint32_t person_time = (esp_timer_get_time() - start_time) / 10;
|
|||
|
|
|
|||
|
|
ESP_LOGI("PERF_TEST", "Fire detection avg time: %d ms", fire_time / 1000);
|
|||
|
|
ESP_LOGI("PERF_TEST", "Person detection avg time: %d ms", person_time / 1000);
|
|||
|
|
ESP_LOGI("PERF_TEST", "Free heap after test: %d bytes", esp_get_free_heap_size());
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚨 常见问题解决
|
|||
|
|
|
|||
|
|
### 问题1:编译错误 - 找不到函数
|
|||
|
|
**现象**:
|
|||
|
|
```
|
|||
|
|
error: 'xxx' was not declared in this scope
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 检查新算法的头文件是否正确包含
|
|||
|
|
2. 检查函数名称是否有变化
|
|||
|
|
3. 检查命名空间或类名是否有变化
|
|||
|
|
|
|||
|
|
### 问题2:内存不足
|
|||
|
|
**现象**:
|
|||
|
|
```
|
|||
|
|
E (xxx) AI: Failed to allocate memory for model
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 检查新模型大小:`model_tflite_len`
|
|||
|
|
2. 增加堆内存配置:
|
|||
|
|
```
|
|||
|
|
CONFIG_ESP_MAIN_TASK_STACK_SIZE=16384
|
|||
|
|
CONFIG_FREERTOS_HEAP_SIZE_MIN=65536
|
|||
|
|
```
|
|||
|
|
3. 考虑使用PSRAM:
|
|||
|
|
```
|
|||
|
|
CONFIG_ESP32_SPIRAM_SUPPORT=y
|
|||
|
|
CONFIG_SPIRAM_USE_MALLOC=y
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题3:AI检测结果异常
|
|||
|
|
**现象**:检测结果明显不正确
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 检查输入数据格式是否匹配
|
|||
|
|
2. 验证传感器分辨率配置
|
|||
|
|
3. 检查温度转换算法
|
|||
|
|
4. 对比算法参数配置
|
|||
|
|
|
|||
|
|
### 问题4:性能下降
|
|||
|
|
**现象**:系统响应变慢
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
1. 测量各AI算法的执行时间
|
|||
|
|
2. 检查是否有内存泄漏
|
|||
|
|
3. 优化算法调用频率
|
|||
|
|
4. 考虑使用多任务并行处理
|
|||
|
|
|
|||
|
|
## 📋 更新检查清单
|
|||
|
|
|
|||
|
|
### 算法文件更新 ✓
|
|||
|
|
- [ ] 备份原有AI2目录
|
|||
|
|
- [ ] 确认更新类型和范围
|
|||
|
|
- [ ] 替换相应算法文件
|
|||
|
|
- [ ] 检查文件完整性
|
|||
|
|
|
|||
|
|
### 配置参数调整 ✓
|
|||
|
|
- [ ] 检查thermal_flags.h参数
|
|||
|
|
- [ ] 更新传感器尺寸配置
|
|||
|
|
- [ ] 调整内存配置
|
|||
|
|
- [ ] 更新CMakeLists.txt
|
|||
|
|
|
|||
|
|
### 代码集成修改 ✓
|
|||
|
|
- [ ] 更新主程序AI调用
|
|||
|
|
- [ ] 适配传感器分辨率变化
|
|||
|
|
- [ ] 修改网络传输格式
|
|||
|
|
- [ ] 更新Android端接收
|
|||
|
|
|
|||
|
|
### 测试验证完成 ✓
|
|||
|
|
- [ ] 编译测试通过
|
|||
|
|
- [ ] AI算法基础功能正常
|
|||
|
|
- [ ] 实际数据测试正常
|
|||
|
|
- [ ] 性能测试满足要求
|
|||
|
|
- [ ] 集成测试通过
|
|||
|
|
|
|||
|
|
## 📞 技术支持
|
|||
|
|
|
|||
|
|
### 调试技巧
|
|||
|
|
```cpp
|
|||
|
|
// 启用AI模块详细日志
|
|||
|
|
esp_log_level_set("FireDetect", ESP_LOG_DEBUG);
|
|||
|
|
esp_log_level_set("PersonDetect", ESP_LOG_DEBUG);
|
|||
|
|
|
|||
|
|
// 监控内存使用
|
|||
|
|
ESP_LOGI("AI_DEBUG", "Before AI: Free heap %d", esp_get_free_heap_size());
|
|||
|
|
// ... AI算法调用 ...
|
|||
|
|
ESP_LOGI("AI_DEBUG", "After AI: Free heap %d", esp_get_free_heap_size());
|
|||
|
|
|
|||
|
|
// 性能监控
|
|||
|
|
uint32_t start = esp_timer_get_time();
|
|||
|
|
// ... AI算法执行 ...
|
|||
|
|
ESP_LOGI("AI_PERF", "AI execution time: %d ms", (esp_timer_get_time() - start) / 1000);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 文档参考
|
|||
|
|
- **AI算法源码**:`firefly_esp32/main/AI2/`
|
|||
|
|
- **传感器适配**:参考传感器升级指南
|
|||
|
|
- **TensorFlow Lite文档**:ESP32 TensorFlow Lite官方文档
|
|||
|
|
|
|||
|
|
### 联系信息
|
|||
|
|
- **原开发者**:fw <kingfun2000@qq.com>
|
|||
|
|
- **客户技术支持**:[客户提供的联系方式]
|
|||
|
|
- **项目仓库**:查看项目根目录README
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 总结
|
|||
|
|
|
|||
|
|
AI算法更新主要涉及:
|
|||
|
|
1. **模型文件替换** - 最常见的TensorFlow Lite模型更新
|
|||
|
|
2. **算法逻辑优化** - 火灾检测和预处理算法改进
|
|||
|
|
3. **参数配置调整** - 适配新传感器和优化检测精度
|
|||
|
|
4. **性能验证测试** - 确保更新后系统稳定运行
|
|||
|
|
|
|||
|
|
**关键提醒**:
|
|||
|
|
- 每次更新前必须备份原有算法
|
|||
|
|
- 重点关注内存使用和性能影响
|
|||
|
|
- 充分测试各种场景下的AI检测效果
|
|||
|
|
- 保持与传感器升级的同步适配
|
|||
|
|
|
|||
|
|
**预计工作量**:
|
|||
|
|
- 模型更新:0.5天
|
|||
|
|
- 算法优化:1-2天
|
|||
|
|
- 完整更新:2-3天
|
|||
|
|
- 测试验证:1-2天
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**:v1.0
|
|||
|
|
**创建时间**:2026年2月26日
|
|||
|
|
**适用版本**:ESP32固件v2.1.0+
|
|||
|
|
**作者**:fw (离职前准备文档)
|