IoT开发:从QnA Maker到ESP32及超参数优化
1. QnA Maker的使用
1.1 操作步骤
首先,我们要进行一系列操作来使用QnA Maker服务。具体步骤如下:
1. 点击查看选项,选择显示元数据。添加使用语音工作室内容创建器创建的音频。
2. 在元标签部分,添加使用内容创建器创建的音频文件。
3. 选择“保存并训练”按钮,模型保存后,选择“测试”按钮与QnA Maker机器人聊天。
4. 对QnA Maker机器人满意后,选择“发布”按钮。训练完成后,QnA Maker会显示用于向其发送问题的curl命令,我们从中提取将请求转换为Python字符串所需的密钥。
1.2 代码实现
以下是具体的代码操作步骤:
# 1. 导入发送网络请求和播放声音所需的库
import requests
import json
from playsound import playsound
# 2. 设置变量,密钥和项目URL可在准备阶段找到
auth = 'EndpointKey '
question = 'how many calories in a cheese burger'
projectURL = ''
# 3. 生成正确格式的数据
headers = {
'Authorization': auth,
'Content-type': 'application/json',
}
data = '{ "question":"'+question+'"}'
# 4. 向项目URL的语音服务发送请求
response = requests.post(projectURL, headers=headers, data=data)
json_data = json.loads(response.text)
# 5. 从响应中提取音频并在扬声器上播放
for meta in json_data['answers'][0]['metadata']:
if meta['name'] == "file":
audiofile = 'audio/' + meta['value']
print(audiofile)
playsound(audiofile)
1.3 工作原理
QnA Maker使用机器学习基于问答对训练模型,解析传入文本以确定客户的问题。我们通过http post访问QnA Maker服务,将结果转换为声音文件并在扬声器上播放。
1.4 更多功能
QnA Maker还支持闲聊功能。创建QnA Maker项目时,有闲聊选项,允许用户提出更多问题,机器人可进行随意对话,且有多种闲聊个性,如专业和对话风格。
2. 微控制器和管道优化
2.1 背景介绍
大多数物联网设备运行在微控制器单元(MCU)上,而机器学习通常在CPU上进行。现在,借助ONYX和TensorFlow Lite等技术,小型设备也能运行机器学习模型,这些受限设备成本低、可离线使用机器学习,能大幅节省云成本。
2.2 开发板介绍
我们主要关注两种开发板:
| 开发板名称 | 特点 | 价格 | 适用场景 |
| ---- | ---- | ---- | ---- |
| ESP32 | 具有Wi-Fi功能的MCU | $5 - $10 | 适合小型项目,如气象站 |
| STM32 | 有多种计算模块(如Cortext M0、M4、M7) | - | 电气工程师用于快速启动项目,确定芯片组后设计定制板 |
2.3 开发挑战与目标
让这些开发板运行、与云通信并运行机器学习模型并非易事。我们的目标是让设备进行复杂计算并连接到云,会探索所需的特定工具。机器学习通常使用Python等高级语言,而设备通常使用C或C++。
3. ESP32与物联网的结合
3.1 准备工作
使用ESP32与Azure IoT Hub交互,需要进行以下准备:
1. 在PC上安装Arduino集成开发环境(IDE),以便使用Arduino框架对ESP32进行编程。
2. 安装Visual Studio Code(VS Code),并在其中找到并安装PlatformIO扩展。
3. 通过USB将ESP32连接到计算机,在VS Code的左面板中找到PlatformIO按钮,从快速访问菜单中点击“打开”,再点击“打开项目”,在启动向导中选择项目名称、框架(Arduino)和板类型。
4. 安装Azure IoT Hub库和快速启动代码,在快速访问菜单中点击“库”,搜索Azure IoT并安装相关库,如AzureIoTHub、AzureIoTUtility、WiFi和AzureIoTProtocol_MQTT,将AzureIoTHub库中的示例代码复制到项目中。
3.2 操作步骤
具体操作步骤如下:
1. 修改
iot_configs.h
文件的第10和11行,添加Wi-Fi连接字符串:
#define IOT_CONFIG_WIFI_SSID "IoT_Net"
#define IOT_CONFIG_WIFI_PASSWORD "password1234"
-
从Azure IoT Hub获取设备连接字符串,并插入到
iot_configs.h文件的第19行:
#define DEVICE_CONNECTION_STRING "HostName=myhub.azure-devices.net;DeviceId=somerandomname;SharedAccessKey=TWnLEcXf/sxZoacZry0akx7knPOa2gSojrkZ7oyafx0="
- 通过USB将ESP32连接到计算机,点击VS Code左面板中的PlatformIO图标,然后点击“上传并监控”。
3.3 工作原理
我们将代码上传到ESP32并启用串行监视器,当ESP32连接到Wi-Fi网络并向IoT Hub发送消息时,Visual Studio的下部面板将开始显示文本。我们还创建了一些用于接收云到设备消息的示例代码。
3.4 更多功能
IoT Hub SDK功能强大,除了上述操作,还可以发送云到设备消息进行消息排队、发送直接消息、上传到Blob存储以及使用设备孪生功能。
4. 实现ESP32环境监测器
4.1 准备工作
在之前的基础上,我们要实现ESP32环境监测器,需要进行以下准备:
1. 确保已安装Arduino IDE和VS Code,并添加了PlatformIO扩展。
2. 准备DHT11数字湿度和温度传感器、跳线、10k欧姆电阻和面包板,总成本约20美元。
3. 在VS Code中使用PlatformIO扩展创建新项目,安装DHT传感器库,下载Fritzing软件。
4.2 操作步骤
具体操作步骤如下:
1. 打开Fritzing,在右侧面板的“部件”部分点击菜单,选择“导入”,选择ESP32和DHT11。
2. 在部件列表中搜索电阻,将其拖到屏幕上,调整属性为4.7kΩ。
3. 将DHT11放置在板上,使用3.3伏电源和接地连接电源轨。
4. 将电源轨连接到板上,将通用输入输出(GPIO)引脚27连接到DHT11的数据引脚,并在3.3V电源轨和DHT11的数据引脚之间添加一个4.7k欧姆电阻。
5. 将ESP32连接到计算机,打开PlatformIO项目中的
/src/main.cpp
文件。
6. 在
main.cpp
中包含DHT.h库引用:
#include "DHT.h"
- 创建ESP32数据引脚和DHT传感器类型的引用:
#define DHTPIN 27
#define DHTTYPE DHT11
- 初始化DHT变量:
DHT dht(DHTPIN, DHTTYPE);
- 设置串行端口并打印测试消息,然后初始化dht对象:
void setup()
{
Serial.begin(115200);
Serial.println("DHT11 sensor!");
dht.begin();
}
- 在主循环中读取温度和湿度传感器,调用打印部分并等待2秒后继续循环:
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
printResults(h,t);
delay(2000);
}
- 创建一个检查错误的函数,如果没有错误则打印结果:
void printResults(float h,float t)
{
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
}
4.3 工作原理
温度和湿度传感器从ESP32获取电源和接地,我们指定了数据GPIO引脚并添加了电阻以匹配电压。不同的DHT11和ESP32可能有不同的引脚规格,使用前需查看数据手册。
4.4 后续发展
我们已经有了一个工作原型,可以通过多种方式将设计投入生产,如聘请电气工程师或找专业的电路板设计公司,如Seeed Studios,许多制造工厂可以根据Fritzing草图设计和生产电路板。
5. 超参数优化
5.1 优化方法
调整超参数有多种方法,手动调整可尝试随机变量,也可采用网格搜索方法,还可借助统计或机器学习确定最佳参数。不同方法各有优缺点,取决于实验损失的形状。
5.2 准备工作
我们将使用第3章的MOX传感器数据集,该数据保存在Delta Lake中,可轻松导入到Spark Notebook。还需要使用koalas、sklearn和numpy Python包。
5.3 操作步骤
具体操作步骤如下:
# 1. 导入必要的库
import koalas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 2. 从Databricks Delta Lake导入数据
df = spark.sql("select * from ChemicalSensor where class <> 'banana'")
pdf = df.toPandas()
# 3. 选择并编码数据
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
pdf.rename(columns = {'class':'classification'}, inplace = True)
X = pdf
y = pdf['classification']
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(pdf['classification'])
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
feature_cols = ['r1', 'r2', 'r4', 'r5', 'r6','r7', 'r8', 'temp',
'humidity', 't0', 'td']
X = pdf[feature_cols]
y = onehot_encoded
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=40)
# 4. 选择要调整的参数
model_params = {
'n_estimators': [50, 150, 250],
'max_features': ['sqrt', 0.25, 0.5, 0.75, 1.0],
'min_samples_split': [2, 4, 6]
}
# 5. 创建随机森林分类器算法的实例,以便稍后调整其超参数
rf_model = RandomForestClassifier(random_state=1)
# 6. 设置网格搜索估计器以调整参数
clf = GridSearchCV(rf_model, model_params, cv=5)
# 7. 训练决策树分类器
# 此处原文档未给出训练代码,一般为 clf.fit(X_train, y_train)
通过以上步骤,我们可以完成从QnA Maker的使用到ESP32开发以及超参数优化等一系列操作,实现物联网设备的开发和优化。
6. 超参数优化的工作原理与优势
6.1 工作原理
在超参数优化过程中,我们使用了
sklearn
库中的
GridSearchCV
方法。其工作原理是在给定的参数空间内进行全面搜索,通过交叉验证(这里设置
cv = 5
)来评估每个参数组合下模型的性能。具体来说,
GridSearchCV
会将训练数据分成
cv
份,依次使用其中一份作为验证集,其余作为训练集,对每个参数组合进行多次训练和验证,最后选择损失最小的模型作为最优模型。
6.2 优势分析
使用网格搜索进行超参数优化的优势在于它能够系统地探索参数空间,找到相对较优的参数组合,从而提高模型的性能。与手动尝试随机变量相比,网格搜索更加全面和高效,能够避免遗漏一些可能的最优参数。而与其他搜索方法相比,它的实现相对简单,易于理解和调整。
7. 各部分操作的流程图
7.1 QnA Maker使用流程图
graph TD;
A[点击查看选项,选显示元数据] --> B[添加语音工作室创建的音频];
B --> C[在元标签部分添加音频文件];
C --> D[选择保存并训练];
D --> E{模型保存完成?};
E -- 是 --> F[选择测试,与机器人聊天];
F --> G{对机器人满意?};
G -- 是 --> H[选择发布];
H --> I[获取curl命令,提取密钥];
E -- 否 --> D;
G -- 否 --> F;
7.2 ESP32环境监测器实现流程图
graph TD;
A[准备硬件和软件环境] --> B[打开Fritzing,导入ESP32和DHT11];
B --> C[调整电阻属性];
C --> D[放置DHT11,连接电源轨];
D --> E[连接GPIO引脚和添加电阻];
E --> F[连接ESP32到计算机,打开main.cpp文件];
F --> G[包含DHT.h库引用];
G --> H[创建引脚和传感器类型引用];
H --> I[初始化DHT变量];
I --> J[设置串行端口和初始化dht对象];
J --> K[在主循环中读取传感器数据];
K --> L[检查错误并打印结果];
8. 总结与应用拓展
8.1 总结
本文详细介绍了物联网开发中的多个关键环节,包括QnA Maker的使用、微控制器和管道优化、ESP32与物联网的结合、ESP32环境监测器的实现以及超参数优化等内容。通过具体的操作步骤和代码示例,展示了如何从基础的问答机器人开发到物联网设备的搭建和机器学习模型的优化。
8.2 应用拓展
- QnA Maker :可以应用于各种智能客服系统,为用户提供快速准确的问题解答。通过不断优化问答对和闲聊功能,提高用户体验。
- ESP32开发 :除了气象站和环境监测器,ESP32还可以应用于智能家居、工业自动化等领域。例如,控制智能家电的开关、监测工业设备的运行状态等。
- 超参数优化 :在各种机器学习任务中,如图像分类、自然语言处理等,都可以使用超参数优化来提高模型的性能。通过选择合适的参数组合,使模型在不同的数据集上都能达到较好的效果。
总之,物联网开发是一个充满潜力的领域,通过不断学习和实践这些技术,我们可以开发出更加智能、高效的物联网应用。
超级会员免费看

被折叠的 条评论
为什么被折叠?



