首页-达尔闻    全部    项目分享| Pi Pico+Edge Impulse部署入侵者检测系统

项目分享| Pi Pico+Edge Impulse部署入侵者检测系统

Raspberry Pi Pico,上市不足3个月,售价仅有4美元,擅长低时延的 I/O 通信和模拟信号输入,功耗低,可以弥补树莓派在与物理世界互动方面的不足。今天我们项目分享就用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好玩的项目,我们会继续分享。