回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

基于行空板M10扩展板的青山守望者:用AI守护人与动物 简单

头像 孙洪尧1985 2025.06.28 22 0

项目灵感:根据《义务教育信息科技教学指南八年级物联网实践与探索》第五单元物联网应用探索和第六单元物联网安全,并结合家乡黑龙江省2024年东北虎伤人事件制作了跨学科学习配套资源,可实现跨学科教学。本课是基于物联网中的摄像头和传感器获取丰富实时的数据,体验行空板和摄像头及多种传感器协同工作,实现远程的反馈与控制,了解物联网中数据的重要作用,认识物联网为社会发展带来的重要价值。

本文是基于我在造物记参考并学习造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html;和【行空板图形化Python入门教程】第11课:IoT数据助手
https://mc.dfrobot.com.cn/thread-314803-1-1.html(出处: DF创客社区 - 分享创造的喜悦)
 

2c2cb36a23ce9e9b6f9c7d77dfc32df8.jpg

项目简介:

        2024年据媒体报道,黑龙江省勃利县吉兴乡长太村出现老虎伤人事件,一名村民在喂牛时遭一只东北虎袭击受伤。11月18日上午,受伤村民的家属在接受媒体采访时表示,伤者被送往医院,“被咬的手臂大概是保不住了”。后经媒体报道,被老虎咬伤的病人左手保住了,只是骨折,无截肢风险。

1751109709650.png

         针对生态保护成效显现后野生动物肇事频发的新矛盾,本研究旨 在开发一套基于AI 图像识别与物联网技术的低成本智能防护系统, 突破传统防护中“误报率高、驱离滞后、安装昂贵 ”三大瓶颈。通过构建轻量化动物识别模型(东北虎、黑熊辨识准确率≥90%)、研发声光协同驱赶装置、搭建低功耗无线预警网络,实现“精准识别-快速响应-非伤害驱离 ”的全流程自动化防护。项目以乡村可承受成本替代万元级专业设备,既守护生态保护成果, 又保障村民生产安全,为科技赋能“人与自然和谐共生 ”提供学生视角的创新实践方案。

        行空板M10、扩展板结合摄像头和其他传感器等硬件,具备强大的数据处理和交互能力,能够开发出智能的识别野生动物接近人类生活区域的守护系统,为人类和野生动物建立起一栋无形的分隔保护墙,同时也为初中信息科技课程提供实践平台,助力学生在掌握硬件操作、编程及AI技术,提升科创素养的同时,能够将所学知识应用于实际,达到实践出真知的目的。

 

项目实现效果:

        用AI+物联网技术,为普通村庄设计“用得起、认得准、反应快 ”的智能防护系统的想法。就像孙洪尧老师说的:“保护生态不是把人类或者动物赶出自然,而是用科技搭建和谐共处的智慧桥梁。”

        首先使用两个行空板搭建村庄物联网,一块行空板作为数据发送端,连接摄像头、蜂鸣器和红色LED灯,,位于村庄模型的村庄入口处,便于识别是否有野生动物入村;另一款行空板作为数据接收端,位于村委会。当发现东北虎、黑熊、野猪等野生动物入村后,及时识别、发出声光警报并向村委会发送消息。

微信图片_20250427200000.jpg
微信图片_20250427200015.jpg

项目创新点:“会认野生动物 ”的 AI摄像头:基于 MMEDU 的轻量化动物识别模型。

 通过学习使用浦育平台拍照取样 生成 ONNX 模型,然后在行空板上运行模型,搭配普通摄像头就可以 完成图像分类,实现物体分类识别野生动物的效果,这样一来,造价低了很多。所以我决定放弃初期采用二哈识图的方案转而使用普通摄  像头实现物体分类的效果。

“不拼硬件拼算法 ”:没有用昂贵的工业摄像头,靠自制数据集和模型压缩,让几十块钱的普通摄像头摇身一变,实现专业级识别。

“让技术有温度 ”:驱离装置不用电网、毒饵,用动物行为学设 计“恐吓但不伤害 ”的方案。

