|
编辑 KID
我们都知道,人类有学习的能力。由于人类不断的追求学习和进步,我们今天才处于一个美好的文明社会。百科上是这么定义学习的:学习是通过阅读、观察、实践等手段获得知识或技能的过程,是使得个体得到持续性变化的行为方式。
在工业革命过后,关于机器学习的话题不停被人们提及和研究。
不难想象,具备有学习能力的机器人,由于经验可以被无穷无尽的芯片储存,机器人做出的判断将越来越精准,犯错的几率也将趋于零。正因为这些优势,机器学习被应用在了高级的、复杂条件下的视觉识别、决策判定等领域。
最近,某著名手机品牌又火了一把,它可以通过摄像头,识别人脸并完成解锁手机等功能。有趣的是,不管主人造型怎么变化,它都能认出主人的脸。
人脸视觉识别
实际上,该手机搭载有神经网络芯片,通过机器学习,它能不断的记住主人在每个造型下的微小区别(积累经验)并进行横向对比,最终它将基本不会认错人。
◆◆◆
同样的,在 RoboMaster2017 的赛场上,有着一个九宫格大能量机关。这是当前版本的赛场中,唯一需要用到机器学习式视觉识别的人工智能机关。
击打大能量机关
激活机关的过程有些复杂。机器人先要识别上方的 LED 数字灯,按照先后顺序,依次识别并击打下方每 1.5 秒就变换一次位置的手写体数字,连续 5 次击打成功即可激活机关。
大能量机关
我们来看下这个机关的难点:上方数码管为有序、随机变化的固定形态数字,下方九宫格为每 1.5 秒随机变化位置和字体的手写体数字,1.5 秒内只要错了一个就要重头开始。手写体数字举例如下:
各种形态的数字 1
面对各种字体的数字一,若按照上一期的传统视觉方法来识别,机器人需要将这五种情况“背下来”。但是,万一比赛出现了第 6 种数字一,机器人就会彻底蒙圈了:“这是啥?没见过,不认识。”
传统视觉识别拓展阅读:《无论你走到天涯海角,我都能找到你》
通过上面两个例子,我们可以知道,RoboMaster 赛场中的大能量机关属于更高级的、复杂条件下的视觉识别难题,需要用机器学习来解决。
什么是机器学习?
机器人具备机器学习的能力,实际上是在说它的计算机程序具备机器学习的能力。
一个计算机程序不断地实战,过程中不断累积经验,自己提高解决问题的能力,则认为该程序具有机器学习能力。简单说,就是丢给机器一大堆样本范例,让它自己学习理解,再举一反三,解决范例以外的问题。
传统方法可能认出中间是萝卜君
但绝对不知道右边也是萝卜君
在上图中,若想要识别萝卜君,传统方法需要手动输入萝卜君的所有特征:比方说它是桔黄色的、有大板牙、头上带点绿...当萝卜君被切成丝,榨成汁,机器人就认不出了。
如果是经过机器学习训练的机器人呢?只要训练得当,哪怕萝卜君变异成白萝卜,变成炒萝卜丝,都逃不过它的法眼,一眼看穿!
搭建系统所用的架构
要想让机器人能通过程序学习,首先需要搭建机器学习系统的架构。
前人栽树,后人乘凉。对于初学者来说,大部分常见的架构都是搭建好的,有些甚至只需要在软件中敲入几行代码就能完成一个机器学习系统的搭建。
由谷歌开发的 TensorFlow,在机器学习研究领域中较为主流,其代码质量高、成熟度高。
Tensorflow
接下来,小R就以识别 RoboMaster 比赛中的大能量机关为实例,利用 TensorFlow 架构来搭建一个机器学习系统,让机器人拥有辨识不同手写数字的能力!
机器学习实战
机器学习的视觉识别处理
机器学习分类
机器学习经常被分为以下几类:监督学习,无监督学习,增强学习,半监督学习。准确率在 90% 以上的任务,基本上都属于监督学习。
监督学习,就像让机器人完成一本已经有明确答案的练习册,通过这种练习和比对答案,最后在测试中取得优异成绩。简单来讲,机器人用下图左边 5 个奇形怪状的 1 来训练,我们告诉它这些结果都是右边的 1。
有答案的练习
无监督学习,就像让机器人一本没有答案的练习册来学习。丢给它一堆图片,又不告诉它这些图片都是什么,恩让它用心去感受。将来给它一张图片,它只能告诉我们这张图片和谁比较像。
没答案的练习
在大能量机关识别中,当然要用准确率较高的监督学习啦。想让机器人成绩好,训练量要足够。我们要拥有一套训练数据,也就是各种各样的手写字符图片。
这里没有介绍增强学习和半监督学习。增强学习需要和环境进行交互,文中未有相应案例;相比半监督学习,监督学习更适合初学者研究。有兴趣的同学可进一步阅读:《机器学习》周志华著,清华大学出版社。
机器的练习册
我们先看下哪些地方可以找到训练用的练习册。在官网和论坛上,RoboMaster 组委会大方地提供了大能量机关显示程序里 90% 的手写数字。
整理整齐的训练数据
这些都是宝,其中不乏很难认出来的幼儿园小朋友手写体。
是的你没看错都是 9
我们从上一期的视觉基础篇知道,图片是以很多的像素点组成,每个像素点的值介于 0~255。因此,一切的图片在机器人眼里就是一个个矩阵。
一个个矩阵
把数字 1 放大就能看到像素点,这里显示的是标准化后的灰度值。
先将所有的数据格式统一,比如都转换为28*28的图片(为了之后处理更方便),然后再对所有数据做标签,训练数据集就完成啦,这就是机器的练习册。
井然有序
现在有和手写数字输入相关的训练数据集——MNIST 数据集。有兴趣的同学请至 http://yann.lecun.com/exdb/mnist/ 浏览。
有了数据(练习册)之后,我们需要用前面说到的机器学习的系统架构来进行处理。
机器学习的系统架构,有个听上去更高端的叫法——神经网络。
神经网络
简单来说,神经网络模仿的即是人类的中枢神经系统,由大量的神经元构成,神经元在程序中体现为参数可改变的函数。线性神经元大概长这样:
线性的神经元模型
x 是输入神经元的内容,y 是神经元输出的内容,相当于人脑中神经元突触传递信号。W 和 b 都是可以改变的神经元参数。其中,W 是权重(weight),它可以代表两个神经元之间联系的相关性。
利用 TensorFlow 架构,这个线性的神经元就由下面这几行代码就可以完成搭建啦:
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b
线性模型在二维空间中,就是一条死板的直线,没有想象力是干不成大事的。因此,在线性模型之后要加入一个非线性的激活函数,来激活这个神经元的想象力,让它的思维“拐个弯”。
非线性的神经元模型
我们采用 softmax 归一化指数函数作为激活函数,那 y 的代码就变成:
y = tf.nn.softmax(tf.matmul(x, W) + b)
实际的神经网络中,上述变量和参数通常都是矩阵形式。矩阵形式的神经元大概像这样:
神经元模型的矩阵形式
要跟其他一堆神经元组成神经网络,它不能只有一个输入输出,就像你大脑里的神经元也不只有一个突触。多个输入的神经元长这样:
多个输入的神经元
把这些神经元首尾相连就得到一个神经网络。每一个神经元都可以对特定的输入产生响应,从而得到一个最终的响应。
是不是好简单:)
上图是简单的一个神经网络。圆圈表示神经元,箭头连线表示的“权重”。每一列的神经元称作一个层,红色的是输入层,蓝色的是隐藏层,绿色的是输出层。输入层输入的是图像,输出层输出的就是识别结果啦!
隐藏层越多的机器人,想象力越丰富,只要你用更多的训练去填它的脑洞,它就能做更复杂的工作。如果训练不够,它就会想歪。这种深深的脑洞,就是深度学习神经网络。
深度学习神经网络模型
增强机器人判断力
大脑搭好后,需要用到“损失函数”帮助它完成训练,这是一种可以衡量机器人训练得到的输出值和实际给出的输出值到底有多大的差距的东西。简单来说,就是给机器人的行为打分,让它知道自己几斤几两。
一种最简单的损失函数就是平方损失函数。由于练习册给出的参考答案(标记)或者机器的回答(输出)都是用矩阵表示,我们可以把它们理解为 N 维空间中的一个点,那么机器的回答和参考答案之间的距离(损失),就是它这道题的扣掉的分数。
L(Y,f(X)) = (Y-f(X))^2
损失 = ( 参考答案 – 机器答案 )2
在实际使用中,常用交叉熵损失函数代替平方损失函数。TensorFlow 已经贴心地帮我们把这个损失函数和上文提到的激活函数合并为一行代码:
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
在这个神经网络模型中,神经网络的训练可以简单地描述为如何最小化损失。机器训练的过程,其实就是通过改变神经元参数来减少损失。简单来说,就是机器人通过改变自己的脑回路(参数值)来减少被扣掉的分数。
如果把参数看作是函数的自变量,损失看作因变量,那么,这个过程相当于找到这个函数的最低点。最简单的方法是梯度下降法。
梯度下降法
梯度下降法就像一个人在黑夜里要下山,由于不知道整座山长什么样子(机器也不知道整个函数的图像),所以只能一直找着最陡的下坡路(数学上就是梯度的负方向),那他总能找到一个地势比较低的点(局部最优解)。
梯度下降法在 TensorFlow 里也是一行代码:
train_step= tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
接下来要读取数据库当中的训练数据:
batch_xs,batch_ys = mnist.train.next_batch(100)
然后依照上面这个训练方法进行训练,读取和训练的代码,变身!
sess.run(train_step,feed_dict={x: batch_xs, y_: batch_ys})
通过最后两行代码,就能完整地将之前定义的权重和其他参数训练出来,得到一个训练好的、新参数的神经网络。
击打大能量机关
最后,做练习册的题(原有的数据)做得很棒的机器,也不一定能够适应新题型(调整新参数不一定就能判断准确)。要看机器人真正的能力,还要再出考题对它进行测试。
测验最终成果
测试用的考题和练习册当然不一样,我们需要准备另一套测试样本。
这里先用摄像头读取实战中的手写图像,经过数据格式统一和贴标签,再将它输入到神经网络里,就能测试出机器学习的结果啦!
其他条件下的机器学习视觉识别也是同理的。
代码跑起来
聪明的机器会懂得举一反三,这种“举一反三”的能力称为泛化能力。在这里也就是说,机器人能够自己组合不同数字样本的特征,去识别全新的、没有见过的数字。
至此,机器学习视觉识别的整个流程已经完成,训练好的机器终于可以跟操作手一起奔赴 RoboMaster 战场!成功识别出 3 倍攻击力加成的大能量机关,深藏功与名。
◆◆◆
完成大能量机关的视觉识别,在 RoboMaster 比赛中只是激活该机关的第一个步骤。当识别出数字后,机器人身上搭载的发射机构(类似枪口)可不会自己转动到我们想要的角度去击打目标。iPhone的人脸识别也是这种原理,只是再具体的操作和最终的结果上略有出入。
本文来自 RoboMaster 技术智囊团许悦聪,新加坡南洋理工大学在读博士工程师,校RoboMaster 机器人代表队技术顾问,无人机爱好者,主攻视频和语意相关的机器学习方向。文章部分有修改。
|
欢迎继续阅读楼主其他信息
|