欢迎光临散文网 会员登陆 & 注册

7.1滤波

2023-08-29 11:50 作者:亦或丫  | 我要投稿

决定先写这一部分,害怕坚持不下去,就先把最重要的东西写。

总是有人说K210不行,没有openmv好,强大也就仅仅能加载AI罢了,识别结果也十分混乱。但就个人理解来讲K210是强过openmv的,K210的视觉处理结果错误很大程度上与干扰相关联,就如同STM32与STC51类似,性能上的差异,最终会导致一定程度上的取代。

本章节的内容:

实现滤波,在封装完成的库基础上,对图像处理结果进行滤波处理以提高视觉识别的精准度。

针对AI视觉分析以及颜色追踪过程中的识别(以送药小车视觉识别为例)

本章节的内容完全是个人对于k210使用过程中的理解,网络上应该没有相关的资料。

设备:鸭脖K210开发板        固件:maixpy_0.6.2_85.openmv_kmodel_v4_with_ide_support.

根据鸭脖二群内的说法:先烧录鸭脖固件后再烧录maixpy的固件即可

#####################################################################

一、AI视觉识别

#####################################################################

  1. 烧录固件:

    使用K-flash,CanMV IDE 以及 Maixpy IDE的烧录功能即可。

    需要注意的是:鸭脖请先烧录自身固件后再烧录maixpy固件!!!

K-flash

2.选用模型

由于Canaan总是崩溃,而且没有模型分享,需要自己训练,这里只是找一个例子。

所以选择maixhub,而且这个也是我在训练往年送药小车时发现的问题(当时canaan已崩),很多人便投入到maixhub的怀抱,我也不例外,当时还挺害怕库不通用,得重新学一遍,结果便是很多东西都是基于openmv的,所以函数名称也没有太多变化。总之,在不同的设备移植只需要保证烧录固件(固件中有对应引脚关系以及函数执行逻辑)正确即可。

选择在maixhub上分享的数字识别模型

👆这位大佬的
使用kmodel固件前将模型烧录或则放入sd卡中

3.问题

这个模型训练的次数和质量已经挺好的,但即便如此识别还是有很多问题。

首先便是对于数字1的识别,很多时候阈值只能达到0.54左右。

接着便是数字2的问题,很多情况下,都能够将边框识别为数字2,特别是阈值较低的时候。

其次相似的数字比如2,5,8之间便很容易识别错误,造成波动。

然后便是波动,识别很容易受到外界影响,容易发生识别结果波动,列如 1 1 2 1 1 1 

最后便是这位大佬的模型是在一定高度训练的,距离数字的距离也会影响识别结果(严重)。

下面将一一列举这些问题并且提出解决方案:

(1) 阈值较低时候会多次识别,且拥有波动

选用threshold=0.5(maixhub训练后默认),这里以数字1为例,其classid:0 

数字1被圈定多次


如果将识别结果进行输出则可以看到如下的结果

classid:0->1,classid:6->7

而且可以看到数字1的value(准确率0~1)是较低的,大概在0.5~0.7之间,这样便会导致识别十分不准确,如果将阈值设置到0.7则会多次出现为7的情况,少次为1的结果。

现在的问题是:在不改变threshold的情况下实现滤去7个结果。

当然,目前出现了两个问题,但目前我们先来解决第一个问题——波动;从上图的结果可以看到,即便存在1,7误认的情况,数字1的识别次数也是多于数字7,所以是不是可以设计一种滤波器:必须存在n次连续的变化后才会让输出变化。这个原理类似于STM32捕获通道里所使用的滤波器,实际上我的灵感正来自于此。

这里由于我已经将这个数字滤波器写成了模块的形式,所以这里直接引用完成的模块

已经写好的滤波模块库

不过在进行滤波前,必须要先知道识别的结果是什么,可以依靠哪个值来进行筛选

这里以一次很早的结果为例,返回的是一个列表,包含每个框的信息:x,y,w,h,value,classid。

实际上能够使用的也仅仅是这六个值,或则说是三个值(x,y,w,h可看错一个坐标信息)。

x,y,w,h:起始点像素坐标(x,y),框宽度:w,框高度:h

value:识别结果的可靠性

classid:识别结果对应的标签

返回值的形式

首先,如果要连续n次变化,则需要有一个变量能够记录上一次结果;

其次还要有一个变量能够记录连续出现同一个结果的次数;

最终,当滤波次数需要外部输入的时候,还需要一个变量记录给定次数;


Digital Filter

func是函数功能选择,是指在运行其他函数滤波后再次滤波

注:经过func_cmpobj只会返回一个值,所以可以使用此滤波器

注:经过func_Div_cmp会返回多个值,分别为每个区域中可能性最大的结果,不可使用此滤波器

注:func_none为测试此滤波器功能使用的值,在直接调用时必须先经过排序

