vlambda博客
学习文章列表

人工智能——EV3图像识别技术初探


由于我们获得的绝大部分的信息都来自于视觉,因此图像识别技术是人工智能的一个重要领域。我们的生活中到处都能发现图像识别技术的身影,例如面部解锁、识别车牌、照片分类、安防系统等等。在教学中,中小学生很难在不调用库的前提下完成对复杂图像进行识别的程序,但是对具有规律的、简单的图像,教师还是可以尝试引导孩子们通过编程了解其原理的。例如EV3能否识别简单的图形吗?请看下面的视频。



视频中我们发现,EV3能够判断所画的图形是长方形还是正方形,并描述图形的大小。程序分为三个部分,第一个部分是利用按键实现画图功能,第二个部分是提取并分析所画图形的特征,第三个部分是对特征进行匹配,通过文字和语音的方式描述识别结果。接下来我们就分别讲解如何通过程序实现这三个部分。


1、画图


在讲解程序之前我们先来思考一下图像识别的原理。为了获取图像信息,我们需要采集图像中每个像素的数据,因为EV3屏幕只能显示黑白两种颜色,因此每个像素只有两种情况,那么我们就可以采用元素类型为逻辑的二维数组来描述整个图片的信息,黑色代表逻辑为真,白色代表逻辑为假。可是EV3中没有现成的二维数组模块,只有一维数组,因此我们需要把一维数组改造成二维数组,这里要特别感谢酷爱科创张老师提供的思路。一维数组如何变成二维数组呢?首先我们要确定二维数组的最大列数是多少,假设是10,那么一维数组[a]和二维数组[Y,X]索引的对应关系如图1所示,我们可以发现二维数组的列数X相当于一维数组索引a的个位数,二维索引的行数Y相当于一维数组索引a的十位数,因此我们就可以对Y乘10,让a=10Y+X。也就是说,我们把一维数组中的元素每十个分成一组,对应二维数组的一行。二维数组写入与读取的内部程序如图2所示。

人工智能——EV3图像识别技术初探

图1

人工智能——EV3图像识别技术初探

人工智能——EV3图像识别技术初探

图2


有了二维数组,接下来我们就可以研究如何利用按键画图了。我们先来确认如何画图,EV3除了退出键一共有五个按键分别是上下左右和确认键,我们可以利用确认键控制落笔/抬笔,上下左右控制绘图方向。如何利用确认键控制落笔/抬笔呢?首先我们需要默认开始时是什么状态,例如默认开始时是抬笔状态,用逻辑变量Z2表示落笔/抬笔的状态,真代表落笔,伪代表抬笔。要想用一个按键切换两种不同的状态,大家应该可以想到这里需要额外设置一个变量Z,对变量Z赋初值为-1代表抬笔,当按下确认键就对变量Z乘-1,这样结果就成为了1代表落笔,我们可以通过不断按下确认键来不断对变量Z乘-1,这样变量Z就会不断的在1和-1之间切换,然后再把数字转化成逻辑,切换落笔/抬笔的程序如图3所示。


人工智能——EV3图像识别技术初探

图3


能够实现抬笔/落笔后我们开始研究如何通过按下上下左右按键画图,画图的起始位置从左上角开始,如果我们想画一条横线,那么必须要按右键,为了能够更精确的控制,我们每按一下按键画笔就会画出一个像素。本文研究大小为10×10的图(单位是像素),创建变量X、Y分别代表像素的横纵坐标,那么横坐标X的最大值为9,如果X=9说明当前画笔的横坐标在右边缘,也就是说当X<9的时候我们按一下右键就会对X加一,如果X=9时按下右键X不会有任何变化,程序如图4所示。同理当X=0说明画笔在左边缘,当X>0的时候我们按一下左键就会对X减一,如果X=0时按下左键X不会有任何变化,程序如图5所示。上下按键的程序和左右非常类似,只要把X改成Y即可,具体程序请读者自行摸索。

人工智能——EV3图像识别技术初探

图4

人工智能——EV3图像识别技术初探

图5


显示模块的颜色,伪代表黑色,真代表白色,和我们前面提到的相反,所以我们对逻辑变量Z2进行非运算,这样真就代表黑色(画笔),伪就代表白色(空白)。为了更清楚的看出图案的大小,我们把像素放大十倍,这样对应的横纵坐标也需要放大十倍,显示当前画图效果的程序如图6所示。图中函数2Dwrite中的三个参数列数y、行数x和元素逻辑对应的分别是横坐标X、纵坐标Y和判断抬笔/落笔的逻辑Z2。如果我们希望看到当前图占用了多少个像素,我们就在屏幕右侧显示数组长度,画图结束后按触碰传感器确认退出画图部分程序,程序如图7所示。

人工智能——EV3图像识别技术初探

图6

人工智能——EV3图像识别技术初探

图7


通过观察我们可以发现,二维数组不需要按顺序输入每个元素,例如当前元素[0][9]为真,按下键可以直接跳到[1][9]为真,那么从[1][0]到[1][8]的每个元素都默认为假,也就是说跳过的每个元素都默认为假。


