资料介绍
描述
介绍
在美国,全国约有 200 万公里的污水管道,为 2.4 亿美国公民提供服务。据报道,美国每年至少有 23,000–75,000 起下水道管道故障,这会向环境排放多达 3–100 亿加仑的未经处理的污水。这会导致巨大的经济损失、水污染,并威胁到公共健康。
这些下水道管道需要每年维护,以保持正常运行并避免下水道溢出。在大多数情况下,下水道检查由专家检查员在现场进行,他们通常使用带有摄像头的遥控机器人手动检查下水道的内部结构。这个过程非常耗时,而且由于工作的困难和令人厌烦的性质,时间常常会导致对下水道管道的检查有缺陷。
小下水道
TinySewer 是一个独立的摄像头模块,可使用 tinyML 识别下水道缺陷。该模块旨在安装在现有的机器人下水道检查平台上,为平台提供机器视觉功能,以在检查过程中识别下水道故障。
该模块允许自主下水道检查并减少检查员的工作量。检查员可以简单地缓慢驾驶汽车并观察屏幕上的 TinySewer 应用程序是否有任何检测,或者他们可以停下来手动检查。此外,TinySewer 将准确判断存在哪种类型的故障,因此无需专业的下水道检查员、普通检查员甚至入门级检查员就足够了。
为了进一步支持自主检测,TinySewer 客户端应用程序在视频时间线上记录所有带有检测标签的镜头,以便检查员查看镜头并轻松选择故障发生的时间点。这允许检查员在进行下水道检查的同时处理其他任务。
可扩展性
在可扩展性方面,TinySewer 非常便宜,因为它每台仅需 150 美元左右,并且可以轻松集成到现有的机器人系统或下水道检查工具中。此外,TinySewer 强大的故障检测系统允许创建一个更大的系统,其中自主下水道检查机器人定期进行下水道检查并将带有缺陷报告的镜头发送到单个主机计算机可以对各种下水道故障报告进行分类并指定人员修复有缺陷的下水道.
低功耗能力
TinySewer 使用 Arduino Portenta H7 作为其主要计算单元。Arduino Portenta H7 采用双核低功耗 Cortex M7 处理器,有助于降低功耗。
此外,TinySewer 允许其操作员在检查待机或完成时关闭摄像头。这将总共节省大约 40mA。最后,操作员可以选择关闭 Tiny Sewer,这将使设备进入深度睡眠模式,直到有外部中断将其唤醒。
原理图
TinySewer 模块包含一个带有外围设备的 Arduino Portenta 微控制器,包括一个通过高密度连接器连接的 Vision Shied,用于相机馈送。还有两个直接连接到 Arduino Portenta PH15 引脚并由 PWM 控制的白色 LED。一切都由 5V、2.4 安培便携式电池供电。
套管
TinySewer外壳使用 PLA 灯丝制成,可以使用本文提供的文件从 3D 打印机轻松打印。外壳包括顶部、底部和盖子。
该装置如下组装,Arduino Portenta H7 先进入,然后将两个 LED 放在顶部 2 个中间孔上,并将它们连接到 Arduino Portenta H7 的电线上。然后将顶部放在底部,然后在 4 个角上放 4 个 m3 螺钉。最后,将盖子盖在裸露的插销部分上,以防止水和灰尘进入设备内部。
该模型
TinySewer 使用深度学习神经网络架构来分类和识别各种下水道故障类型。目前,TinySewer 可以以至少 85% 的置信度检测四种最常见的下水道故障类型(裂缝、根部侵入、阻塞、位移)
该模型是使用Edge Impulse机器学习平台创建的。首先,我从ScienceData获取图像。数据集附带一个 CSV,其中包含图像名称及其故障类型。我只是创建了一个简单的 python 脚本来读取这个 CSV 并将图像分类到其各自的故障文件夹中。然后将这些图像上传到 Edge Impluse 进行训练。总的来说,我们的模型有 5 个不同的类别:正常、裂缝-断裂-塌陷、障碍物、根部和位移。
接下来,我将创建一个冲动页面来设置工作流程。选择 96x96 作为图像宽 x 高,处理块作为图像,迁移学习图像,然后单击“生成参数”。
接下来,转到图像选项卡以生成特征参数。请记住为颜色深度选择灰度,因为 Arduino Portenta Vision Shield 是单色相机。
最后,选择迁移学习选项卡来训练您的模型。对于 TinySewer,我使用 MobileNetV2,学习率为 0.35,最后一层有 40 个神经元。
该模型使用 50 个 epoch 进行训练,数据增强开启。该模型整体准确率在94%左右。
最后,为 Arduino Portenta 生成模型文件和标签文件。我转到部署选项卡并选择 OpenMV 并单击构建。这将生成一个 zip 文件,其中包括label.txt (标签文件)、train.tflite (模型文件)和 ei_image_classification.py(python 分类脚本)。将label.txt和train.tflite复制并粘贴到 Arduino Portenta 内部存储中。该脚本需要修改以提供 WLAN、视频和数据传输功能。这些修改将在固件部分讨论
固件
固件是使用 MicroPython 制作的,它只是 python3 的一个实现,带有一个标准 Python 库的子集,经过优化可以在微控制器上运行。
首先是设置wifi,这可以通过使用WLAN方法简单地完成。然后创建一个套接字端口,以便客户端可以与同一网络上的 TinySewer 通信。
# Create server socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# Bind and listen
print(PORT)
s.bind([HOST, PORT])
s.listen(5)
# Set server socket to blocking
s.setblocking(True)
# Create server socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# Bind and listen
print(PORT)
s.bind([HOST, PORT])
s.listen(5)
接下来,程序初始化camera对象、MQTT对象,并设置变量load为model和label
# Init Camera
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
# Load in Model and labels
net = "trained.tflite"
labels = [line.rstrip('\n') for line in open("labels.txt")]
#Setup MQTT
payload = MQTTClient("openmv", "test.mosquitto.org", port=1883)
payload.connect()
接下来我们定义流式传输函数,该流式传输函数使用 MJPEG 协议将来自 TinySewer 摄像头的视频流传输回客户端应用程序,
def start_streaming(s):
print ('Waiting for connections..')
client, addr = s.accept()
# set client socket timeout to 5s
client.settimeout(5.0)
print ('Connected to ' + addr[0] + ':' + str(addr[1]))
# Read request from client
data = client.recv(1024)
# Should parse client request here
# Send multipart header
client.sendall("HTTP/1.1 200 OK\r\n" \
"Server: OpenMV\r\n" \
"Content-Type: multipart/x-mixed-replace;boundary=openmv\r\n" \
"Cache-Control: no-cache\r\n" \
"Pragma: no-cache\r\n\r\n")
# FPS clock
clock = time.clock()
# Start streaming images
while (True):
clock.tick() # Track elapsed milliseconds between snapshots().
frame = sensor.snapshot()
cframe = frame.compressed(quality=35)
predict = prediction(frame)
#print(predict)
header = "\r\n--openmv\r\n" \
"Content-Type: image/jpeg\r\n"\
"Content-Length:"+str(cframe.size())+"\r\n\r\n"
client.sendall(header)
client.sendall(cframe)
#client.sendall(bytes('POST /%s HTTP/1.0\r\nHost: 127.0.0.1:9990\r\n\r\n' % (predict), 'utf8'))
payload.publish("openmv/test", str(predict))
payload.check_msg() # poll for messages.
print(clock.fps())
接下来,我定义了一种预测方法,它只查看当前帧并使用 tinyML 模型计算每个标签的置信度。标签和各自的置信度被连接成一个字符串,然后通过 MQTT 发送到客户端应用程序
def prediction(img):
prediction = ""
#print("predict call")
for obj in tf.classify(net, img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):
#print("**********\nPredictions at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())
#frame.draw_rectangle(obj.rect())
# This combines the labels and confidence values into a list of tuples
predictions_list = list(zip(labels, obj.output()))
#prediction = predictions_list[0][1] #defect confidence
for i in range(len(predictions_list)):
#print("%s = %f" % (predictions_list[i][0], predictions_list[i][1]))
label = str(predictions_list[i][0])
confident = str(predictions_list[i][1])
prediction += label + ":" + confident + ","
#name = (predictions_list[i][0])
#if label != "normal" :
#prediction = predictions_list[i][1]
return prediction
然后我有一个 lightcontrol() 方法来控制两个 LED 的亮度。该方法采用 0 到 100 之间的整数,0 表示最亮,100 表示没有光
def lightControl(percent):
for k, pwm in pwms.items():
tim = Timer(pwm.tim, freq=1000) # Frequency in Hz
ch = tim.channel(pwm.ch, Timer.PWM, pin=Pin(pwm.pin), pulse_width_percent=percent)
最后,还有一个设置初始光照值的主while循环,称为视频流函数。
while (True):
try:
lightControl(50)
start_streaming(s)
print("main call")
except OSError as e:
print("socket error: ", e)
#sys.print_exception(e)
完整的实现在 Github 上名为 sewer.py 的文件中
软件
该软件是使用名为 Electron 的框架制作的。Electron 允许使用Node.js等 Web 技术开发桌面 GUI 应用程序。TinySewer 客户端分为两个选项卡。第一个选项卡包含来自 TinySewer 的视频流、用于录制视频的按钮、用于灯光控制的按钮以及当前下水道故障及其置信度的显示框。
第二个选项卡用于视频分析。Stream 会自动保存为 .mp4 视频文件,可以回放以供进一步分析。此外,还有一个视频时间线,其中包含检测到下水道故障时的持续时间亮点
小下水道在行动
- 满足大功率系统不断增长的故障检测需求
- 流量计-飞猫系列3
- 直流接地故障检测原理分析及接地故障种类 查找方法
- 机器学习在故障检测与诊断领域中的应用综述 57次下载
- 基于CPCI总线的航天器通信信号设备故障检测 12次下载
- 模块化多电平储能系统开路故障诊断方法 4次下载
- 气体传感器检测设备的应用 9次下载
- 克服基于驱动的故障功率检测方法的技术挑战 7次下载
- 功放的故障检测与维修技巧 37次下载
- 基于ZigBee网络的下水道安全监测系统 2次下载
- 导航系统故障检测与诊断技术综述 45次下载
- 火炮故障检测系统设计及精度问题研究 22次下载
- 检测太阳能发电系统接地故障的装置和方法
- 基于GSM短消息的地下水水位自动测报系统
- 雷达故障自动检测系统
- 电动机故障检测方法有哪些 1852次阅读
- 功率分析仪的常见故障和原因分析 730次阅读
- CAN收发器故障检测电路及算法 2021次阅读
- 空调技术:使用“故障自检”功能检测故障 1535次阅读
- 基于分流器的故障检测方法 1637次阅读
- 基于物联网与无线网络技术实现地下水监测系统的设计 1735次阅读
- 盲孔、通孔和埋孔的区别 5.1w次阅读
- 电路故障检测的8种判断方法 6.5w次阅读
- 投入式液位计故障判断_投入式液位计故障检测方法 3855次阅读
- 电磁离合器的检测及常见故障解决 8552次阅读
- 便携式智能电表充值故障检测系统的原理及设计 1006次阅读
- 监控系统故障检测及处理 6656次阅读
- 基于物联网技术的下水道溢流监测系统解决下水道溢流 6813次阅读
- CDMA 系统的闭环功率控制方法以及高精度RF功率检测器的应用实现介绍 1127次阅读
- 基于AD7705的在线激光功率检测系统设计 3485次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多