i.MX RT1060交叉MCU同樣適用于經(jīng)濟高效的工業(yè)應(yīng)用以及需要顯示功能的高性能和數(shù)據(jù)密集型消費類產(chǎn)品。本文通過解釋如何實現(xiàn)一種嵌入式機器學(xué)習(xí)應(yīng)用程序來演示該基于Arm?Cortex?-M7的MCU的功能,該應(yīng)用程序可以檢測和分類用戶的手寫輸入。
為此,本文重點介紹流行的MNIST eIQ示例,該示例由幾個部分組成-數(shù)字識別由TensorFlow Lite模型執(zhí)行,并且GUI用于提高i.MX RT1060設(shè)備的可用性。
看一下MNIST數(shù)據(jù)集和模型
本文使用的數(shù)據(jù)集包括60,000個訓(xùn)練和10,000個手寫數(shù)字居中灰度圖像測試示例。每個樣本的分辨率為28x28像素:

圖1.MNIST數(shù)據(jù)集示例
樣本是從美國的高中生和人口普查局員工那里收集的。因此,數(shù)據(jù)集主要包含在北美書寫的數(shù)字示例。例如,對于歐洲風(fēng)格的數(shù)字,必須使用其他數(shù)據(jù)集。與該數(shù)據(jù)集一起使用時,卷積神經(jīng)網(wǎng)絡(luò)通常會提供最佳結(jié)果,甚至簡單的網(wǎng)絡(luò)也可以實現(xiàn)高精度。因此,TensorFlow Lite是適合此任務(wù)的選項。
本文選擇的MNIST模型實現(xiàn)可在GitHub上作為正式的TensorFlow模型之一獲得,并且使用Python編寫。該腳本使用Keras庫以及tf.data,tf.estimator.Estimator和tf.layers API,并構(gòu)建了一個卷積神經(jīng)網(wǎng)絡(luò),可以在測試樣本上實現(xiàn)高精度:

圖2.所用模型的可視化。
相應(yīng)的模型定義如下圖3所示。

