普通高中人工智能教学策略初探
穆明
摘? 要 基于计算机视觉经典案例人脸识别,深入浅出进行“人工智能初步”模块的教学设计,从而降低机器学习的入门难度,引领高中学生步入AI应用开发的殿堂。
关键词 机器学习;深度学习;局部二值模式直方图;卷积神经网络;人工智能初步;人脸识别
中图分类号:G632? ? 文献标识码:B
文章编号:1671-489X(2020)03-0077-02
1 前言
《普通高中信息技术课程标准》(2017年版)“人工智能初步”模块(选择性必修模块4)将机器学习和深度学习作为人工智能教学的热词,对普通高中人工智能教学提出较高的要求。基于深度学习是机器学习的一个分支且机器学习是深度学习的基础的基本理念,本着先入门机器学习,再延伸到深度学习的教学策略,遴选有代表性的基础典型案例,通过项目实现突破机器学习和深度学习的瓶颈,不失为一种行之有效的教学模式。
目前,随着计算机视觉的飞速发展,人脸识别的应用已渗透到生活中的方方面面,给人们的生活带来极大的便利。关于人脸识别,目前有很多经典的算法。本文选择人脸识别为项目案例,以当前流行的人脸识别Face Recogni-tion函数包为教学导入,随后进行局部二值模式直方图、卷积神经网络(CNN)两种类型人脸识别的模型算法的教学,达成由机器学习深入到深度学习的教学目标,循序渐进地开展高中人工智能教学,以培养高中生学习人工智能的兴趣和提高课堂教学质量。
2 由现成算法导入教学
应用公开的AI软件接口(即现成算法)是一条高中学生进入人工智能殿堂的捷径。目前市面上主流的AI技术提供公司有很多,比如百度、阿里、腾讯、科大讯飞等,这些公司将底层技术封装,提供应用接口给用户。其中Face Recognition软件包是当前世界上最简单的人脸识别库,通过Python引用或者命令行的形式使用它进行人脸识别,使用dlib中最先进的人脸识别深度学习算法,使得识别准确率在Labeled Faces in the wild测试基准下达到99.38%。导入人脸识别包代码:
import face_recognition
3 由经典算法比对教学
因深度学习的建模步骤与机器学习类似,二者均是基于算法的建模评估,主要是掌握对封装的API算法接口函数的调用,通过通俗易懂的案例入门掌握机器学习和深度学习的基本建模框架。经教学实践优化,选择机器学习算法局部二值模式直方图(LBPH)和深度学习模型卷积神经网络(CNN)对人脸识别进行较系统的人工智能教学设计。
局部二值模式直方图LBPH(机器学习算法)? 鉴于机器学习算法较多,Python用局部二值模式直方图创建人脸识别器系统的前置条件是需要建立人脸数据集训练数据库,构建一个能将每个人从其他人中区分出来的系统模型;不足之处在于看到从未见过的图像,系统会将其分派到已有的类标签中。采用局部二值模式直方图(LBPH)创建人脸识别系统,在图像数据集中,可以分辨出不同的人。构建一个能将每个人从其他人中区分出来的系统(算法实现代码略),其中局部二值模式直方图导入函数为:
cv2.CascadeClassifier()
卷积神经网络CNN(深度学习模型)? Keras是一款使用纯Python编写的神经网络API,使用Keras能够快速实现深度学习方案。Keras以Tensorflow、Theano、CNTK为后端,Keras的底层计算都是以这些框架为基础的,这使得Keras能够专注于快速搭建起神经网络模型。利用Keras搭建神經网络模型非常快速和高效,其中经典算法之一是使用卷积神经网络(CNN)做人脸识别。
卷积神经网络(CNN)的前级包含了卷积和池化操作,可以实现图片的特征提取和降维。由于计算机算力的提升,CNN的应用愈加广泛普及。通常人脸识别实现的基本思想为:先用通用的人脸检测方法检测出人脸位置;然后根据返回的坐标、尺寸把脸用数组切片的方法截取下来;接着把截取的小图片送进训练好的卷积神经网络模型,得出人脸的分类结果;最后在原图上打上识别标记。实现这一设计思想的前提是要有一个训练好的可以做人脸识别的模型(本文所使用的后端运算引擎为TensorFlow),建模框架按以下顺序搭建。
1)人脸收集。目的是希望在很多人中可以识别出想要识别的脸,需要去采集一些其他人的图片,很多专业机构采集并公布了一些人脸数据集,专门用于图像识别算法的研究和验证。如耶鲁大学的Yale人脸库,里面包含15个人,每人11张照片,主要包括光照条件的变化、表情的变化;接下来把想要识别的几张照片混进去,进行训练。由于Yale人脸库里面所有照片都是100*100的尺寸,因此将要构建的卷积神经网络的输入就是100*100。而新生成的图片样本形状都是不规则的,为了使它可以顺利进入卷积层,第一步就要对图片做尺寸变换。当然不能暴力地resize成100*100,否则会引起图片的变形,所以采用一种数字图像处理中常用的手段,就是将较短的一侧涂黑,使它变成和目标图像相同的比例,然后再resize。这样既可以保留原图的人脸信息,又可以防止图像形变。
2)训练模型。卷积神经网络训练的好坏会直接影响识别的准确度。引进卷积和池化层,卷积类似于图像处理中的特征提取操作;池化则类似于降维,常用的有最大池化和平均池化。下面介绍具体建模步骤。
第一步:引入全连接层、Dropout、Flatten。全连接层就是经典的神经网络全连接。Dropout用来在训练时按一定概率随机丢弃一些神经元,以获得更高的训练速度以及防止过拟合。Flatten用于卷积层与全连接层之间,把卷积输出的多维数据拍扁成一维数据送进全连接层(类似shape方法)。
第二步:引入SGD(梯度下降优化器)使损失函数最小化,常用的优化器还有Adam。
第三步:读入所有图像及标签。神经网络需要数值进行计算,需要对字符型类别标签进行编码,最容易想到的就是把他们编码成1、2、3……这种,但是这样也就出现强行给它们定义了大小的问题,因为如果一个类别是2,一个是4,它们之间就会有两倍的关系,但是实际上它们之间并没有直接的倍数关系。所以使用one-hot编码规则,做到所有标签的平等化。
第四步:在所有读入的图像和标签中,需要划分一部分用来训练,一部分用来测试。使用Sklearn中的train_test_split方法,不仅可以分割数据,还可以把数据打乱。训练集:测试集=7:3。
第五步:构建卷积神经网络的每一层。添加卷积层,32个卷积核,每个卷积核是3*3,边缘不补充,卷积步长向右、向下都为1;后端运算使用tf,图片输入尺寸是(100,100,3);使用relu作为激活函数,也可以用sigmoid函数等,relu收敛速度比较快。
第六步:使用SGD作为反向传播的优化器,使损失函数最小化,学习率(learning_rate)是0.01,学习率衰减因子(decay)用来随着迭代次数不断减小学习率,防止出现震荡。引入冲量(momentum),不仅可以在学习率较小的时候加速学习,而且可以在学习率较大的时候减速,使用nesterov。
第七步:编译模型,损失函数使用交叉熵,交叉熵函数随着输出和期望的差距越来越大,输出曲线会越来越陡峭,对权值的惩罚力度也会增大。交叉熵函数与其他的损失函数,如均方差损失函数相比,各有优劣。
第八步:开始训练,训练100次(epochs),每次训练分几个批次,每批(batch_size)20个,shuffle用来打乱样本顺序。
第九步:训练完成后在测试集上评估结果并保存模型,供以后加载使用。
3)图像识别:加载级联分类器模型—加載卷积神经网络模型—打开摄像头,获取图片并灰度化—人脸检测(根据检测到的坐标及尺寸裁剪,无形变resize并送入模型运算,得到结果后在人脸上打上矩形框,并在矩形框上方写上识别结果)。
其中卷积神经网络主要函数包导入代码如下:
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import? Dense, Dropout, Flatten
from keras.optimizers import SGD
4 结语
人工智能初步模块的教学涉及高等数学知识较多,鉴于高中学生对高等数学相关分支科目的学习尚处于零基础,本文降低了对高等数学知识的要求,只需要掌握矩阵、Numpy模块包等基本知识,在导入应用现成算法进行感知的基础上,便可以先入门以Sklearn框架为主的机器学习,再进入开源框架Keras的深度学习;引导数学基础较好的高中学生由简到繁循序渐进地进行人工智能系统的学习,为深入学习人工智能打下坚实的基础。