穆明
摘? 要 基于計算機視覺經典案例人臉識別,深入淺出進行“人工智能初步”模塊的教學設計,從而降低機器學習的入門難度,引領高中學生步入AI應用開發(fā)的殿堂。
關鍵詞 機器學習;深度學習;局部二值模式直方圖;卷積神經網(wǎng)絡;人工智能初步;人臉識別
中圖分類號:G632? ? 文獻標識碼:B
文章編號:1671-489X(2020)03-0077-02
1 前言
《普通高中信息技術課程標準》(2017年版)“人工智能初步”模塊(選擇性必修模塊4)將機器學習和深度學習作為人工智能教學的熱詞,對普通高中人工智能教學提出較高的要求。基于深度學習是機器學習的一個分支且機器學習是深度學習的基礎的基本理念,本著先入門機器學習,再延伸到深度學習的教學策略,遴選有代表性的基礎典型案例,通過項目實現(xiàn)突破機器學習和深度學習的瓶頸,不失為一種行之有效的教學模式。
目前,隨著計算機視覺的飛速發(fā)展,人臉識別的應用已滲透到生活中的方方面面,給人們的生活帶來極大的便利。關于人臉識別,目前有很多經典的算法。本文選擇人臉識別為項目案例,以當前流行的人臉識別Face Recogni-tion函數(shù)包為教學導入,隨后進行局部二值模式直方圖、卷積神經網(wǎng)絡(CNN)兩種類型人臉識別的模型算法的教學,達成由機器學習深入到深度學習的教學目標,循序漸進地開展高中人工智能教學,以培養(yǎng)高中生學習人工智能的興趣和提高課堂教學質量。
2 由現(xiàn)成算法導入教學
應用公開的AI軟件接口(即現(xiàn)成算法)是一條高中學生進入人工智能殿堂的捷徑。目前市面上主流的AI技術提供公司有很多,比如百度、阿里、騰訊、科大訊飛等,這些公司將底層技術封裝,提供應用接口給用戶。其中Face Recognition軟件包是當前世界上最簡單的人臉識別庫,通過Python引用或者命令行的形式使用它進行人臉識別,使用dlib中最先進的人臉識別深度學習算法,使得識別準確率在Labeled Faces in the wild測試基準下達到99.38%。導入人臉識別包代碼:
import face_recognition
3 由經典算法比對教學
因深度學習的建模步驟與機器學習類似,二者均是基于算法的建模評估,主要是掌握對封裝的API算法接口函數(shù)的調用,通過通俗易懂的案例入門掌握機器學習和深度學習的基本建模框架。經教學實踐優(yōu)化,選擇機器學習算法局部二值模式直方圖(LBPH)和深度學習模型卷積神經網(wǎng)絡(CNN)對人臉識別進行較系統(tǒng)的人工智能教學設計。
局部二值模式直方圖LBPH(機器學習算法)? 鑒于機器學習算法較多,Python用局部二值模式直方圖創(chuàng)建人臉識別器系統(tǒng)的前置條件是需要建立人臉數(shù)據(jù)集訓練數(shù)據(jù)庫,構建一個能將每個人從其他人中區(qū)分出來的系統(tǒng)模型;不足之處在于看到從未見過的圖像,系統(tǒng)會將其分派到已有的類標簽中。采用局部二值模式直方圖(LBPH)創(chuàng)建人臉識別系統(tǒng),在圖像數(shù)據(jù)集中,可以分辨出不同的人。構建一個能將每個人從其他人中區(qū)分出來的系統(tǒng)(算法實現(xiàn)代碼略),其中局部二值模式直方圖導入函數(shù)為:
cv2.CascadeClassifier()
卷積神經網(wǎng)絡CNN(深度學習模型)? Keras是一款使用純Python編寫的神經網(wǎng)絡API,使用Keras能夠快速實現(xiàn)深度學習方案。Keras以Tensorflow、Theano、CNTK為后端,Keras的底層計算都是以這些框架為基礎的,這使得Keras能夠專注于快速搭建起神經網(wǎng)絡模型。利用Keras搭建神經網(wǎng)絡模型非??焖俸透咝?,其中經典算法之一是使用卷積神經網(wǎng)絡(CNN)做人臉識別。
卷積神經網(wǎng)絡(CNN)的前級包含了卷積和池化操作,可以實現(xiàn)圖片的特征提取和降維。由于計算機算力的提升,CNN的應用愈加廣泛普及。通常人臉識別實現(xiàn)的基本思想為:先用通用的人臉檢測方法檢測出人臉位置;然后根據(jù)返回的坐標、尺寸把臉用數(shù)組切片的方法截取下來;接著把截取的小圖片送進訓練好的卷積神經網(wǎng)絡模型,得出人臉的分類結果;最后在原圖上打上識別標記。實現(xiàn)這一設計思想的前提是要有一個訓練好的可以做人臉識別的模型(本文所使用的后端運算引擎為TensorFlow),建??蚣馨匆韵马樞虼罱ā?/p>
1)人臉收集。目的是希望在很多人中可以識別出想要識別的臉,需要去采集一些其他人的圖片,很多專業(yè)機構采集并公布了一些人臉數(shù)據(jù)集,專門用于圖像識別算法的研究和驗證。如耶魯大學的Yale人臉庫,里面包含15個人,每人11張照片,主要包括光照條件的變化、表情的變化;接下來把想要識別的幾張照片混進去,進行訓練。由于Yale人臉庫里面所有照片都是100*100的尺寸,因此將要構建的卷積神經網(wǎng)絡的輸入就是100*100。而新生成的圖片樣本形狀都是不規(guī)則的,為了使它可以順利進入卷積層,第一步就要對圖片做尺寸變換。當然不能暴力地resize成100*100,否則會引起圖片的變形,所以采用一種數(shù)字圖像處理中常用的手段,就是將較短的一側涂黑,使它變成和目標圖像相同的比例,然后再resize。這樣既可以保留原圖的人臉信息,又可以防止圖像形變。
2)訓練模型。卷積神經網(wǎng)絡訓練的好壞會直接影響識別的準確度。引進卷積和池化層,卷積類似于圖像處理中的特征提取操作;池化則類似于降維,常用的有最大池化和平均池化。下面介紹具體建模步驟。
第一步:引入全連接層、Dropout、Flatten。全連接層就是經典的神經網(wǎng)絡全連接。Dropout用來在訓練時按一定概率隨機丟棄一些神經元,以獲得更高的訓練速度以及防止過擬合。Flatten用于卷積層與全連接層之間,把卷積輸出的多維數(shù)據(jù)拍扁成一維數(shù)據(jù)送進全連接層(類似shape方法)。
第二步:引入SGD(梯度下降優(yōu)化器)使損失函數(shù)最小化,常用的優(yōu)化器還有Adam。
第三步:讀入所有圖像及標簽。神經網(wǎng)絡需要數(shù)值進行計算,需要對字符型類別標簽進行編碼,最容易想到的就是把他們編碼成1、2、3……這種,但是這樣也就出現(xiàn)強行給它們定義了大小的問題,因為如果一個類別是2,一個是4,它們之間就會有兩倍的關系,但是實際上它們之間并沒有直接的倍數(shù)關系。所以使用one-hot編碼規(guī)則,做到所有標簽的平等化。
第四步:在所有讀入的圖像和標簽中,需要劃分一部分用來訓練,一部分用來測試。使用Sklearn中的train_test_split方法,不僅可以分割數(shù)據(jù),還可以把數(shù)據(jù)打亂。訓練集:測試集=7:3。
第五步:構建卷積神經網(wǎng)絡的每一層。添加卷積層,32個卷積核,每個卷積核是3*3,邊緣不補充,卷積步長向右、向下都為1;后端運算使用tf,圖片輸入尺寸是(100,100,3);使用relu作為激活函數(shù),也可以用sigmoid函數(shù)等,relu收斂速度比較快。
第六步:使用SGD作為反向傳播的優(yōu)化器,使損失函數(shù)最小化,學習率(learning_rate)是0.01,學習率衰減因子(decay)用來隨著迭代次數(shù)不斷減小學習率,防止出現(xiàn)震蕩。引入沖量(momentum),不僅可以在學習率較小的時候加速學習,而且可以在學習率較大的時候減速,使用nesterov。
第七步:編譯模型,損失函數(shù)使用交叉熵,交叉熵函數(shù)隨著輸出和期望的差距越來越大,輸出曲線會越來越陡峭,對權值的懲罰力度也會增大。交叉熵函數(shù)與其他的損失函數(shù),如均方差損失函數(shù)相比,各有優(yōu)劣。
第八步:開始訓練,訓練100次(epochs),每次訓練分幾個批次,每批(batch_size)20個,shuffle用來打亂樣本順序。
第九步:訓練完成后在測試集上評估結果并保存模型,供以后加載使用。
3)圖像識別:加載級聯(lián)分類器模型—加載卷積神經網(wǎng)絡模型—打開攝像頭,獲取圖片并灰度化—人臉檢測(根據(jù)檢測到的坐標及尺寸裁剪,無形變resize并送入模型運算,得到結果后在人臉上打上矩形框,并在矩形框上方寫上識別結果)。
其中卷積神經網(wǎng)絡主要函數(shù)包導入代碼如下:
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import? Dense, Dropout, Flatten
from keras.optimizers import SGD
4 結語
人工智能初步模塊的教學涉及高等數(shù)學知識較多,鑒于高中學生對高等數(shù)學相關分支科目的學習尚處于零基礎,本文降低了對高等數(shù)學知識的要求,只需要掌握矩陣、Numpy模塊包等基本知識,在導入應用現(xiàn)成算法進行感知的基礎上,便可以先入門以Sklearn框架為主的機器學習,再進入開源框架Keras的深度學習;引導數(shù)學基礎較好的高中學生由簡到繁循序漸進地進行人工智能系統(tǒng)的學習,為深入學習人工智能打下堅實的基礎。