材料清单

硬件介绍:

1、行空板

行空板M10是一款专为信息科技课程中的编程学习、物联网及AI项目教学需求而开发的学习板。行空板又称UNIHIKER,它是一款国产教学用开源硬件,它自带Linux操作系统和Python环境,还预装了常用的Python库,能够轻松胜任各种编程相关的开发场景,如搭建物联网系统、体验人工智能应用、编写电子游戏、进行科学实验、设计声光互动、开发可穿戴设备等。

同时,行空板作为智能终端设备,其板子本身采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。

140915knreu7cuesbef7xc.jpg
142824cs3ojayjoscmoxcg.jpeg
142908rh1x4r8k8vux1ksk.jpeg

2、行空板M10电机扩展板

专为行空板(UNIHIKER)M10开发适配的背夹便携IO扩展板,含IO扩展板及金手指扩展板(需组合使用)。该板兼容背夹电池实现独立供电,且有乐高孔距固定乐高件。紧凑式设计使功能扩展仅在11mm厚度内实现。

该扩展板集成了两路直流电机驱动,同时板载了RGB灯、红外发射、红外接收功能,以及扩展3路3Pin口、2路I2C口、2路舵机接口。配合DFRobot强大的Gravity产品体系,让行空板M10更好地满足供电、手持、便携、紧凑功能的项目制作。

productImage

3、USB摄像头:这是一款插入USB端口就能使其工作起来的免驱摄像头,30W像素,640*480分辨率,即插即用,兼容树莓派和英伟达Jetson Nano系列主板,特别在你的树莓派或Jetson Nano主板装上外壳后使用起来更方便。

模块拥有30mm*25mm*21.4mm的小巧体积,可嵌入于各类设备,用于人脸识别,图像识别,安防,远程教学等项目之中。

productImage

步骤1 使用3D打印机打印野生动物模型并上色

微信图片_20250628194729.jpg

步骤2 2、使用浦育平台的在线工具,采集野生动物的图片模型,并进行生成ONNX模型和训练,测试模型的效果。(后期在村庄模型重新进行了采集,识别效果提高很多)

本部分内容参照了造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html

acd37afc292a36ae6a8a76e75f665ed.jpg

步骤3 行空板安装xedu库

此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html

此步骤是将xedu的python库装到行空板上,不是装电脑上,因此需要在所有行空板上执行一次且只需要一次即可,跟使用的电脑没有关系。

2e554bf5d68a27755de8943e274f3fc2.png

- 打开Mind+,保证右上角Python模式,左上角为“模块”界面,点击左下角“扩展”,在“官方库”中加载”行空板“

15c839ab6a989190eb86a557b28719d5.png
24f74089521861c7848241e560aaf7ce.png

行空板通过USB线连接电脑,待行空板开机准备完成后,点击菜单中的“连接远程设备”,连接行空板,直到连接成功(终端后面显示“行空板”说明连接成功)

b84ff78bee82b6a6ee245c8321b4de8e.png
3a51181a7d0f1fd17554a6c26a18c9f7.png
98d93b4916e1d6247eec731e06c24718.png
55469c0db8828db05e7f0ad366c3b6c4.png

在PIP模式中输入```xedu-python```,选择“清华大学”源,后点击运行,此时将通过网络将xedu库安装到当前连接的行空板上,等待运行结束(提示“命令运行完成”)之后返回“模块”编程界面。

 注意:
 1、需要保证此窗口左上角显示“行空板”,如果没有显示,说明上一步连接行空板未成功,此时安装则是将库安装到了电脑而非行空板。
 2、如果下方窗口显示多行Requirement alread satisfied:xxxx,说明库已经被安装了,无需安装。
 3、下方窗口以WARNING开头的一行提示是警告,不是错误,不需要管。
 4、如果下方窗口显示多行Warning: Retrying.................[Errno -3]......,说明未按照上一步正确让行空板连接WiFi,没有连接WiFi无法安装库,回到4.1操作。

55469c0db8828db05e7f0ad366c3b6c4.png
df4bb89901f68ee5074463487aff1209.png

