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

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

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

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

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

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