×

WAiT:野生动物追踪器

消耗积分:2 | 格式:zip | 大小:1.42 MB | 2022-10-31

姬房有

分享资料个

描述

介绍

野生动物监测对于跟踪动物运动模式、栖息地利用、人口统计、诱捕和偷猎事件和突围至关重要。通过保护野生动物,我们确保后代能够享受我们的自然世界和生活在其中的令人难以置信的物种。为了帮助保护野生动物,重要的是要了解物种在其生态系统中的相互作用,以及它们如何受到环境和人类影响的影响。

动物追踪数据帮助我们了解个人和种群如何在当地移动、跨越海洋和大陆迁移以及世代相传。

该项目的目的是建立一个野生动物监测系统。该项目简称Wild A n I mal Tracker WAiT 顾名思义,传感器节点等待野生动物的运动,并在检测到它时立即跟踪它的运动。该系统可以在需要动物追踪的国家公园、森林和森林附近的人类居住区实施。

我非常觉得这个系统的必要性。曾几何时,2003 年,我参观了印度的一个国家公园。在那里我想看到老虎,但我很少能看到老虎,我必须等待更长的时间才能看到它,因为当时没有系统来识别看到老虎的地方并通知我可以去看。许多游客在参观国家公园时甚至都看不到老虎,这种情况就会发生。如果我可以在可以看到老虎的不同可疑区域实施我的系统,系统可以在看到它时立即报告给控制办公室,以便游客/游客可以立即转移到野生动物园的地方,一睹美景动物。这只是一个例子。对于研究野生动物的研究人员来说,这个系统非常有用。

系统如何运作?

该系统的工作原理如下图所示。

pYYBAGNY5Z-AQA3CAASLDhtvQkE549.png
系统的工作
 

能够在深度睡眠中捕获图像并对图像进行分类的传感器节点等待事件发生。当 PIR 运动传感器检测到任何动物活动时,就会发生该事件。当此事件发生时,处于深度睡眠模式的传感器节点将被唤醒并在 tinyML 模型的帮助下捕获图像并对图像进行分类。然后它连接到网络服务器并上传数据并再次进入睡眠状态。应用程序的用户可以看到上传到 Web 服务器的数据。系统还会发送电子邮件警报。

先决条件

在开始之前,请按照以下教程中的说明设置和测试 ESP32 CAM:

数据采集

使用默认的 ESP32 CAM 固件CameraWebServer.ino收集数据为了构建模型,我收集了狮子和斑马的图像,如下所示。下图显示我已使用CameraWebServer.ino中的 Web 界面来捕获数据集的图像。

poYBAGNY5aKAX0irAADEWxQoZEM639.png
收集图像数据集
 
注意:我使用了我女儿的动物玩具 ;) 来制作这个模型。这仅用于测试目的,因为当前没有相同相机配置的野生动物图像。需要通过在真实条件下捕捉动物图像来构建真实动物图像模型。为此,需要构建一个传感器节点,该节点可以在真实条件下部署,仅用于收集动物图像并将其上传到 Web 服务器。本文中,我已经指定了如何构建这种类型的传感器节点。为了使模型准确工作,捕捉真实状态的动物图像非常重要。
pYYBAGNY5aWAbG9bAABonze0o7E947.png
示例图像
 

开发 tinyML 模型

登录Edge Impulse并创建一个项目 WILD_ANIMAL_TRACKER。现在转到数据采集,然后转到上传数据部分并通过指定标签上传图像。您可以一次为单个标签上传多张图片。例如选择所有狮子图像并指定狮子标签,然后单击开始上传按钮。

pYYBAGNY5aiAQRGrAADBDxRecVQ523.png
上传图片
 

上传图片后。再次进入数据采集,您将看到所有上传的图像列表。

pYYBAGNY5auAaw2JAADLbcGo6Bo975.png
上传的图片
 

进入Impulse Design并使用下图所示的设置创建冲动,然后单击保存冲动按钮。

注意:仔细观察图中的所有设置。
poYBAGNY5a6AAIs3AAEqUPEXzdk140.png
创造冲动
 

接下来,转到图像选项卡,观察图像数据并单击保存参数按钮。