步骤4 在Mind+中加载xedu积木用户库

此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html

注:此步骤是将xedu库的图形化积木库装到电脑上,因此只要需要用Mind+编写xedu的程序的时候就需要操作。

 


- 在用户库中搜索xeduhub,加载XEduHub库,加载后返回,可以在积木区看到。

 注:
 1、用户库会保存到Mind+的项目文件(.mp)中,因此如果打开了一个含有xeduhub库的项目文件,则会自动从项目文件中加载到Mind+,无需去用户库搜索。
 2、如果弹出提示要安装依赖库,由于4.1已经安装到行空板了,因此此处点击”取消“即可。

image-20240531155458003.png
image-20240527164855434.png
image-20240529195843379.png

步骤5 加载模型

此部分参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html;

复制onnx模型文件到项目中

1751112838307.png

步骤6 摄像头实时识别

此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html

使用摄像头识别的程序,注意需要先将摄像头插到行空板USB口上,并尽量保持摄像头背景不发生变化

- 扩展中添加OpenCV扩展
- 编写程序,打开摄像头,从摄像头中抓取图片,然后给xedu推理,最后用unihiker显示到屏幕上

c3d5093f81eff85080e2d18ed0de652.jpg

步骤7 物联网设计

本部分参照【行空板图形化Python入门教程】第11课:IoT数据助手
https://mc.dfrobot.com.cn/thread-314803-1-1.html
(出处: DF创客社区 - 分享创造的喜悦)

重点:
1、两块行空板远程连接各自的IP地址

2、两块行空板的MQTT初始化公用其中一块行空板的IP地址

1751113717681.png
1751113750114.png

步骤8 发射端程序

1751113843025.png
1751113868149.png

步骤9 接收端程序

1751113917694.png

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import sys
sys.path.append("/root/mindplus/.lib/thirdExtension/nick-xeduhub_main-thirdex")
import re
import cv2
import sys
import siot
import time
from unihiker import GUI
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
from XEdu.hub import Workflow as wf
import os



def format_valve_output(task):
    try:
        output_result = ""
        output_result = task.format_output(lang="zh")
        return output_result
    except AttributeError:
        return "AttributeError: 请检查输入数据是否正确"

# 自定义函数
def ShengGuangJingBao():
    for index in range(10):
        p_p23_out.write_digital(1)
        p_p24_out.write_digital(1)
        time.sleep(0.2)
        p_p23_out.write_digital(0)
        p_p24_out.write_digital(0)
        time.sleep(0.1)
def YiQieZhengChang():
    p_p23_out.write_digital(0)
    p_p24_out.write_digital(0)


siot.init(client_id="3497510678528568",server="192.168.1.42",port=1883,user="siot",password="dfrobot")
para_task1 = {}
u_gui=GUI()
Board().begin()
siot.connect()
siot.loop()
p_p23_out=Pin(Pin.P23, Pin.OUT)
p_p24_out=Pin(Pin.P24, Pin.OUT)
siot.getsubscribe(topic="siot/识别结果")
TuXiangLuJing = (str("Mind+.png"))
BiaoQianMing = ["tiger", "bear", "boar", "safe"]
init_para_task1 = {"task":"mmedu"}
init_para_task1["checkpoint"] = "model.onnx"
task1 = wf(**init_para_task1)
vd = cv2.VideoCapture()
vd.open(-1)
vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)
print("打开摄像头中")
while not (vd.isOpened()):
    pass
