pico+tensorflow

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(24×32)个温度读数。示例文件内容如下所示:

采集到的数据的直观表现如下:

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(等于32×24=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灯亮起。