圖3.與模型可視化相對應(yīng)的模型定義。
什么是TensorFlow Lite?在本示例中如何使用?
TensorFlow是一個著名的深度學(xué)習(xí)框架,已被大型公司廣泛用于生產(chǎn)中。這是由Google開發(fā)和維護的開源,跨平臺深度學(xué)習(xí)庫。提供了一個低級Python API,它對經(jīng)驗豐富的開發(fā)人員非常有用,并且提供了高級庫(例如本例中使用的庫)。此外,TensorFlow得到了廣大社區(qū)的支持,并獲得了Google的出色在線文檔,學(xué)習(xí)資源,指南和示例。
為了使受計算限制的機器(例如移動設(shè)備和嵌入式解決方案)能夠運行TensorFlow應(yīng)用程序,Google開發(fā)了TensorFlow Lite框架,該框架不支持TensorFlow框架的全部操作。它允許此類設(shè)備在已轉(zhuǎn)換為TensorFlow Lite的預(yù)訓(xùn)練TensorFlow模型上進行推理。作為回報,這些經(jīng)過轉(zhuǎn)換的模型無法進行進一步的訓(xùn)練,但可以通過量化和修剪等技術(shù)進行優(yōu)化。
將模型轉(zhuǎn)換為TensorFlow Lite
上面討論的經(jīng)過訓(xùn)練的TensorFlow模型必須先轉(zhuǎn)換為TensorFlow Lite,然后才能在i.MX RT1060 MCU上使用。為此,使用tflite_convert對其進行了轉(zhuǎn)換,并且出于兼容性原因,使用TensorFlow的1.13.2版來訓(xùn)練和轉(zhuǎn)換模型:
tflite_convert --saved_model_dir= --output_file=converted_model.tflite --input_shape=1,28,28 --input_array=Placeholder --output_array=Softmax --inference_type=FLOAT --input_data_type=FLOAT --post_training_quantize --target_opsTFLITE_BUILTINS
最后,使用xdd實用程序?qū)ensorFlow Lite模型轉(zhuǎn)換為二進制數(shù)組,以供應(yīng)用程序加載:
xxd-iconverted_model.tflite>converted_model.h
xdd是一個十六進制轉(zhuǎn)儲實用程序,可用于將文件的二進制形式轉(zhuǎn)換為相應(yīng)的十六進制轉(zhuǎn)儲表示形式,反之亦然。在這種情況下,TensorFlow Lite二進制文件將轉(zhuǎn)換為可添加到eIQ項目的C / C ++頭文件。轉(zhuǎn)換過程和tflite_convert實用程序在eIQ用戶指南中進行了詳細(xì)說明。該實用程序也在Google的官方文檔中進行了描述。
嵌入式Wizard Studio快速入門
#ifdef__cplusplus
extern"C"{
#endif
/*Ccode*/
#ifdef__cplusplus
}
#endif為了利用MIMXRT1060-EVK的圖形功能,該項目中包含一個GUI。為此,使用了嵌入式向?qū)tudio,這是一個IDE,用于為將在嵌入式設(shè)備上運行的應(yīng)用程序開發(fā)GUI。盡管可以使用IDE的免費評估版,但該版本限制了圖形用戶界面的最大復(fù)雜性,并且還在GUI上添加了水印。
Embedded Wizard Studio的優(yōu)點之一是能夠基于XNP的SDK生成MCUXpresso和IAR項目,這意味著在IDE中創(chuàng)建用戶界面后,開發(fā)人員可以立即在其設(shè)備上對其進行測試。
IDE提供了放置在畫布上的對象和工具,例如按鈕,觸敏區(qū)域,形狀等。然后將其屬性設(shè)置為適合開發(fā)人員的需求和期望。所有這些工作都以直觀和用戶友好的方式進行,并且大大加快了GUI開發(fā)過程。
但是,由于生成的GUI項目在C中,而qIQ示例在C / C ++中,因此,幾個轉(zhuǎn)換步驟必須將GUI項目與現(xiàn)有的eIQ應(yīng)用程序項目合并。因此,某些頭文件的內(nèi)容必須包含以下內(nèi)容:
此外,大多數(shù)源文件和頭文件已移至SDK的中間件文件夾中的新文件夾,并且添加了新的包含路徑以反映這些更改。最后,比較并正確合并了一些特定于設(shè)備的配置文件。
完成的應(yīng)用程序及其功能
該應(yīng)用程序的GUI顯示在觸敏LCD上。它包含一個用于輸入數(shù)字的輸入?yún)^(qū)域和一個顯示分類結(jié)果的區(qū)域。運行推斷按鈕執(zhí)行推斷,清除按鈕清除輸入和輸出字段。應(yīng)用程序?qū)㈩A(yù)測的結(jié)果和置信度輸出到標(biāo)準(zhǔn)輸出。

圖4.示例應(yīng)用程序的GUI包含一個輸入字段,一個輸出字段和兩個按鈕。結(jié)果和置信度也會打印到標(biāo)準(zhǔn)輸出中。
TensorFlow Lite模型精度
如上所述,該模型在對美國風(fēng)格的手寫數(shù)字進行分類時可以在訓(xùn)練和測試數(shù)據(jù)上實現(xiàn)高精度。但是,在本應(yīng)用程序中不是這種情況,主要是因為用手指在LCD上書寫的數(shù)字與用筆在紙上書寫的數(shù)字永遠(yuǎn)不會相同。這突出了在實際生產(chǎn)數(shù)據(jù)上訓(xùn)練生產(chǎn)模型的重要性。
為了獲得更好的結(jié)果,必須收集一組新的數(shù)據(jù)。此外,方法必須相同。在這種情況下,必須使用觸摸屏輸入來采集樣品以繪制數(shù)字。存在進一步的技術(shù)來增加預(yù)測的準(zhǔn)確性。恩智浦社區(qū)網(wǎng)站包含使用遷移學(xué)習(xí)技術(shù)的演練。
實施細(xì)節(jié)
嵌入式向?qū)褂貌宀圩鳛橛|發(fā)器來對GUI交互做出反應(yīng),例如,當(dāng)用戶在輸入?yún)^(qū)域上拖動手指時。在這種情況下,插槽會在手指下方連續(xù)繪制一個像素寬的線。該行的顏色由主顏色常數(shù)定義。
清除按鈕的插槽將兩個字段中每個像素的顏色設(shè)置為背景色,運行推斷按鈕將保存對輸入?yún)^(qū)域,基礎(chǔ)位圖以及該區(qū)域的寬度和高度的引用,然后將其傳遞給本機處理它們的C程序。
由于來自機器學(xué)習(xí)模型的位圖只有28x28像素大,并且輸入?yún)^(qū)域被創(chuàng)建為112x112正方形,以使應(yīng)用程序使用起來更加舒適,因此在縮小圖像時需要進行額外的預(yù)處理。否則,該過程會使圖像失真太多。
首先,創(chuàng)建一個具有輸入?yún)^(qū)域尺寸的8位整數(shù)數(shù)組,并用零填充。然后,對圖像和數(shù)組進行迭代,并將圖像中每個繪制的像素存儲為數(shù)組中的0xFF。處理輸入時,主要顏色的像素被認(rèn)為是白色,其他所有像素都被認(rèn)為是黑色。此外,每個像素都擴大為3x3正方形以加粗線條,這將使圖像縮小更為安全。在將圖像縮放到所需的28x28分辨率之前,將圖形裁剪并居中以類似于MNIST圖像:

圖5.包含預(yù)處理輸入數(shù)據(jù)的數(shù)組的可視化。
當(dāng)應(yīng)用程序啟動時,將分配,加載和準(zhǔn)備機器學(xué)習(xí)模型。對于每個推理請求,模型的輸入張量都將帶有預(yù)處理輸入,并傳遞給模型。輸入必須逐像素復(fù)制到張量中,并且在此過程中必須將整數(shù)值轉(zhuǎn)換為浮點值。該NXP應(yīng)用筆記包含了代碼的詳細(xì)內(nèi)存占用。
TensorFlow Lite:可行的解決方案
使用機器學(xué)習(xí)的手寫數(shù)字識別可能給嵌入式系統(tǒng)帶來問題,TensorFlow Lite提供了可行的解決方案。使用此解決方案,可以實現(xiàn)更復(fù)雜的用例,例如數(shù)字鎖上的引腳輸入字段。如本文所述,在實際生產(chǎn)數(shù)據(jù)上訓(xùn)練生產(chǎn)模型至關(guān)重要。本文中使用的培訓(xùn)數(shù)據(jù)由用筆寫在紙上的數(shù)字組成。反過來,當(dāng)用于檢測觸摸屏上繪制的數(shù)字時,這會降低模型的整體準(zhǔn)確性。此外,必須考慮到地區(qū)差異。
i.MX RT跨接MCU系列可以實現(xiàn)到各種嵌入式應(yīng)用程序中,例如本文提供的示例。恩智浦(NXP)擁有有關(guān)i.MX RT跨接MCU系列的大量信息,可幫助彌合性能與可用性之間的鴻溝。
-
tensorflow
+關(guān)注
關(guān)注
13文章
336瀏覽量
62362 -
TensorFlow Lite
+關(guān)注
關(guān)注
0文章
26瀏覽量
845
發(fā)布評論請先 登錄
在帶有 RT1060 IW612 的定制板上開發(fā) Matter 恒溫器的問題求解
使用 RT1060 離線學(xué)習(xí)單詞有可能嗎
自定義 i.MX RT1176AVMA8板上的安全配置工具 UART 連接失敗的原因?
i.MX 使用 SAI2 作為 TDM 從機的 RT 1060,無法正確接收接收數(shù)據(jù)怎么解決?
基于i.MX RT106V跨界MCU的智能語音UI邊緣就緒解決方案
探索i.MX RT1180:高性能處理器的技術(shù)剖析與應(yīng)用指南
FRDM i.MX 9平臺選型指南:FRDM i.MX 9系列開發(fā)平臺解析
i.MX RT1180實現(xiàn)EtherCAT+伺服控制的終極實踐
使用恩智浦i.MX RT700跨界MCU打造智能手表
恩智浦i.MX RT1180跨界MCU助力下一代伺服控制系統(tǒng)
恩智浦MCU方案 單顆i.MX RT1180實現(xiàn)EtherCAT+伺服控制
基于恩智浦i.MX RT芯片內(nèi)部RAM運行LVGL工程
如何實現(xiàn)安卓與恩智浦i.MX RT1170的無線投屏與控制
NXP i.MX RT1060移植TinyUSB:快速擴展大量USB Class示例
如何使用i.MX RT1060跨接MCU通過TensorFlow Lite實施數(shù)字識別
評論