print("摄像头已打开")
while True:
    ret, grab = vd.read()
    if vd.grab():
        grab = cv2.resize(grab,( 240, 320))
        cv2.imwrite(TuXiangLuJing, grab)
        u_gui.clear()
        pic=u_gui.draw_image(image=TuXiangLuJing,x=0,y=50)
        txt=u_gui.draw_text(text="识别中",x=0,y=0,font_size=20, color="#0000FF")
        para_task1["data"] = TuXiangLuJing

        if 'task1' in globals() or 'task1' in locals():
            rea_result_task1 = task1.inference(**para_task1)
        else:
            print("init",'task1')
            task1 = wf(**init_para_task1)
            rea_result_task1 = task1.inference(**para_task1)

        output_result_task1 = format_valve_output(task1)
        JieGuoXuHao = output_result_task1["标签"]
        JieGuo = (BiaoQianMing[JieGuoXuHao])
        print(JieGuo)
        if (JieGuo == (str("tiger"))):
            txt.config(text=(str("识别结果:") + str(JieGuo)))
            siot.publish_save(topic="siot/识别结果", data="发现老虎")
            ShengGuangJingBao()
        if (JieGuo == (str("bear"))):
            txt.config(text=(str("识别结果:") + str(JieGuo)))
            siot.publish_save(topic="siot/识别结果", data="发现黑熊")
            ShengGuangJingBao()
        if (JieGuo == (str("boar"))):
            txt.config(text=(str("识别结果:") + str(JieGuo)))
            siot.publish_save(topic="siot/识别结果", data="发现野猪")
            ShengGuangJingBao()
        if (JieGuo == (str("safe"))):
            txt.config(text=(str("识别结果:") + str(JieGuo)))
            siot.publish(topic="siot/识别结果", data="一切正常")
    time.sleep(1)
代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import siot
from unihiker import GUI

# 事件回调函数
def on_message_callback(client, userdata, msg):
    if (msg.payload.decode() == (str("发现老虎"))):
        txt3.config(text="发现老虎")
    if (msg.payload.decode() == (str("发现黑熊"))):
        txt3.config(text="发现黑熊")
    if (msg.payload.decode() == (str("发现野猪"))):
        txt3.config(text="发现野猪")
    if (msg.payload.decode() == (str("一切正常"))):
        txt3.config(text="一切正常")


siot.init(client_id="46477227275962507",server="192.168.1.42",port=1883,user="siot",password="dfrobot")
u_gui=GUI()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
siot.getsubscribe(topic="siot/识别结果")
txt1=u_gui.draw_text(text="靠山村AI识别屏障系统",x=15,y=0,font_size=15, color="#0000FF")
txt2=u_gui.draw_text(text="村东头情况:",x=0,y=30,font_size=15, color="#0000FF")
txt3=u_gui.draw_text(text="",x=100,y=30,font_size=15, color="#0000FF")
pic=u_gui.draw_image(image="1.jpeg",x=30,y=80)
pic.config(h=240)
pic.config(w=240)
while True:
    pass

村庄模型制作:

我们团队打算采用学校现有的器材设计村庄的模型。村庄主体我 们采用运输营养餐的纸盒制作,使用壁纸刀切割,热熔胶粘和,做成 房屋和院落;使用裁剪下来的废弃纸板做成假山的骨架,然后用家里 装修剩的发泡胶设计高山的模型,发泡胶干后,用美术社团的丙烯颜 料涂色,用手工社团的边角废料做庄稼地和装饰。马路采用的是白色。

的纸板贴合而成,一是符合农村马路的风格(清一色水泥板路面,没 有沥青路),二是便于设别野生动物。

将科技社团的 USB 免驱摄像头使用乐高结构件固定在模型的村 东头,调整好角度,便于野生动物入村的识别效果。微信图片_20250427200000.jpg微信图片_20250427200010.jpg

感谢:首先感谢DFROBOT能够给我这次测试行空板扩展版的机会,让我再次感受到主办方的满满诚意,做作品前提是学习,学习到的知识对自己发展很有益,提交作品还有器材相赠,让我更是快乐加倍。

其次要感谢Forgotten的文章《行空板机器学习图像分类案例之手势识别》,让我能够学以致用,尤其是可以使用图形化运行模型,特别开心,对于我这个不会python的农村科创教师来说,这简直太又好了,让我可以现学现卖带领孩子们体验大模型、大数据。

最后要感谢DFROBOT的创客社区和造物记,大佬的帖子、文章让我学到很多知识,我也在学习的过程中,一点点的再成长。

评论

user-avatar