如何在 Flutter 中構建計算機視覺移動應用
已發表: 2020-04-22機器學習功能已成為當今應用程序中的必備功能。 它們可以提高滿意度並為您的受眾提供他們想要的非凡應用體驗。 由於最近的硬件和軟件優化,機器學習模型的執行正在從雲端轉移到移動設備本身。
通過消除響應延遲和解決隱私問題,這對用戶體驗產生了巨大影響。 當我們決定開發一款幫助用戶照看室內植物的應用程序 Planter 時,我們知道能夠讓它在應用程序市場上脫穎而出的東西就是人工智能。
我們的想法是添加功能,使用計算機視覺技術從圖像中識別室內植物的類型。 由於 TensorFlow Lite 對設備性能的優化,該應用程序可以僅在用戶設備上運行我們的分類模型。 在本文中,我將解釋如何快速準備圖像分類模型,並將其部署到使用 Flutter 開發的應用程序中。
在 Flutter 中構建機器學習模塊——一步一步
處理小數據問題
構建機器學習模型的第一步是數據收集。 為了創建一個訓練數據集,我們使用了谷歌圖片下載器,它允許我們從谷歌搜索中下載植物圖片,並帶有標記為商業重用的權利,並帶有以下簡短腳本:
$ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights 標記為重用
我們的最終數據集由每個物種約 70-170 張圖像組成。 用這麼少的數據從頭開始準備一個性能良好的圖像分類模型是非常困難的。
幸運的是,有一些強大的預訓練人工神經網絡公開可用,可用於構建高精度圖像分類器,即使您的數據集每個類別僅包含大約一百個示例。 這種使用預訓練模型並將其修改為特定用例的技術稱為遷移學習。
數據增強
為了最大限度地利用我們的數據集,我們使用了 keras 的 ImageDataGenerator 預處理包,它可以生成成批的張量圖像,並在運行中對其進行擴充。 我們使用了以下轉換:
- 水平翻轉輸入:horizontal_flip = True
- 從範圍設置亮度偏移值: brightness_range = (0.75, 1.25)
- 使用提供的強度剪切: shear_range = 15
- 重新縮放,通過乘以指定值: rescale=1./255
- 放大和縮小: zoom_range=0.4
- 向任意方向移動: width_shift_range = 0.1, height_shift_range = 0.15
train_datagen_augment = ImageDataGenerator(rotation_range = 30, 水平翻轉=真, 亮度範圍 = (0.75,1.25), 剪切範圍 = 15, 重新縮放=1./255, 縮放範圍=0.4, width_shift_range = 0.1, height_shift_range = 0.15)
訓練
我們使用了 NASNet-Mobile,這是一種卷積神經網絡,它在 ImageNet 數據集中的超過一百萬張圖像上進行了訓練。 NasNetMobile 架構由一組用神經網絡單元構建的塊組成。
Block 是一個操作模塊,包括從圖像分類神經網絡中已知的轉換,包括:正常卷積、可分離卷積、最大池化、平均池化、恆等映射等。該網絡已被訓練以分配給圖像 1 out of 1000 個類別,包括動物、花卉和家具。 結果,網絡“學習”了廣泛圖像的豐富特徵表示。
我們創建了完成以下步驟的模型:
- 移除預訓練網絡的最後一層
- 在網絡末端添加卷積模型
- 凍結組合網絡中的所有層,除了來自添加模型的層
- 訓練模型直到準確性停止提高
- 解凍預訓練模型的最後一個凍結卷積塊中的所有層
- 訓練模型直到準確性停止提高
- 重複第 5 點和第 6 點五次
- 解凍整個模型,並對其進行訓練,直到準確性停止提高
模型評估
Planter 的分類模型嘗試根據照片將植物類型分配給室內植物。 該模型返回分配給最高概率的三種類型,用戶可以從中選擇一種。 在評估模型期間,我們使用了以下兩個指標:
- 分類準確度,
- top_k_categorical_accuracy(k=3)。
下圖顯示了我們模型的每個訓練時期的分類準確度。