pYYBAGNY5bSAGG7yAADtLlYDCpw903.png
图像参数
 

转到迁移学习选项卡,在神经网络 -> 神经网络架构下选择MobileNetV2 0.05。为此,请单击选择不同的模型。

poYBAGNY5baANU8TAABQfmUsFeQ400.png
选择型号
 

然后选择MobileNetV2 0.05。

pYYBAGNY5bmAOVNmAAF9xrUjVAE923.png
选择 MobileNetV2 0.05
 

选择MobileNetV2 0.05很重要,因为 ESP32 CAM 资源较少。在这一步之后点击开始训练按钮。您将看到类似于下图的输出。

pYYBAGNY5buAJhvYAAE0_LQKp8s649.png
创建神经网络
 

现在您可以转到实时分类选项卡来测试模型的工作方式。要测试,请在Classify existing test sample下选择要分类的图像,然后单击load sample按钮,如下图所示。

poYBAGNY5cCAV193AAD8cl9sPSQ131.png
实时分类测试
 

你会看到如下结果

pYYBAGNY5cSASG_iAAEH38Wz6xU490.png
实时分类结果
 

您还可以转到模型测试选项卡并单击分类所有按钮以测试模型的测试数据。

pYYBAGNY5ceANuGXAAEAyx7xWTA675.png
测试数据的测试模型
 

发现一切正常后,转到部署选项卡,单击Arduino 库并向下滚动,然后单击构建按钮。这会将模型下载为Arduino库。

pYYBAGNY5cqALwJuAADwH-gO0dw087.png
选择 Arduino 库
 

使用Edge Impulse构建的模型高效且准确,因为它使用的内存非常少,而不会影响准确性。感谢屡获殊荣的EON 编译器。

poYBAGNY5c6AEVfOAACGMfHiRXU991.png
EON 编译器
 

最后,可以通过单击构建按钮来部署模型。

poYBAGNY5dGAAEX8AADZ716ILQk068.png
建立模型
 

在设备上测试模型

要在真实传感器节点(即 ESP32 CAM)上测试模型,您需要将此 zip 库包含到您的Arduino IDE 中。请按照此处给出的说明进行操作包含库后,它必须如下所示。

pYYBAGNY5dOAU2qIAAEkU3WG5SE796.png
在 Arduino 中包含模型
 

在此之后从官方Edge Impulse存储库下载ESP32-Cam-Edge-Impulse示例ESP32 -Cam-Edge-Impulse/Basic-Image-Classification/Basic-Image-Classification.ino示例将用于直接在 ESP32 CAM 上测试我们的模型。

现在在Arduino中打开草图Basic-Image-Classification.ino并确保包含上面使用Edge Impulse创建的库的头文件您必须包含您自己模型的头文件。您可以在Arduino/libraries/Wild_Animal_Tracker_inferencing/src/Wild_Animal_Tracker_inferencing.h文件夹中找到它。

pYYBAGNY5daAJS9TAABXf_vt1FA768.png
Wild_Animal_Tracker_inferencing 库
 

您必须为头文件使用与库文件夹中相同的名称。

pYYBAGNY5dqAJWCxAACRWB7ltas084.png
包括模型
 

现在取消注释我们正在使用的电路板的行,如下图所示。

pYYBAGNY5d2AWgIKAAEsdh_4bKo194.png
选择您的设备
 

现在在代码中提供您的 WiFi 设置。

poYBAGNY5eCAFIDlAAEgwErQOwA482.png
提供 WiFi 设置
 

上传草图启用设置,如下图所示。

poYBAGNY5eKAVp0sAAEimeUscnk055.png
ESP32 摄像头的设置
 

现在您需要使用 USB 转 TTL 模块连接您的 ESP32 CAM,如下图所示。

pYYBAGNY5eWAbKMHAAJNCLz2qbE236.png
准备板上传代码
 
注意:不要忘记将 ESP32 CAM 上的 IO0 引脚和 GND 引脚短接以启用上传。

将开发板连接到计算机后,按下 ESP32 CAM 背面的重置按钮,在Arduino中编译和上传代码确保正确的 PORT 可用。

