介绍一下这个项目的基本情况,这个项目是关于电力高架线巡检的,主要任务就是负责巡检和除冰,巡检的主要内容就是看看线路的情况,有没有比较基本的故障,比如接地短路,断线故障,或者是一些个杂物等等,有了杂物之后通过机械臂进行清楚或一些其他处理,同时需要对线网的外观进行一些检测,看看有没有一些特别明显的熔断或者破损情况,由于这个机器人是在线上行进的,所以对比传统的线下人工巡检,从细节上讲,机器人的摄像头应该能更好的更清楚的发现一些问题,除了这两种功能以外,我还打算用Vision Board尝试一下用它检测线路上的结冰图像,主要用的就是tflite,和openmv的开发方式,基于RT-Thread为底层的micropython固件,由于项目本身的原因,对于Vision Board的使用主要集中在应用开发方面,包括线路识别,线路细节识别,杂物识别,结冰情况识别以及一些通信外设的使用,还有就是关于板子上自带的WiFi模块的图传功能,这也是项目本身需要的。
线路识别的基础就是看摄像头能不能识别出来高架线,对于直接架在线路上的机器人来说,摄像头所捕捉到的线路还是比较大的,所以Vision Board的板载摄像头应该是够的,为了简单起见,我先使用了openMV的程序,里面有比较方便的线路识别程序。
经过几次尝试,我感觉这个程序还是比较符合我的预期。
线段的起始位置点坐标,在实际运行的时候,其实并不需要这些坐标,因此要把代码中的打印删除,只需要保留一个判断存在不为空的语句就可以了。
这个功能最主要的目的是用来判断线路的断线或者短路情况,有时直接看照片会比较模糊,如果加上这样的线标在图片上,有助于观察线路的情况,比如出了断线或者短路接地等纵向或者横向故障,标出来就更一目了然了。
经过调试,发现识别线路在0.5mm左右感觉识别的效果最好
对于整体是有很多线段那种情况,我感觉实际应用工程中,如果讲摄像头云台调转到比较近的地方,基本上不需要识别出那么多的线段,最多也就两三条,如果是多分裂导线那么也就四五条的样子,Vision Board 的openmv固件几乎支持所有的基本识别函数,我用了另一个识别“线”的文件或者是函数,但是发现他是用来寻找直线的,而且必须最好是那种贯穿的直线,所以对于本项目那种需要识别出线段的情况其实不是很合适,一方面场景不对,另一方面用处不太合适,但是并不是是说这个板子识别的慢,我针对这个函数特意检测了一个电脑屏幕那样的,发现速度还是非常可观的,足以证明只要用好这个板子,可以胜任很多工作。
还有一个主要的功能是结冰识别和杂物识别,由于Vision Board 能使用Tflite这样的工具,我尝试能不能把他们放在一起进行识别,感觉这样是对芯片能力的一种考验吧。电力巡检常见的两种杂物,容易挂在线路上的,主要是塑料袋和鸟巢,因为数据集比较特殊,没有什么现成的数据集可以用,所以从百度上找了一些,看了几千张图片,发现符合我要求的并不多,感觉更对算法和芯片的能力提出了要求,因为之前我用k210弄的数字识别,相当不理想,这回看看瑞萨的怎么样(他甚至没有什么专门的神经网络硬件加速单元)
先放上点数据集的图,转换的时候有水印,但是最后发现一点也不影响。
用的是这个网站,感觉比k210的要好的多,不用排队,功能也强很多。
直接搜完注册就能用,没有什么门槛,也不收费,就是界面全是英文的,我当时是看的哔站上的这个up主的视频,我觉得非常好。
【【RA8D1-Vision Board】基于OpenMV 实现图像分类】
https://www.bilibili.com/video/BV1Rk7DeZETe
直接跟着操作就可以了,简直可以称得上是保姆级教程,有一点要提的是,图片的扩展名需要是一样的,我图方便就用的那种在软件商店里面下载的格式转换器,虽然有一点水印,但是最后的结果感觉几乎没有什么影响。
以下是我训练的一些配置:
这个部分在原来的视频当中没有出现,因为他视频里面选的是H7内核的那个,现在更新上来了,网站里已经有了配置,我是这么填的,感觉没出现什么错误,其他的都很正常。
之后是测试结果
可以看到它在检测鸟巢的时候准确率还是很好的,整体是在80-90%左右,刷新的很快,截图的时候就恰好是这个准确度,反正k210是达不到这个效果。
这是在识别结冰线路的时候的数据,准确度还是可以的。
由于我想收集和训练的数据其实是那种挂在高架线上的垃圾袋,为啥电力巡检有的时候要看这个,是因为有的时候,塑料袋加上雨天,可能会导致绝缘子闪络甚至击穿,或者是那种非永久性的短路,比如一重合闸就又好了,但是这些虽然听起来离谱,但是实际上确实要处理的,否则继保一跳闸,还是得去清理。找遍了网上发现复合要求的感觉不多,陆续在几个网站上看了几千张,几乎很少有那种“标准数据集”,只好用这些“飞舞的垃圾袋”代替,准确率也是很高的。
在识别到结冰图像的时候,我在Vision Board设置了一个引脚用来和电机控制板通信,之前想用串口来着,但是感觉一是不需要那么复杂的逻辑,还有就是要考虑到在高压电场和电晕放电下的对通信线路的干扰肯定会不小,所以定义了一个引脚,检测到结冰图片的时候,低电平,未检测到的时候就是默认高电平,这样抗干扰会好一些。
下面是识别的完整代码
# Edge Impulse - OpenMV Image Classification Example
import sensor, image, time, os, tf, uos, gc
from pyb import Pin
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240)) # Set 240x240 window.
sensor.skip_frames(time=2000) # Let the camera adjust.
#定义标志位引脚
p_out = Pin(("GPIO_25",508), Pin.OUT_PP)
net = None
labels = None
try:
# load the model, alloc the model file on the heap if we have at least 64K free after loading
net = tf.load("trained.tflite", load_to_fb=uos.stat('trained.tflite')[6] > (gc.mem_free() - (64*1024)))
except Exception as e:
print(e)
raise Exception('Failed to load "trained.tflite", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')
try:
labels = [line.rstrip('\n') for line in open("labels.txt")]
except Exception as e:
raise Exception('Failed to load "labels.txt", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# default settings just do one detection... change them to search the image...
for obj in net.classify(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())
img.draw_rectangle(obj.rect())
# This combines the labels and confidence values into a list of tuples
predictions_list = list(zip(labels, obj.output()))
for i in range(len(predictions_list)):
print("%s = %f" % (predictions_list[i][0], predictions_list[i][1]))
if predictions_list[2][1] >= 0.9:
p_out.value(0)
else:
p_out.value(1)
#print(clock.fps(), "fps")
————————————————
版权声明:本文为RT-Thread论坛用户「单片机单片魂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://club.rt-thread.org/ask/article/d32afe940776f36e.html
最后要提一点的是,这个Vision Board的micro python库是基于RT-Thread的mpy固件,其中一些外设是做了适配的,这需要去看原来编译固件的时候的c的代码,其中一些细节,比如GPIO的名称,里面会有。
最后完成的整体图:
购买 Vision Board
https://m.tb.cn/h.g0TaaKTnfx6iM2W?tk=lI8TWrhauqR
想要在RT-Thread平台或社区投放内容?或想参与相关直播活动及赛事?RT-Thread已开放对接窗口,请通过邮件与我们取得联系,期待合作!
↓ 点击“阅读原文”购买开发板