摘? 要? 以人工智能課程中的卷積神經網絡算法為例,設計基于人工智能開發(fā)板的應用案例進行實驗教學,在幫助學生掌握算法理論的同時,有效培養(yǎng)其工程實踐能力。
關鍵詞? 人工智能;卷積神經網絡;K210開發(fā)板;機器學習;邊緣智能
中圖分類號:G633.67? ? 文獻標識碼:B
文章編號:1671-489X(2022)17-0031-03
0? 引言
目前,人工智能課程教學已在中小學普遍實施,因課程專業(yè)理論體系涉及數學、計算機軟硬件等課程基礎,給課程的有效落地實施帶來一定難度。日常教學如單純等同于一般計算機語言教學,則會使學生感覺枯燥乏味;在教學實踐中如恰當引入開源硬件單片機實驗教學,則會使課程實施達到事半功倍的效果。機器學習系統(tǒng)的訓練通常在電源充足和計算性能強勁的遠程服務器中及云端進行,當訓練完成后,機器學習系統(tǒng)就可以依據經驗自動分析新的數據即推演。機器學習系統(tǒng)的推演過程通常在本地即在邊緣設備完成。為此,為增強機器學習課程教學實效,突出工程實踐性教學,教學中在通俗講解機器學習課程算法基礎和模型實現(xiàn)的基礎上,增設邊緣智能實驗的教學設計環(huán)節(jié),從而極大對提高學生學習的興趣和課堂教學質量。以下從經典的深度學習模型卷積神經網絡算法分析入手,基于K210開發(fā)板進行邊緣智能實驗設計。
1? 卷積神經網絡算法分析
通常數學卷積的卷積核需要翻轉,而卷積神經網絡的卷積是提取圖像特征進行加權求和,不翻轉,稱為互相關,也稱為不翻轉卷積,其卷積核是根據數據訓練學習的參數,不是給定的,無論翻轉與否,對應的都是待學習的未知參數。卷積神經網絡(CNN)與全連接神經網絡(DNN)都屬于前饋神經網絡,其正向傳播的算法原理大致相同,整個網絡可看作一個復合函數。按照現(xiàn)有經典著作講解卷積神經網絡計算損失函數關于權重參數梯度的常規(guī)算法非常煩瑣。為此,借鑒計算機進行矩陣運算轉為向量運算這一思想,將卷積核和卷積層矩陣平鋪拼接為向量形式,就得到類似全連接神經網絡的前向傳播公式,相應的反向傳播求導就可以簡化。
1.1? 卷積圖像轉為列向量(求傳播誤差)
1.1.1? 前向傳播
將待卷積圖像矩陣(按行向量優(yōu)先)轉為列向量X(活性值)、卷積核W(按行向量優(yōu)先)拼接為行向量(與待卷積圖像矩陣元素不相關的對應位置處以0為間隔拼接),以卷積子圖像數為矩陣行數轉換成新矩陣A,由矩陣相乘再加偏置向量b得到卷積后列向量Y(凈活性值),等價于卷積圖像與卷積核W做互相關運算(特稱為正向卷積,為窄卷積)。卷積神經網絡l層的前向傳播公式變?yōu)椋篩=AXl+b,Xl=f(Yl-1)。
1.1.2? 反向傳播
卷積操作通過仿射變換(Y=AX)可實現(xiàn)由高維特征到低維特征的轉換,也可以轉置A實現(xiàn)低維到高維的反向映射。如果對上述卷積核經鋪開拼接得到的矩陣A進行轉置,然后與低維輸入向量Y做矩陣乘法即反向映射,得到高維輸出向量X,等價于卷積核W與正向卷積的輸出圖像做數學卷積運算(稱為轉置卷積或反卷積,為寬卷積)[1]。
1.2? 卷積核轉為列向量(求參數梯度)
1.2.1? 前向傳播? 將卷積核矩陣所有行拼接為一個列向量(W),將輸入圖像X每個卷積子圖像(按照行優(yōu)先)拼接為一個行向量,所有卷積子圖像形成的行向量按原定的卷積順序組合形成矩陣A(矩陣行數為卷積子圖像數),前向傳播公式等價為:Y=AW+b。
1.2.2? 反向傳播
同樣可以借助轉置卷積,此轉置卷積等價于輸入卷積圖像與卷積輸出圖像做互相關運算(為窄卷積)。根據卷積核或卷積圖像轉為列向量的前向傳播公式對偏置向量求導,為便于與對W求偏導數相統(tǒng)一,借助將卷積核轉為列向量的前向傳播公式Y=AW+b求導。
1.3? 匯聚層求導
因匯聚層為下采樣操作,當第l層為匯聚層時,采取上采樣由l層的損失函數誤差得到第l-1層的損失函數誤差。上采樣之后,由于匯聚是一個線性函數的過程,因此要求針對上一層的Yl-1的梯度,中間只有一個上一層的Yl-1到Xl的激活函數。匯聚層下采樣有平均匯聚和最大匯聚兩種方法。
2? 邊緣智能實驗設計
剖析卷積神經網絡模型算法原理后,便可以借助TensorFlow等深度學習開發(fā)框架進行模型訓練和測試,通常將由TensorFlow保存的HDF5模型轉換為TFLite格式,在正式進入邊緣智能實驗之前,由于NNC模型量化工具對TFLite格式支持較好,故需在電腦上將訓練完成的模型轉換為TFLite格式后再進行量化,生成KModel格式模型(由NNCase
工具轉換)供K210單片機調用。K210芯片架構包含一個自研的神經網絡硬件加速器KPU以便進行卷積神經網絡運算。KPU支持主流訓練框架按照特定限制規(guī)則訓練出來的定點化模型。教學實踐中以亞博智能K210開發(fā)板為載體,下載已在外部設備訓練好的普適模型,基于開發(fā)板自帶傳感設備采集的數據進行測試預測,從而實現(xiàn)一定功能。以下以亞博智能K210開發(fā)板(技術資料參考亞博智能K210開發(fā)板套件)為例,搭建基于C(亞博智能K210開發(fā)板隨機資料只提供C語言學習代碼)和Python兩種嵌入式開發(fā)環(huán)境系統(tǒng),調用卷積神經網絡模型對人臉識別案例進行實驗設計教學。
2.1? 基于C語言的環(huán)境搭建
人臉檢測技術,一是判斷圖片中是否包含人臉區(qū)域;二是如果圖片中存在人臉,將人臉的位置預測出來。推薦在Win10系統(tǒng)下通過VSCode編輯器搭建K210的開發(fā)環(huán)境。
2.1.1? 人臉檢測技術代碼流程及代碼
1)系統(tǒng)內部初始化:①系統(tǒng)時鐘初始化;②串口初始化;③硬件引腳初始化;④IO電壓設置; ⑤系統(tǒng)中斷初始化;⑥Flash初始化。
2)外部硬件初始化:①LCD初始化;②OV2640(攝像頭)初始化。
3)人臉檢測初始化:①模型加載;②人臉檢測層配置初始化。
4)人臉檢測業(yè)務邏輯層:①等待攝像頭采集完成;②傳入攝像頭采集的圖像到KPU運行模型;③等待KPU處理完成;④獲取KPU最終處理的結果;⑤把KPU處理的結果帶入區(qū)域層計算最終
位置;⑥根據獲取的人臉個數進行逐一標記。
核心代碼:
int main(void)
{
sysclock_init();? ?/*系統(tǒng)時鐘初始化*/
uarths_init();? ? ?/*串口初始化*/
hardware_init();? ?/*硬件引腳初始化*/
io_set_power();? ? /*設置IO口電壓*/
plic_init();? ? ? ?/*系統(tǒng)中斷初始化*/
printf(“flash init\n”);
w25qxx_init(3, 0);? ? ? ? ? ?/*Flash init*/
w25qxx_enable_quad_mode();? ?/*Flash 四
倍模式開啟*/
/*KModel加載方式:1.分開燒錄模式;
2.直接與代碼合并編譯*/
#if LOAD_KMODEL_FROM_FLASH
model_data = (uint8_t*)malloc(KMODEL_
SIZE + 255);
uint8_t *model_data_align(uint8_t*)(((uintptr_t)model_data+255)&(~255));
#else
uint8_t *model_data_align = model_data;
#endif
ov2640_init();
/*加載KModel,需要與NNCase配合使用*/
if (kpu_load_kmodel(&face_detect_task, model_
data_align) != 0)
{
printf(“\nmodel init error\n”);
while (1);
}
2.1.2? 代碼編譯? 把K210隨機資料中的 face_
detection文件夾復制到SDK中的src目錄下,然后進入build目錄,刪除build目錄下所有文件,最后運行以下命令編譯:
cmake .. -DPROJ=face_detection -G “MinGW Makefiles”?make
編譯完成后在build文件夾下生成對應文件名的待燒寫二進制文件。
2.1.3? 代碼燒錄
打開kflash下載程序將生成的待燒寫二進制文件燒錄到K210開發(fā)板。
2.2? 基于MicroPython的環(huán)境搭建
下載MaixPy固件到K210開發(fā)板(相當于給開發(fā)板燒錄系統(tǒng)),MaixPy使用MicroPython腳本語法[2],不像C語言一樣需要編譯,要使用MaixPy IDE,開發(fā)板固件必須是V0.3.1版本以上,否則MaixPy IDE連接不上開發(fā)板,使用前盡量都更新到最新版以保障能正常使用。通常一個固件文件中至少有四個文件,以“maixpy_v0.5.0_31_gd3e71c0”固件為例,具體說明如下。
1)eif_maixpy_v0.5.0_31_gd3e71c0.7z:普通用戶不用關心,用于死機調試。
2)maixpy_v0.5.0_31_gd3e71c0_m5stickv:M5STACK環(huán)境。
3)maixpy_v0.5.0_31_gd3e71c0_minimum:MaixPy固件最小集合,不支持MaixPy IDE,不包含OpenMV的相關算法。
4)maixpy_v0.5.0_31_gd3e71c0.bin:完整版的MaixPy固件。
正常使用的完整版MaixPy固件,搭建步驟如下所示。
1)確定開發(fā)板:工具—選擇開發(fā)板—kendryte?KD233。
2)安裝驅動,選擇端口:工具—打開終端—串行端口—COM3—115200。
3)連接:圖標綠色變紅色表示已連接。
主要代碼為:
import sensor
import image
import lcd
import KPU as kpu
import time
from Maix import FPIOA, GPIO
import gc
from fpioa_manager import fm
from board import board_info
import utime
task_fd = kpu.load(0x300000)
task_ld = kpu.load(0x400000)
task_fe = kpu.load(0x500000)
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.set_vflip(0)
sensor.skip_frames()? ? /*跳過一些幀數,因為攝像頭啟動時圖像沒穩(wěn)定*/
lcd.init(invert=1)
sensor.run(1)
3? 結束語
在機器學習課程中引入邊緣智能實驗教學,可以彌補教學實施“重軟輕硬”(即重視基礎理論教學,忽視實踐應用教學)的不足,引導一線教師重視邊緣智能實踐應用教學,有效提升人工智能課程的教學效益,為培養(yǎng)軟硬能力兼?zhèn)涞募夹g應用人才奠定基礎。
參考文獻
[1] 邱錫鵬.神經網絡與深度學習[M].北京:機械工業(yè)出版社,2020:115-129.
[2] 邵子揚.MicroPython入門指南[M].北京:電子工業(yè)出版社,2018:6-22.
*項目來源:2021年度山東省教育教學研究一般課題“中小學人工智能課程內容設計與實施范例研究”(課題編號:2021JXY383)。
作者:穆明,淄博市基礎教育研究院,高級教師,研究方向為機器學習算法(255033)。