上传代码后,首先从 IO0 引脚和 GND 引脚上拔下电缆,然后按下 ESP32 CAM 上的复位按钮。现在打开串行终端,您将看到 IP 地址。打开网络浏览器并使用串行终端的 IP 地址来捕获图像。捕获图像后,您将在Arduino ide 的串行终端中看到分类结果。

poYBAGNY5eqAHAL0AAF8y-KYjss726.png
设备上的狮子直播分类
 
pYYBAGNY5eyALB_LAAFOqcfRPmc419.png
斑马在设备上的实时分类
 

构建传感器节点

下一步是上传为此项目构建的固件代码。(上传前短管脚并按下复位按钮)首先上传本项目提供的Wild_Animal_Tracker_Firmware.ino固件。断开您的电路板,移除所有电缆并制作电路,如下图所示。

pYYBAGNY5fCARepnAAJjVbTrQeg000.png
电路原理图
 
注意:如果您没有电池,则可以使用 USB 转 TTL 模块为 ESP32 CAM 供电。仅将 USB to TTL 模块的 5v 和 GND 引脚连接到 ESP32 CAM 的 5v 和 GND 引脚。不需要其他连接。
poYBAGNY5fWAT8vrAAZJI3qcXyY343.jpg
电路设置(视图 1)
 
poYBAGNY5fmARZzoAAU3evzDUv0027.jpg
电路设置(视图 2)
 
poYBAGNY5fyAIg1xAAC52u7wM_U44.jpeg
传感器节点尺寸
 

在代码中,以下语句包含了我们使用Edge Impulse构建的 ML 模型

#include 

我已经声明了以下变量

char animal[20];
const int pir_sensor = 13;

变量animal存储分类结果,PIR 传感器连接到 ESP32 CAM 的引脚 13。

classify()函数进行推理。在此函数中,推理结果animal使用以下代码存储在变量中。

if(result.classification[ix].value > 0.50000)
      strcpy(animal, result.classification[ix].label);

在该 classify() 函数中,调用 send_data_webserver()函数将数据发送到 Web 服务器。

send_data_webserver(animal);

send_data_webserver() 函数接受一个参数,该参数是推理的输出,即检测到的动物。此功能连接到网络服务器上的页面并发布数据。将 IP 地址更改192.168.157.130为您自己的 IP 地址。

void send_data_webserver(char animal[20]){
  //Open a connection to the server
      HTTPClient http;
      http.begin("http://192.168.157.130/wild_animal_tracker/upload.php");
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    //format your POST request.
      int httpResponseCode = http.POST("animal=" + String(animal));

      if (httpResponseCode >0){
          //check for a return code - This is more for debugging.
        String response = http.getString();
        Serial.println(httpResponseCode);
        Serial.println(response);
      }
      else{
        Serial.print("Error on sending post");
        Serial.println(httpResponseCode);
      }
    //closde the HTTP request.
      http.end();
}

我已经定义了在函数run_classifier() 中调用的setup()函数。run_classifier()函数实际上调用classifier() 执行推理的函数并调用send_data_webserver()将数据发布到 Web 服务器的函数。函数按以下顺序调用run_classifier()-->classifier() --->send_data_webserver().以下是代码run_classifier().

void run_classifier(){
    fb = esp_camera_fb_get();
    if (!fb) {
        Serial.println("Camera capture failed");
    }
    classify();
    esp_camera_fb_return(fb);
}

最后在setup() 函数中,我借助以下代码启用了外部唤醒

esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);

此外部唤醒使用来自连接在 GPIO 引脚号上的 PIR 传感器的输入信号。13. 因此,当检测到运动时,ESP32 会唤醒,进行推理,将数据发送到 Web 服务器并再次进入深度睡眠。这样我们可以节省大量的电池电量。传感器仅在需要时执行处理,否则其余时间处于深度睡眠模式。

ESP32 在深度睡眠模式下消耗的能量非常少,并且可以用来节省大量电池能量并使传感器节点使用电池运行更长的时间,这已经得到了很好的研究。以下链接描述了 ESP32 板的深度睡眠功能。

带有 Arduino IDE 和唤醒源的 ESP32 深度睡眠

