项目分享| Pi Pico+Edge Impulse部署入侵者检测系统
-
Raspberry Pi Pico,上市不足3个月,售价仅有4美元,擅长低时延的 I/O 通信和模拟信号输入,功耗低,可以弥补树莓派在与物理世界互动方面的不足。今天我们项目分享就用Pi Pico+Edge Impulse实现入侵者监测系统。
该项目将热像仪数据给Raspberry Pi Pico,再使用Tensorflow Lite模型分析,达到在黑暗中检测入侵者的目的。这个项目有两大优点: 1)虽然很多家庭会安装摄像头,但有一些是无法在黑暗中工作的。项目中使用的热像仪监测就没有这个问题了。
2)如果一个动物入侵,我们不希望电子设备误报,摄像头肯定是做不到的。这个项目借助Edge Impulse可以准确无误判断当前入侵的是不是人。
注:Tensorflow Lite是针对移动、嵌入式以及IoT设备的工具,能够在终端本地运行机器学习模型的能力,而不必将数据上传到云端服务器进行分析。这样不仅节省网络流量,并且可以用户自己的隐私。 Edge Impulse在线网站自行训练进行分类识别。使用EdgeImpulse在线训练主要分为以下四个步骤:数据集采集、上传、训练以及部署。
01 项目使用到的软硬件
硬件部分:
-
树莓派PICO开发板
-
MLX90640热成像夜视摄像头
-
Seeed Wio 终端
-
LED灯
开发软件: -
Raspberry Pi Pico C / C ++ SDK
02 训练数据集
在机器学习项目中,第一步也是最重要的一步是收集训练数据,使训练集能够涵盖给定任务的大多数代表性的案例。
这里使用Seeed Wio终端进行数据采集。Wio终端上的3个按钮用于标记3个类(人,目标和背景)。把收集到的数据保存到Wio终端内置的micro SD卡中。每个热图像数据被捕获为一个单独的文件。该文件不包含标题行,只包含以逗号分隔的768(24x32)个温度读数。示例文件内容如下所示: 采集到的数据的直观表现如下: 03 将数据上传至Edge Impulse
当前,Edge Impulse不支持非时间序列数据类型(图像除外)。为了使用Edge Impulse,数据被假定为时间序列的实例。下面的代码是将原始数据转换为Edge Impluse的数据采集JSON格式。(全部代码可以在“达尔闻说”回复:入侵检测。)
-
import json
-
import time
-
import hmac
-
import hashlib
-
import os
-
HMAC_KEY = "<insert your edge impulse hmac key>"
-
labels = {
-
'1': 'Person',
-
'2': 'Object',
-
'3': 'Background'
-
}
-
dir = 'raw_data'
-
for filename in os.listdir(dir):
-
if filename.endswith('.csv'):
-
prefix, ext = os.path.splitext(filename)
-
label = labels[prefix[-1]]
-
outfilename = os.path.join('formatted_data', '{}.{}.json'.format(label, prefix))
-
with open(os.path.join(dir, filename)) as fp:
-
values = [[float(i)] for i in fp.read().split(',')]
-
emptySignature = ''.join(['0'] * 64)
-
data = { "
-
protected": {
-
"ver": "v1",
-
"alg": "HS256",
-
"iat": time.time()
-
},
-
"signature": emptySignature,
-
"payload": {
-
"device_name": "A0:C0:D3:00:43:11",
-
"device_type": "Raspberry_Pi_Pico",
-
"interval_ms": 1,
-
"sensors": [
-
{ "name": "temperature", "units": "Cel" },
-
],
-
"values": values
-
}
-
}
-
# encode in JSON
-
encoded = json.dumps(data)
-
# sign message signature = hmac.new(bytes(HMAC_KEY, 'utf-8'), msg = encoded.encode('utf-8'), digestmod = hashlib.sha256).hexdigest() #
-
set the signature again in the message, and encode again data['signature'] = signature encoded = json.dumps(data, indent=4)
-
with open(outfilename, 'w') as fout:
-
fout.write(encoded)
数据使用Edge Impulse CLI上传,需要先在Edge Impulse注册一个账户,并创建一个新项目来上传数据。下面的命令用于上传所有JSON文件,这些文件会自动分成训练和测试数据集。
$ edge-impulse-uploader --category split *.json上传的数据可以在Edge Impulse Studio查看。
训练数据是以1 ms为间隔的时间序列,但通过设置窗口大小768 ms(等于32x24=768热读数),它被用作单个数据实例。由于这不是一个时间序列数据,我们将使用原始数据块(无需预处理),直接反馈到神经网络块。 下面是训练输出。因为没有很多的实例样本数据作为支撑,所以准确率只能达到80%,但是之后通过大量的实例训练数据集可以进一步提高。 04 硬件设置
Pi Pico通过I2C协议与MLX90640热像仪连接,通过SPI协议连接TFT显示器。TFT显示屏用于演示。红色LED灯连接到树莓派Pico的GPIO引脚3上。
Raspberry Pi Pico ----- MLX90640热感相机
GP8 ------------------ SDA
GP9 ------------------ SCL
3V3(OUT) ----------------- 5V/3V3
GND. ------------------ GND
Raspberry Pi Pico ------ TFT Display
GP14 ------------------ MISO
GP13 ------------------ CS
GP6 ------------------ SCK
GP7 ----------------- MOSI
3V3(OUT) ----------------- 5V
GND. ------------------ GND
GP15 ----------------- DC
GP14 ----------------- RST
05 Edge Impluse移植
只要根据其他平台可用的移植代码,创建一个移植代码文件,就可以在Edge Impulse SDK中加入对Raspberry Pico硬件的支持。以下是代码片段。(在写这篇文章的时候,Edge Impulse还没有正式支持Raspberry Pi Pico,但是相信在不久的将来会支持它的。)
#include "ei_classifier_porting.h"
#include "pico/stdlib.h"
#define EI_WEAK_FN __attribute__((weak))
EI_WEAK_FN EI_IMPULSE_ERROR ei_run_impulse_check_canceled() {
return EI_IMPULSE_OK;
}
EI_WEAK_FN EI_IMPULSE_ERROR ei_sleep(int32_t time_ms) {
sleep_ms(time_ms);
return EI_IMPULSE_OK;
}
uint64_t ei_read_timer_ms() {
return to_ms_since_boot(get_absolute_time());}
uint64_t ei_read_timer_us() {
return to_us_since_boot(get_absolute_time());}06 在Pi Pico上进行模型分类
复制下面代码:
$ git clone https://github.com/metanav/pico_person_detection_thermal.git$ cd pico_person_detection_thermal$ mkdir build$ cd build$ cmake ..$ make -j4可以通过下面的步骤将生成的pico_person_detection_thermal.uf2二进制文件烧录到Raspberry Pi Pico上。
1. 按住BOOTSEL按钮,将Raspberry Pi Pico插入电脑的USB接口,就会显示一个名为RPI-RP2的大容量存储设备。 2. 将pico_person_detection_thermal.uf2二进制文件拖放到RPI-RP2上。 烧录二进制文件后,Raspberry Pi Pico将重新启动,开始执行检测。 最终如上面演示视频所示,就可以看到,当有一个人出现时,摄像头检测到数据,随后树莓派Pico分析出是人,LED灯亮起。
写在最后:Pi Pico是新的开发板,价格也不贵,关键是还可以玩很多项目的,比如上面的机器学习项目。后面有Pi Pico好玩的项目,我们会继续分享。 -
-