所以,现在反思一下,好像也仅仅func_cmpobj可以调用欸......好吧,我的锅。Div_cmp只会返回每个区域中最有可能的值,但并不会将区域返回,并且会有多个需要记录的值,所以这个滤波器会失效(滤波性能)。只要value最大值不变化,那么返回值便不会有较多处理。不过,这个功能也仅仅是为了屏蔽掉某些多次出现的框。

由于这里0的识别结果出现明显多于7,所以仅仅使用这个滤波器便可以很好的解决这个问题。

紧接着便是func_cmpobj功能的叙述,这个缩写为compare_objects核心便是比较,所以最早我这样称呼它,当然这个称呼是十分不准确,不形象的。这个功能建议称为筛选,核心思想便是通过比较value值筛去一部分干扰值(特指2)

readvalue是一个函数:返回值为字典中的value值(需要自己定义)

score是用于记录可信度差值,当差值大于一定的阈值时候才会输出。

这里由于2个干扰太大,所以将2与其他情况分开讨论。

数字筛选阈值设置
筛选函数内容

其实这个筛选的方法来自亚博K210手写数字里的部分内容:

这里来讲写的还是不错的

但筛选法的不足还是十分明显的,最终只会筛选出一个结果返回,其他结果都会舍弃掉。

但这对于送药小车的第一步,识别单个数字,确定远中近端来讲是十分有益的,结果必须十分准确,且视觉识别的结果有切近能有一个数字,所以必须要十分准确,故将筛选和滤波一同使用。

(2)接下来便是多个数字识别的问题,在屏幕上会出现多个数字,每个数字被框定多次。

这个问题会出现在巡线遇到十字线(使用模板匹配即可)判断远近端时候出现,对此我也提出几种解决方案。

  1. 分屏:对于第N次十字线的数字识别结果一定在某个范围内(1,2),(3,4)......且出现的位置为屏幕的两侧(灰度巡线保证线在正中央),分为二框,四框识别即可。

  2. 小车转动:到达十字线时候,小车会从左到右自转(既然解决不了问题,也解决不了提出问题的人,那么就将问题交给别人解决<( ̄ c ̄)y▂ξ),识别数字。

  3. 分块筛选:将返回值的结果自动分为几块,每块都执行以此筛选。这个不光可以用于执行小车,实际上任何多框出现都可以使用。

这里,我选择了方案3(*  ̄︿ ̄)

会有人说可以设置 识别结果的面积重合,不过,我们所需要的不仅仅是识别结果的classid,还有识别结果的位置坐标信息x,y,w,h 或则说 cx,cy(central_x,central_y),多个框重合会导致框的中心点坐标出现明显的偏移,也就是左右无法判断。

3,4由于波动恰好没有录上

先使用画图工具描述一下核心思想(>﹏<其他的可视化工具不会用,也没有时间学了)

假设这是一套由视觉识别返回的识别结果(x,y都表示的是中心点坐标)


返回的结果(当然是没有顺序的)

第一步:排序:依据value值排序,筛除部分不可信的结果

排序情况

第二步:分组:将中心点邻近的结果分为到同一组内:这里假设中心点坐标在-20~20以内认为邻近;(以abs(cx1-cx2)<=20)

(1)首先以可信度最高的作为第一组的第一个识别结果,然后将剩余识别的结果与此比较中心点坐标,相近的添加进来,并且从原排序结果中删除;

第一组分组后的识别结果
剩余的原序列

(2)再以剩余结果内置信度最高的结果再次分组

第二组分组后识别结果
第三组分组结果
第四组分组结果

直到剩余序列(原序列)中无剩余;这样便得到了分组结果,再对分组结果进行前面设计的筛选函数,对每组进行筛选,选择最高情况便可以了。

python实现

Result:分组的结果

Temp:缓存列表(每次添加后剩余的识别结果所组成的列表)

i:分组数

threshold_x,threshold_y:中心点邻近判断阈值界限

进一步滤波

也可以对分组后的结果再进行进一步的筛选(这里仅仅以判断2/4数字进行分析)

当然,也可以对结果的中心点坐标进行筛选。

(注:分组这一部分是8.29号所写,有一部分东西已经遗失,加上马上要重装系统,暂时就先停止亲自实验咯)

当然到这里似乎已经结束了,但各位还会在写代码的时候遇到各种各样的情况,需要针对情况进行设计对应的滤波函数提高精准度。

原本是计划写一个带有卡尔曼滤波的

某个摆烂货的原话

最后是仅仅把MPU6050的卡尔曼滤波写完,也没有再思考如何加入到这个上面来的

(看情况,如果想要的人多的话,我尽量写一份分享一下)

而色块追踪中也可以使用类似的思想

当然没写咯

最后呢,由于情况特殊(个人摆烂,剩余的部分也懒得写,因为报销需要上交物品,所以.....)

依据最后的观看情况酌情是否续写吧......

如有错误,请及时联系我(经常在线)


7.1滤波的评论 (共 条)

分享到微博请遵守国家法律