深度睡眠模式用于低功耗:在深度睡眠模式下,CPU、大部分 RAM 和所有数字外设都处于关闭状态。芯片中唯一保持通电的部分是:RTC 控制器、RTC 外围设备(包括 ULP 协处理器)和 RTC 存储器(慢速和快速)。该芯片消耗大约 0.15 mA(如果 ULP 协处理器通电)至 10µA。

要启用深度睡眠,请调用以下函数。

esp_deep_sleep_start();

esp_deep_sleep_start() 函数将 ESP32 发送到深度睡眠。另请注意,在调用esp_deep_sleep_start()函数之前,我已经调用WiFi.disconnect()了函数,因为在进入睡眠模式之前断开 WiFi 连接很重要,否则唤醒 ESP32 将无法连接到 WiFi。

部署 Web 应用程序

现在下一步是安装 Web 服务器。此项目的 Web 服务器可以通过两种方式使用

  • 本地计算机上的网络服务器
  • 在 Internet 上托管空间的 Web 服务器

如果您购买托管空间,则无需安装 Web 服务器。您只需要将代码上传到该项目提供的网络服务器。如果您打算在本地计算机上安装网络服务器,那么我更喜欢 XAMPP 网络服务器。

在本地计算机上下载XAMPP 服务器,然后导航到htdocs webservers 根目录中的文件夹并复制粘贴整个wild_animal_tracker文件夹。这是您的网络应用程序。它包含如下图所示的文件和目录。

pYYBAGNY5gOAaKoxAABNwxUPkP8583.png
Web 应用程序目录和文件
 

打开DBController.php文件并更改以下数据库设置

private $host = "localhost";
private $user = "root";
private $password = "";
private $database = "test";

安装 XAMPP 网络服务器后,请记住使用phpmyadmin 模块创建一个名为“test”的数据库,并创建下表来存储数据。

CREATE TABLE wild_animal_data ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, animal_detected VARCHAR(30) NOT NULL, reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );

DBController.php文件包含上传和检索数据的所有功能。完成所有设置后,您可以连接传感器节点,然后使用以下 URL 在浏览器中打开 Web 应用程序。

http://localhost/wild_animal_tracker/display.html

或者

http://192.168.157.130/wild_animal_tracker/display.html

请记住,这192.168.157.130是您需要更改的系统 IP 地址。同样的 IP 地址也用于Arduino代码。如果您访问 Web 应用程序而不是在安装它的系统上,则需要 IP 地址。在 Windows 上,您可以使用ipconfig命令,在 Unix/Linux 上,您可以使用ifconfig命令来查找系统的 IP 地址。

由于 Web 应用程序也发送电子邮件警报,因此发送和接收电子邮件的设置也应更新。打开upload.php文件并更新 sendAlert() 函数中的电子邮件设置。

//This function sends an e-mail alert
function sendAlert($animal){
     $mail = new PHPMailer(true);        // Passing `true` enables exceptions
    date_default_timezone_set("Asia/Kolkata");
                $dateTime = date("Y-m-d H:i:s");
     try {
                    $mail = new PHPMailer;
                    $mail->isSMTP(); 
                    $mail->SMTPDebug = 2; 
                    $mail->Host = "smtp.gmail.com"; 
                    $mail->Port = "587"; // typically 587 
                    $mail->SMTPSecure = 'tls'; // ssl is depracated
                    $mail->SMTPAuth = true;
                    $mail->Username = "your_password";
                    $mail->Password = "your password";
                    $mail->setFrom("sender_email", "Wild Animal Tracker App");
                    $mail->addAddress("receipient_email", "receipient_name");
                    $mail->Subject = 'Alert! '.$animal.' has been detected';
                    $mail->msgHTML($animal. " has been detected at ". $dateTime); 
                    $mail->AltBody = $animal. " has been detected at ". $dateTime;
                    //$mail->addAttachment('docs/brochure.pdf'); 

                    $mail->send();
             echo 'Message has been sent!';
            } catch (Exception $e) {
                                //error
                echo "error: ". $e;
     }
}