評估集的最終分類準確率為 0.870,前 3 名的分類準確率為 0.916。 考慮到所使用的訓練數據集較小,這些結果非常令人滿意。
模型轉換
如果我們想在移動應用中使用 keras 模型,則需要將其轉換為 TensorFlow Lite FlatBuffer 對象。 這可以使用下面示例中顯示的代碼來完成。
將 tensorflow.lite 導入為 lite keras_model_path = "模型/keras_model" tflite_model_path = "模型/model.tflite" 模型.保存(keras_model_path) 轉換器 = lite.TFLiteConverter.from_keras_model_file(keras_model_path) tflite_model = 轉換器.convert() 打開(tflite_model_path,“wb”)。寫(tflite_model)
現在我們已經將優化模型存儲在 model/model.tflite 路徑中,我們可以輕鬆地在原生移動應用程序中使用它,使用:
- Core ML – 適用於 iOS 應用
- TensorFlow Lite Android 支持庫 – 適用於 Android 應用
現在,我將根據我們使用 Planter 的經驗向您展示如何在 Flutter 中使用該模型。
為什麼顫振?
Flutter 是谷歌旗下的 UI 工具包。 它的創建是為了從單個代碼庫為移動、Web 和桌面構建本機編譯的應用程序。 如果您想知道是否應該使用 Flutter,我建議您閱讀這篇文章,這是 Miquido 在 Flutter 中開發的 Abbey Road Studios 的 Topline 案例研究。
我們可以將我們的模型與 tflite 庫一起使用。 它是一個用於訪問 TensorFlow Lite API 的 Flutter 插件。 它支持 iOS 和 Android 平台上的圖像分類、對象檢測、Pix2Pix、Deeplab 和 PoseNet。
對 Flutter 開發感到好奇?

在我們的應用程序開發過程中,我們必須完成以下步驟:
- 在我們的 pubspec.yaml 文件中添加 tflite 作為依賴項
- 創建一個 assets 文件夾並在其中放置一個標籤文件和一個模型文件。
- 在 pubspec.yaml 中,添加:
資產: - 資產/標籤.txt - 資產/mobilenet_v1_1.0_224.tflite
- 導入庫 tflite:
導入“包:tflite/tflite.dart”;
- 加載模型和標籤:
字符串 res = 等待 Tflite.loadModel( 模型:“資產/model.tflite”, 標籤:“資產/標籤.txt”, numThreads: 1 // 默認為 1 );
- 在圖像上運行模型(進行預測):
var 識別 = 等待 Tflite.runModelOnImage( 路徑:tfResizedImage.path, 圖像標準:255.0, numResults: 3, 閾值:0.00001, 異步:真 );
預測輸出具有以下示例中所示的格式:
[{confidence: 0.03441339731216431, index: 46, label: Vriesea splendens}, {confidence: 2.086162567138672e-7, index: 7, label: Aphelandra squarrosa}, {confidence: 1.4901161193847656e-7, index: 19, label: Fern arum }]
- 發布資源:
等待 Tflite.close();
最終結果
Planter 允許您將帶有圖像的植物添加到您的庫中。 您可以通過拍攝植物照片或從手機圖庫中選擇一張來獲取圖像。 包含的室內植物分類模型返回三個被識別的概率最高的物種,並將它們呈現在一個列表中。
單擊一個物種將引導您進入植物摘要視圖,其中包含一個預先填寫的表格,其中包含建議的澆水和施肥時間表,以及有關植物的一些附加信息。 在下面的流程中,您可以看到一個示例,其中 Zamioculcas zamiifolia 在使用照相手機拍攝的圖像中被識別。



將您的機器學習轉移到移動設備上!
在本文中,我想說服您,在您的移動應用程序中添加用戶喜歡的 AI 功能可以簡單快捷。 更重要的是,將模型執行轉移到移動設備上,通過消除 API 響應延遲,為您的用戶提供令人愉悅的用戶體驗。 它還有助於確保數據安全,因為不需要將數據發送到雲端。
您可以從使用 Flutter 及其同時為 iOS 和 Android 原生應用程序編譯代碼的能力中受益匪淺。 不費吹灰之力,您就可以讓您的應用在市場上脫穎而出,並最大限度地提高應用的受眾保留率。
準備好您的下一個項目了嗎? 不要猶豫,與我們聯繫!