劉梅
摘要:本項(xiàng)目以野生保護(hù)動(dòng)物圖像分類為主題,共包括數(shù)據(jù)采集及處理、模型訓(xùn)練、模型封裝、模型部署四個(gè)階段,利用6個(gè)課時(shí)帶領(lǐng)學(xué)生體驗(yàn)完整的人工智能作品開發(fā)流程,以期為高中階段人工智能教學(xué)提供參考。
關(guān)鍵詞:模型訓(xùn)練;Arduino;MobileNet;百度飛槳;圖像識別
中圖分類號:G434? 文獻(xiàn)標(biāo)識碼:A? 論文編號:1674-2117(2023)09-0079-04
目前,在計(jì)算機(jī)視覺領(lǐng)域有多種圖像分類模型,如ResNet、MobileNet、LeNet等,這些模型在不同的圖像識別場景下發(fā)揮不同的作用。那么,不同網(wǎng)絡(luò)模型在結(jié)構(gòu)上有什么差異?哪些模型識別速度更快準(zhǔn)確率更高?哪些模型更輕量更適合部署在移動(dòng)端?為了弄清這些問題,筆者在實(shí)際教學(xué)過程中進(jìn)行了一系列探索并發(fā)現(xiàn),如果只是講解理論,對于初次接觸深度學(xué)習(xí)的高中生來說是枯燥且晦澀的。因此,筆者開發(fā)了可以實(shí)踐的趣味項(xiàng)目,讓學(xué)生自己動(dòng)手,親歷完整的問題解決過程,在實(shí)踐中理解人工智能模型算法原理。在項(xiàng)目實(shí)踐中,筆者也遇到并解決了一些新的問題,如如何實(shí)現(xiàn)本地局域網(wǎng)環(huán)境下的模型API調(diào)用,以解決機(jī)房網(wǎng)絡(luò)不佳、學(xué)生注冊調(diào)用網(wǎng)絡(luò)平臺API費(fèi)時(shí)費(fèi)力等問題?有什么硬件是價(jià)格低廉、配置簡單且適合機(jī)房環(huán)境下大班教學(xué)的?下面,筆者以完整的“動(dòng)物識別分類”項(xiàng)目為例對上述問題進(jìn)行闡述,以期為高中階段人工智能教學(xué)提供參考。
項(xiàng)目介紹
1.項(xiàng)目背景
本項(xiàng)目主題:打造AI野生保護(hù)動(dòng)物識別系統(tǒng)。近幾年,販賣野生保護(hù)動(dòng)物的情況屢見不鮮,許多人在不知情的情況下出于好奇而購買,從而觸犯了法律,究其根本原因還是缺乏對野生保護(hù)動(dòng)物的認(rèn)識。我們可以借助人工智能的圖像識別技術(shù)來解決這一問題。
2.項(xiàng)目時(shí)長
該項(xiàng)目分四部分,共6課時(shí),分別為:數(shù)據(jù)采集及處理(2課時(shí))、 模型訓(xùn)練(1課時(shí))、模型封裝(1課時(shí))、模型部署(2課時(shí))。
3.項(xiàng)目流程
首先,學(xué)生2人一組,從網(wǎng)絡(luò)上收集8到10種不常見的野生保護(hù)動(dòng)物圖片,并進(jìn)行預(yù)處理。然后,分組調(diào)用MobileNetV2、resnet50預(yù)訓(xùn)練模型,在訓(xùn)練過程中對比兩種圖像分類模型的差異。接著,利用教師提供的module.py半成品文件,將自己訓(xùn)練出的模型進(jìn)行封裝,實(shí)現(xiàn)本地調(diào)用。最后,利用Arduino板完成硬件部署。
項(xiàng)目實(shí)施
1.數(shù)據(jù)采集及處理
(1)數(shù)據(jù)采集
數(shù)據(jù)集的獲取處理是一個(gè)非常復(fù)雜的過程,既需要大量高質(zhì)量的圖片數(shù)據(jù),又要保證數(shù)據(jù)集的圖片具有足夠的多樣性,這樣才能提高訓(xùn)練模型在實(shí)際應(yīng)用中的泛化水平。由于野生保護(hù)動(dòng)物在生活中并不常見,采用手機(jī)或相機(jī)拍攝是不可行的,所以教師可以指導(dǎo)學(xué)生應(yīng)用高一學(xué)習(xí)的Python爬蟲知識爬取需要的數(shù)據(jù)集圖片,即根據(jù)關(guān)鍵詞從百度上爬取8到10種野生保護(hù)動(dòng)物圖片,每種500張左右,核心代碼如圖1所示。
將下載好的數(shù)據(jù)集圖片分類放在10個(gè)文件夾中,需要按照飛槳平臺的數(shù)據(jù)集格式規(guī)則提前制作好一個(gè)label.text文檔,在后期模型訓(xùn)練中作為數(shù)據(jù)索引。教師可以提前制作一份模型文檔給學(xué)生作為參考。格式如圖2所示。
(2)數(shù)據(jù)預(yù)處理
數(shù)據(jù)處理中重要的一步是將處理好的數(shù)據(jù)劃分訓(xùn)練驗(yàn)證集,使用sklearn.model_selection模塊,只需要如下兩行代碼就可以劃分出訓(xùn)練驗(yàn)證集:
from sklearn.model_selection import train_test_split
train_img, val_img, train_label, val_label = train_test_split(data, label, test_size=0.2)
接下來按照飛槳官網(wǎng)[1]提供的代碼進(jìn)行數(shù)據(jù)預(yù)處理。
2.模型訓(xùn)練
(1)神經(jīng)網(wǎng)絡(luò)的搭建
直接調(diào)用飛槳平臺的內(nèi)置模型,調(diào)用代碼如圖3所示。
使用paddle.summary語句查看網(wǎng)絡(luò)結(jié)構(gòu),如圖4所示。學(xué)生從中可以理解MobileNetV2與resnet50在模型結(jié)構(gòu)上的異同,比教師講解理論要直觀清晰許多。
(2)模型訓(xùn)練
可以選擇不同的訓(xùn)練方式進(jìn)行訓(xùn)練,機(jī)房CPU環(huán)境下訓(xùn)練時(shí)間較長,250個(gè)epoch,約需要一個(gè)小時(shí)左右(如下頁圖5)。
(3)模型評估
在模型訓(xùn)練好后,使用下頁圖6所示的代碼繪制變化曲線來查看兩種訓(xùn)練模型對應(yīng)的準(zhǔn)確率的區(qū)別,MobileNetV2約為65%,resnet50約為70%,差距不大,后續(xù)還需要繼續(xù)調(diào)優(yōu)以提高其識別精度。還可以用同樣的方法繪制loss曲線,幫助學(xué)生理解訓(xùn)練過程中損失函數(shù)的變化(如下頁圖7)。
(4)模型預(yù)測
加載模型啟動(dòng)模型預(yù)測,選擇圖片對訓(xùn)練出的模型進(jìn)行預(yù)測,代碼如第82頁圖8所示。指導(dǎo)學(xué)生選擇圖片進(jìn)行多次測試,以體驗(yàn)訓(xùn)練模型的識別精度。
3.模型封裝
訓(xùn)練出的模型權(quán)重文件經(jīng)過封裝,便可以實(shí)現(xiàn)本地部署。在機(jī)房局域網(wǎng)內(nèi),教師啟動(dòng)部署命令,其他學(xué)生也可以調(diào)用該hub模型進(jìn)行圖像識別。封裝的核心步驟是要編寫module.py文件,這是比較煩瑣的一步,其中包括配置模型信息、編寫推理方法、測試推理等,代碼較長,具體可參考官網(wǎng)使用指南。[2]
在這個(gè)過程中,教師的任務(wù)則是要提前為學(xué)生準(zhǔn)備好module.py的框架代碼,這樣學(xué)生只需更改與自己訓(xùn)練模型相關(guān)的少量關(guān)鍵代碼行即可,這樣可以節(jié)省課堂時(shí)間與學(xué)生的操作難度。在配置好module.py文件后,學(xué)生開始制作自己的paddlehub:新建一個(gè)文件夾mobilenet_meimei,與module.py文件中模型的名稱一致,在文件夾中加入一個(gè)__init__.py空文件,以及剛剛編輯好的module.py文件、assets文件夾。其中,assets文件夾中包含的是前期訓(xùn)練好的模型及參數(shù)文件,如下頁圖9所示。之后啟動(dòng)以下兩條命令:
hub install mobilenet_meimei
hub serving start -m mobilenet_meimei
在本地部署封裝好的模型,利用飛槳提供的測試代碼,就可以在本地對模型進(jìn)行識別調(diào)用了。
4.模型部署
模型部署階段是整個(gè)項(xiàng)目環(huán)節(jié)中趣味性、交互性最強(qiáng)的階段。在這一部分,教師帶領(lǐng)學(xué)生利用封裝好的動(dòng)物識別模型,結(jié)合Arduino制作“動(dòng)物識別大轉(zhuǎn)盤”,將自己的訓(xùn)練成果真正應(yīng)用起來。Arduino板無法實(shí)現(xiàn)邊緣部署,計(jì)算推理等工作還是要在計(jì)算機(jī)端完成,但因其配置步驟簡單、價(jià)格低廉、功能強(qiáng)大,更適合沒有硬件基礎(chǔ)的學(xué)生以及機(jī)房環(huán)境下的大班教學(xué)。
(1)所需材料
硬件:Arduino*1、舵機(jī)*2、yeelight LED燈*1、杜邦線*6、小音箱或語音播報(bào)模塊。
軟件:jupyter或idle。
(2)實(shí)現(xiàn)功能
調(diào)用封裝好的動(dòng)物識別模型,在成功識別出相應(yīng)動(dòng)物名稱后,組裝驅(qū)動(dòng)硬件部分實(shí)現(xiàn)如下功能:①利用pyttsx3模塊,實(shí)現(xiàn)語音播報(bào)識別出的保護(hù)動(dòng)物名稱。
②利用Pinpong模塊,實(shí)現(xiàn)Arduino控制舵機(jī)轉(zhuǎn)動(dòng),在轉(zhuǎn)盤中指向識別出的動(dòng)物名稱。③利用yeelight模塊,結(jié)合小彩燈,當(dāng)識別到不同動(dòng)物時(shí),彩燈會(huì)顯示與之相對應(yīng)的不同顏色,如檢測到金絲猴亮起黃燈,檢測到耳廓狐亮起綠燈。如果遷移在水果分類項(xiàng)目中,還可以使亮起的燈顯示為識別出的相應(yīng)水果的顏色,如火龍果顯示紅色、香蕉顯示黃色。
(3)實(shí)現(xiàn)方式
核心代碼如圖10所示。
結(jié)語
在本項(xiàng)目中,教師帶領(lǐng)學(xué)生體驗(yàn)了完整的圖像分類識別流程,理解了resnet50、MobileNetV2兩種圖像分類模型在結(jié)構(gòu)、訓(xùn)練速度、訓(xùn)練模型識別精度等方面的差異,實(shí)現(xiàn)了利用Arduino部署自訓(xùn)練模型,解決了機(jī)房局域網(wǎng)環(huán)境下API調(diào)用本地化等問題。
參考文獻(xiàn):
[1]飛槳官網(wǎng)[EB/OL].https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/beginner/data_preprocessing_cn.html.
[2]飛槳官網(wǎng)[EB/OL].https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Sequential_cn.html#sequential.