2、分析


如何希望机器能够自动判断图形名称和大小呢?由视频得知,开始的时候我们就知道了只能画长方形和正方形,也就是说只要能比较出二者的区别就可以进行判断,长方形和正方形唯一的区别就是边长,长方形邻边的长度是不同的,而正方形邻边长度相同。这样一来我们就可以先找到图形的一个端点,然后去比较经过该点的两条线段长度就能得知图形的名称了。


找端点的方法比较简单,就是逐行扫描每一个像素是否为真,如果为真就判断这个像素为我们需要找的端点。扫描某一行的时候我们需要满足两个条件中的某一项,这两个条件分别是“这一行是否扫描结束”、“有没有发现逻辑为真的像素”,因此我们需要对这两个条件进行或运算。如果这一行扫描结束后没有找到逻辑为真的像素,那么就换一行从头开始继续扫描,直到找到端点才跳出循环,跳出后得到的X、Y的值就是我们要找的端点,程序如图8所示(逻辑数据线排版出现问题,属于软件自身的bug)。

人工智能——EV3图像识别技术初探

图8


找到端点后,我们设变量b1,b2分别为图形横向边和纵向边的长度。如何得到这个长度呢?我们以横向边为例,从端点坐标(X,Y)开始向右扫描,纵坐标不变横坐标逐渐加1,当发现当前像素逻辑为假的时候,就说明当前像素已经在横向边右端点的下一个位置了,例如端点坐标为(0,0),当前像素坐标(逻辑为假)为(0,9),那么横向边长度就是9,此外有一种特殊情况,那就是当横向边长为10,纵向边长不小于2,这个时候扫描会出现换行导致横向边长读取错误,为了防止出现这种情况我们要给这个循环增加一个跳出的条件,就是如果这一行的元素全部读取完毕就结束扫描,程序如图9所示。求纵向边的长度和图9的程序类似,只要把b1改成b2,把对X累加改成对Y累加即可。可是运行程序后发现程序报错,这是怎么回事呢?


人工智能——EV3图像识别技术初探

图9


如图10所示(共存入34个元素),黄色像素代表逻辑为真,白色像素代表逻辑为假,红色像素代表没有录入到数组的像素。扫描纵向边的时候,我们要从端点(0,0)开始扫描,当扫描到(0,3)下方的像素时,由于该像素信息没有存入二维数组,因此程序就会报错。为了解决这个问题,我们需要在分析图形前就在二维数组写入元素[10][9](对应坐标(9,10)),这样二维数组的元素就达到了110个(图11),绝对不会出现程序报错的情况。

人工智能——EV3图像识别技术初探

图10

人工智能——EV3图像识别技术初探

图11


3、识别


得到横向边b1和纵向边b2后,我们开始最后一个步骤:识别。识别的结果大致分为三种,如果b1=b2就是正方向,输出b1的长度即可;如果b1>b2说明是长方形,b1和b2分别作为长方形的长和宽被输出;如果b1<b2也说明是长方形,b2和b1分别作为长方形和长和宽被输出。输出分为两个部分,一个是显示一个是语音。显示部分比较简单,主要就是把拼音(为了小学生容易看懂)和变量用文本模块合起来数据转化成文本格式显示在屏幕上,程序如图12所示。

人工智能——EV3图像识别技术初探

图12


我们重点来讲一下输出声音是如何实现的,最早我使用的方法是利用切换模块的多分支结构,可是这样的程序特别繁琐,易出错。本期的最后给大家介绍一下机器报数的简单操作方法,1~99都是由“一、二、三、四、五、六、七、八、九、十”十个数字的声音组成的,也就是说我们只要连续录制这十个声音,并且把它们截成十段声音文件就可以了。下面我们以正方形为例讲解如何让机器通过语音识别出屏幕上的图形。


第一步点工具打开声音编辑器。

人工智能——EV3图像识别技术初探

图13


第二步点红色按钮后,在八秒之内清晰的说出十个数字。

人工智能——EV3图像识别技术初探

图14


第三步依次用鼠标截取每一段音频,分别命名为“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”,命名结束后点击确定。

人工智能——EV3图像识别技术初探

图15


第四步,拖出两个声音模块,先录制一个正方形的语音命名为zfx,点击第一个声音模块的文件名称选择zfx,然后点击第二个声音模块的文件名称选择已连线,将变量b1和文件名称进行连线就可以了,程序如图16所示。

图16



作者简介:赵旭东

              国家级优秀机器人指导教师 

              中国青少年科技辅导员协会会员

              从事8年科技教育工作的科技辅导员

              全国百佳科技辅导员,获国家领导人表彰

              辅导数十名学生在国内外权威机器人赛事中获奖             

              内蒙古日报、东南快报等媒体先后报道其先进事迹

              获教育部、科技部、团中央、国家知识产权局等部委表彰 



长按二维码关注更多机器人教育技术信息