$mail->Host 如果您不使用 Gmail ,$mail->Port请根据您的 SMTP 服务器进行更改。更新 $mail->Username = "your_password" $mail->Password使用您的电子邮件登录凭据。$mail->setFrom()函数中更新发件人的电子邮件地址,并在$mail->addAddress()函数中更新电子邮件地址和收件人姓名。

如果您使用的是 Gmail SMTP 服务器,则还需要执行一个步骤。那就是您需要在 google 中允许不太安全的应用程序,否则网络应用程序无法发送电子邮件警报。您可以通过访问 URLhttps://myaccount.google.com/security并使用您的 Gmail 帐户登录来启用它。

poYBAGNY5gWAG5paAADeBmN2d0A656.png
Gmail 安全设置
 
poYBAGNY5giAN9dSAACNJa1v130885.png
打开允许不太安全的应用程序
 
注意:仅在使用 GMail SMTP 服务器时才需要安全性较低的应用程序设置。如果您有自己的 Web 服务器和托管空间,您通常会在您的域中获得几个具有 SMPT 设置的电子邮件帐户。如果您使用 SMTP 设置和电子邮件地址在您自己的域上上传此 Web 应用程序,则此应用程序运行时无需指定任何安全设置。

结果

以下视频和图表显示了系统的输出。

 
 
 
视频说明:上述视频Sensor Node - Running Inference on EXTERNAL WAKEUP using PIR Sensor展示了 tinyML 模型的工作情况。在视频中,首先您会在之前检测到的 Web 应用程序界面中看到斑马的图像。传感器节点处于睡眠模式。在视频中,当我将手放在 PIR 传感器前时,这意味着传感器检测到了一些动物。现在 ESP32 摄像头被唤醒并捕捉到放置在摄像头前面的 Lion 的图像。ESP32 运行推理,对动物进行分类并在 Web 应用程序上上传数据,然后再次进入睡眠状态,如您在串行终端中看到的那样。结果也会立即在 Web 应用程序上更改,即传感器现在检测到 Lion 并且还会发送电子邮件警报。

下图显示了 tinyML 模型在串行终端上的执行,结果反映在 Web 应用程序中。

pYYBAGNY5guAewwxAAFdRtsuNVo727.png
在串行终端和 Web 应用程序上输出
 

Web 应用程序有不同的部分来显示信息。

poYBAGNY5hCAeA1gAAGnAu4QCAk041.png
网页应用界面
 

Web 应用程序仪表板当前显示检测到的动物的图像、检测到动物的日期和时间、数据库中 JSON 格式的最近 15 条记录以及检测到前五种动物的频率。目前界面显示动物的静态图像。还可以显示动物的实时图像,正在开发中。

下图显示了通过 Gmail 帐户发送的警报。

pYYBAGNY5hKAbCoUAAEyNAN5azE558.png
收到的电子邮件
 
poYBAGNY5hWARUPBAAEM24rV9bU735.png
电子邮件警报消息
 

结论和未来范围

该项目可用作野生动物监测中非常有用的应用程序,当研究人员无法经常访问该位置时,它可以帮助对动物进行研究。研究人员可以对适用领域的动物进行研究。可以使用安装在特定区域中的设备 ID 来识别动物的位置。这个想法是为每个设备提供唯一的 ID。这样我们可以通过添加 GPS 传感器来减少设备的额外工作量,从而可以节省更多电量。

该项目是高度可定制的,因为可以根据用户要求轻松添加其他功能。该项目还可以定制上传动物的实时图像。我目前正在研究这个功能。例如,如果检测到狮子,传感器节点将通过创建另一个带有日期时间的子文件夹来自动将狮子图像上传到网络服务器上的狮子文件夹中。Web 界面也在开发中,它将允许生成完整的报告。

由于预算限制,我使用了 ESP32 CAM 板,它有其自身的局限性。但是,我计划使用Luxonis LUX-ESP32并利用它的深度 AI功能,这将使该项目的传感器节点更加强大和高效。我还计划使用 LoRa 网络,这将扩展该项目的连接性,并且还可以用于收集具有低功耗功能的位置数据,因为 LoRa 消耗的能量比 WiFi 低得多。已经证明 LoRa 可以在森林环境中使用。添加太阳能电池是另一个问题。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !