项目灵感:根据《义务教育信息科技教学指南八年级物联网实践与探索》第五单元物联网应用探索和第六单元物联网安全,并结合家乡黑龙江省2024年东北虎伤人事件制作了跨学科学习配套资源,可实现跨学科教学。本课是基于物联网中的摄像头和传感器获取丰富实时的数据,体验行空板和摄像头及多种传感器协同工作,实现远程的反馈与控制,了解物联网中数据的重要作用,认识物联网为社会发展带来的重要价值。
本文是基于我在造物记参考并学习造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html;和【行空板图形化Python入门教程】第11课:IoT数据助手
https://mc.dfrobot.com.cn/thread-314803-1-1.html(出处: DF创客社区 - 分享创造的喜悦)

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

针对生态保护成效显现后野生动物肇事频发的新矛盾,本研究旨 在开发一套基于AI 图像识别与物联网技术的低成本智能防护系统, 突破传统防护中“误报率高、驱离滞后、安装昂贵 ”三大瓶颈。通过构建轻量化动物识别模型(东北虎、黑熊辨识准确率≥90%)、研发声光协同驱赶装置、搭建低功耗无线预警网络,实现“精准识别-快速响应-非伤害驱离 ”的全流程自动化防护。项目以乡村可承受成本替代万元级专业设备,既守护生态保护成果, 又保障村民生产安全,为科技赋能“人与自然和谐共生 ”提供学生视角的创新实践方案。
行空板M10、扩展板结合摄像头和其他传感器等硬件,具备强大的数据处理和交互能力,能够开发出智能的识别野生动物接近人类生活区域的守护系统,为人类和野生动物建立起一栋无形的分隔保护墙,同时也为初中信息科技课程提供实践平台,助力学生在掌握硬件操作、编程及AI技术,提升科创素养的同时,能够将所学知识应用于实际,达到实践出真知的目的。
项目实现效果:
用AI+物联网技术,为普通村庄设计“用得起、认得准、反应快 ”的智能防护系统的想法。就像孙洪尧老师说的:“保护生态不是把人类或者动物赶出自然,而是用科技搭建和谐共处的智慧桥梁。”
首先使用两个行空板搭建村庄物联网,一块行空板作为数据发送端,连接摄像头、蜂鸣器和红色LED灯,,位于村庄模型的村庄入口处,便于识别是否有野生动物入村;另一款行空板作为数据接收端,位于村委会。当发现东北虎、黑熊、野猪等野生动物入村后,及时识别、发出声光警报并向村委会发送消息。


项目创新点:“会认野生动物 ”的 AI摄像头:基于 MMEDU 的轻量化动物识别模型。
通过学习使用浦育平台拍照取样 生成 ONNX 模型,然后在行空板上运行模型,搭配普通摄像头就可以 完成图像分类,实现物体分类识别野生动物的效果,这样一来,造价低了很多。所以我决定放弃初期采用二哈识图的方案转而使用普通摄 像头实现物体分类的效果。
“不拼硬件拼算法 ”:没有用昂贵的工业摄像头,靠自制数据集和模型压缩,让几十块钱的普通摄像头摇身一变,实现专业级识别。
“让技术有温度 ”:驱离装置不用电网、毒饵,用动物行为学设 计“恐吓但不伤害 ”的方案。
硬件介绍:
1、行空板
行空板M10是一款专为信息科技课程中的编程学习、物联网及AI项目教学需求而开发的学习板。行空板又称UNIHIKER,它是一款国产教学用开源硬件,它自带Linux操作系统和Python环境,还预装了常用的Python库,能够轻松胜任各种编程相关的开发场景,如搭建物联网系统、体验人工智能应用、编写电子游戏、进行科学实验、设计声光互动、开发可穿戴设备等。
同时,行空板作为智能终端设备,其板子本身采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。



2、行空板M10电机扩展板
专为行空板(UNIHIKER)M10开发适配的背夹便携IO扩展板,含IO扩展板及金手指扩展板(需组合使用)。该板兼容背夹电池实现独立供电,且有乐高孔距固定乐高件。紧凑式设计使功能扩展仅在11mm厚度内实现。
该扩展板集成了两路直流电机驱动,同时板载了RGB灯、红外发射、红外接收功能,以及扩展3路3Pin口、2路I2C口、2路舵机接口。配合DFRobot强大的Gravity产品体系,让行空板M10更好地满足供电、手持、便携、紧凑功能的项目制作。
3、USB摄像头:这是一款插入USB端口就能使其工作起来的免驱摄像头,30W像素,640*480分辨率,即插即用,兼容树莓派和英伟达Jetson Nano系列主板,特别在你的树莓派或Jetson Nano主板装上外壳后使用起来更方便。
模块拥有30mm*25mm*21.4mm的小巧体积,可嵌入于各类设备,用于人脸识别,图像识别,安防,远程教学等项目之中。
步骤1 使用3D打印机打印野生动物模型并上色
步骤2 2、使用浦育平台的在线工具,采集野生动物的图片模型,并进行生成ONNX模型和训练,测试模型的效果。(后期在村庄模型重新进行了采集,识别效果提高很多)
本部分内容参照了造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html

步骤3 行空板安装xedu库
此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html
此步骤是将xedu的python库装到行空板上,不是装电脑上,因此需要在所有行空板上执行一次且只需要一次即可,跟使用的电脑没有关系。

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


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




在PIP模式中输入```xedu-python```,选择“清华大学”源,后点击运行,此时将通过网络将xedu库安装到当前连接的行空板上,等待运行结束(提示“命令运行完成”)之后返回“模块”编程界面。
注意:
1、需要保证此窗口左上角显示“行空板”,如果没有显示,说明上一步连接行空板未成功,此时安装则是将库安装到了电脑而非行空板。
2、如果下方窗口显示多行Requirement alread satisfied:xxxx,说明库已经被安装了,无需安装。
3、下方窗口以WARNING开头的一行提示是警告,不是错误,不需要管。
4、如果下方窗口显示多行Warning: Retrying.................[Errno -3]......,说明未按照上一步正确让行空板连接WiFi,没有连接WiFi无法安装库,回到4.1操作。


步骤4 在Mind+中加载xedu积木用户库
此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html
注:此步骤是将xedu库的图形化积木库装到电脑上,因此只要需要用Mind+编写xedu的程序的时候就需要操作。
- 在用户库中搜索xeduhub,加载XEduHub库,加载后返回,可以在积木区看到。
注:
1、用户库会保存到Mind+的项目文件(.mp)中,因此如果打开了一个含有xeduhub库的项目文件,则会自动从项目文件中加载到Mind+,无需去用户库搜索。
2、如果弹出提示要安装依赖库,由于4.1已经安装到行空板了,因此此处点击”取消“即可。



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

步骤6 摄像头实时识别
此步骤参照造物记《行空板机器学习图像分类案例之手势识别》的文章介绍内容,有兴趣的老师可以点击连接进行学习提升。https://makelog.dfrobot.com.cn/article-315232.html
使用摄像头识别的程序,注意需要先将摄像头插到行空板USB口上,并尽量保持摄像头背景不发生变化
- 扩展中添加OpenCV扩展
- 编写程序,打开摄像头,从摄像头中抓取图片,然后给xedu推理,最后用unihiker显示到屏幕上

步骤7 物联网设计
本部分参照【行空板图形化Python入门教程】第11课:IoT数据助手
https://mc.dfrobot.com.cn/thread-314803-1-1.html
(出处: DF创客社区 - 分享创造的喜悦)
重点:
1、两块行空板远程连接各自的IP地址
2、两块行空板的MQTT初始化公用其中一块行空板的IP地址


步骤8 发射端程序
步骤9 接收端程序
# -*- 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 免驱摄像头使用乐高结构件固定在模型的村 东头,调整好角度,便于野生动物入村的识别效果。
感谢:首先感谢DFROBOT能够给我这次测试行空板扩展版的机会,让我再次感受到主办方的满满诚意,做作品前提是学习,学习到的知识对自己发展很有益,提交作品还有器材相赠,让我更是快乐加倍。
其次要感谢Forgotten的文章《行空板机器学习图像分类案例之手势识别》,让我能够学以致用,尤其是可以使用图形化运行模型,特别开心,对于我这个不会python的农村科创教师来说,这简直太又好了,让我可以现学现卖带领孩子们体验大模型、大数据。
最后要感谢DFROBOT的创客社区和造物记,大佬的帖子、文章让我学到很多知识,我也在学习的过程中,一点点的再成长。
评论