色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

全新插件tflite_flutter

Tensorflowers ? 來源:TensorFlow ? 2020-09-27 14:42 ? 次閱讀

如果您希望能有一種簡單、高效且靈活的方式把 TensorFlow 模型集成到 Flutter 應用里,那請您一定不要錯過我們今天介紹的這個全新插件tflite_flutter。這個插件的開發者是 Google Summer of Code (GSoC) 的一名實習生 Amish Garg。

tflite_flutter插件的核心特性:

插件提供了與 TFLite Java 和 Swift API 相似的 Dart API,所以其靈活性和在這些平臺上的效果是完全一樣的;

插件通過 dart:ffi 直接與 TensorFlow Lite C API 相綁定,所以它比其它平臺集成方式更加高效;

無需編寫特定平臺的代碼;

通過 NNAPI 提供加速支持,在 Android 上使用 GPU Delegate,在 iOS 上使用 Metal Delegate。

本文中,我們將使用 tflite_flutter 構建一個文字分類 Flutter 應用,帶您體驗 tflite_flutter 插件。首先從新建一個 Flutter 項目text_classification_app開始。

初始化配置

Linux 和 Mac用戶

將 install.sh 拷貝到您應用的根目錄,然后在根目錄執行 sh install.sh,本例中就是目錄 text_classification_app/。

Windows 用戶

將 install.bat 文件拷貝到應用根目錄,并在根目錄運行批處理文件 install.bat,本例中就是目錄 text_classification_app/。

它會自動從GitHub 倉庫的 Releases 里下載最新的二進制資源,然后把它放到指定的目錄下。

請點擊到 README 文件里查看更多關于初始配置的信息

tflite_flutter 的 GitHub 倉庫
https://github.com/am15h/tflite_flutter_plugin

獲取插件

在pubspec.yaml添加tflite_flutter: ^

最新版本情況參考插件的發布地址
https://pub.flutter-io.cn/packages/tflite_flutter

下載模型

要在移動端上運行 TensorFlow 訓練模型,我們需要使用 .tflite 格式。如果需要了解如何將 TensorFlow 訓練的模型轉換為 .tflite 格式,請參閱官方指南。

這里我們準備使用 TensorFlow 官方站點上預訓練的文字分類模型。

該預訓練的模型可以預測當前段落的情感是積極還是消極。它是基于來自 Mass 等人的 Large Movie Review Dataset v1.0數據集進行訓練的。數據集由基于 IMDB 電影評論所標記的積極或消極標簽組成,查看更多信息。

將 text_classification.tflite 和 text_classification_vocab.txt 文件拷貝到 text_classification_app/assets/ 目錄下。

在 pubspec.yaml 文件中添加 assets/。

assets: - assets/

現在萬事俱備,我們可以開始寫代碼了。

模型轉換器(Converter)的 Python API 指南
https://tensorflow.google.cn/lite/convert/python_api

預訓練的文字分類模型(text_classification.tflite)
https://files.flutter-io.cn/posts/flutter-cn/2020/tensorflow-lite-plugin/text_classification.tflite

數據集(text_classification_vocab.txt)
https://files.flutter-io.cn/posts/flutter-cn/2020/tensorflow-lite-plugin/text_classification_vocab.txt

實現分類器

預處理

正如文字分類模型頁面里所提到的。可以按照下面的步驟使用模型對段落進行分類:

對段落文本進行分詞,然后使用預定義的詞匯集將它轉換為一組詞匯 ID;

將生成的這組詞匯 ID 輸入 TensorFlow Lite 模型里;

從模型的輸出里獲取當前段落是積極或者是消極的概率值。

我們首先寫一個方法對原始字符串進行分詞,其中使用 text_classification_vocab.txt作為詞匯集。

在 lib/文件夾下創建一個新文件 classifier.dart。

這里先寫代碼加載 text_classification_vocab.txt 到字典里。

import 'package:flutter/services.dart'; class Classifier { final _vocabFile = 'text_classification_vocab.txt'; Map _dict; Classifier() { _loadDictionary(); } void _loadDictionary() async { final vocab = await rootBundle.loadString('assets/$_vocabFile'); var dict = {}; final vocabList = vocab.split(' '); for (var i = 0; i < vocabList.length; i++) { var entry = vocabList[i].trim().split(' '); dict[entry[0]] = int.parse(entry[1]); } _dict = dict; print('Dictionary loaded successfully'); } }

△加載字典

現在我們來編寫一個函數對原始字符串進行分詞。

import 'package:flutter/services.dart'; class Classifier { final _vocabFile = 'text_classification_vocab.txt'; // 單句的最大長度 final int _sentenceLen = 256; final String start = ''; final String pad = ''; final String unk = ''; Map _dict; List> tokenizeInputText(String text) { // 使用空格進行分詞 final toks = text.split(' '); // 創建一個列表,它的長度等于 _sentenceLen,并且使用 的對應的字典值來填充 var vec = List.filled(_sentenceLen, _dict[pad].toDouble()); var index = 0; if (_dict.containsKey(start)) { vec[index++] = _dict[start].toDouble(); } // 對于句子里的每個單詞,在映射里找到相應的索引值 for (var tok in toks) { if (index > _sentenceLen) { break; } vec[index++] = _dict.containsKey(tok) ? _dict[tok].toDouble() : _dict[unk].toDouble(); } // 按照我們的解釋器輸入 tensor 所需的格式 [1, 256] 返回 List> return [vec]; } }

△分詞代碼

使用 tflite_flutter 進行分析

這是本文的主體部分,這里我們會討論 tflite_flutter 插件的用途。

此處的分析指的是在設備上基于輸入的數據,使用 TensorFlow Lite 模型的處理過程。要使用 TensorFlow Lite 模型進行分析,需要通過解釋器來運行它,了解更多。

創建解釋器,加載模型

tflite_flutter 提供了一個方法直接通過資源創建解釋器。

static Future fromAsset(String assetName, {InterpreterOptions options})

由于我們的模型在 assets/文件夾下,需要使用上面的方法來創建解析器。對于 InterpreterOptions 的相關說明,請參考這里。

import 'package:flutter/services.dart'; // 引入 tflite_flutter import 'package:tflite_flutter/tflite_flutter.dart'; class Classifier { // 模型文件的名稱 final _modelFile = 'text_classification.tflite'; // TensorFlow Lite 解釋器對象 Interpreter _interpreter; Classifier() { // 當分類器初始化以后加載模型 _loadModel(); } void _loadModel() async { // 使用 Interpreter.fromAsset 創建解釋器 _interpreter = await Interpreter.fromAsset(_modelFile); print('Interpreter loaded successfully'); } }

△創建解釋器的代碼

如果您不希望將模型放在assets/目錄下,tflite_flutter 還提供了工廠構造函數創建解釋器,更多信息。

我們開始進行分析!

現在用下面方法啟動分析:

void run(Object input, Object output);

注意這里的方法和 Java API 中的是一樣的。

Object input 和 Object output 必須是與 Input Tensor 和 Output Tensor 維度相同的列表。

要查看 input tensor 和 output tensor 的維度,可以使用如下代碼:

_interpreter.allocateTensors(); // 打印 input tensor 列表 print(_interpreter.getInputTensors()); // 打印 output tensor 列表 print(_interpreter.getOutputTensors());

在本例中 text_classification 模型的輸出如下:

InputTensorList: [Tensor{_tensor: Pointer: address=0xbffcf280, name: embedding_input, type: TfLiteType.float32, shape: [1, 256], data: 1024] OutputTensorList: [Tensor{_tensor: Pointer: address=0xbffcf140, name: dense_1/Softmax, type: TfLiteType.float32, shape: [1, 2], data: 8]

現在,我們實現分類方法,該方法返回值為 1 表示積極,返回值為 0 表示消極。

int classify(String rawText) { // tokenizeInputText 返回形狀為 [1, 256] 的 List> List> input = tokenizeInputText(rawText); // [1,2] 形狀的輸出 var output = List(2).reshape([1, 2]); // run 方法會運行分析并且存儲輸出的值 _interpreter.run(input, output); var result = 0; // 如果輸出中第一個元素的值比第二個大,那么句子就是消極的 if ((output[0][0] as double) > (output[0][1] as double)) { result = 0; } else { result = 1; } return result; }

△用于分析的代碼

在 tflite_flutter 的 extension ListShape on List 下面定義了一些使用的擴展:

// 將提供的列表進行矩陣變形,輸入參數為元素總數并保持相等 // 用法:List(400).reshape([2,10,20]) // 返回 List List reshape(List shape) // 返回列表的形狀 List get shape // 返回列表任意形狀的元素數量 int get computeNumElements

最終的 classifier.dart 應該是這樣的:

import 'package:flutter/services.dart'; // 引入 tflite_flutter import 'package:tflite_flutter/tflite_flutter.dart'; class Classifier { // 模型文件的名稱 final _modelFile = 'text_classification.tflite'; final _vocabFile = 'text_classification_vocab.txt'; // 語句的最大長度 final int _sentenceLen = 256; final String start = ''; final String pad = ''; final String unk = ''; Map _dict; // TensorFlow Lite 解釋器對象 Interpreter _interpreter; Classifier() { // 當分類器初始化的時候加載模型 _loadModel(); _loadDictionary(); } void _loadModel() async { // 使用 Intepreter.fromAsset 創建解析器 _interpreter = await Interpreter.fromAsset(_modelFile); print('Interpreter loaded successfully'); } void _loadDictionary() async { final vocab = await rootBundle.loadString('assets/$_vocabFile'); var dict = {}; final vocabList = vocab.split(' '); for (var i = 0; i < vocabList.length; i++) { var entry = vocabList[i].trim().split(' '); dict[entry[0]] = int.parse(entry[1]); } _dict = dict; print('Dictionary loaded successfully'); } int classify(String rawText) { // tokenizeInputText 返回形狀為 [1, 256] 的 List> List> input = tokenizeInputText(rawText); //輸出形狀為 [1, 2] 的矩陣 var output = List(2).reshape([1, 2]); // run 方法會運行分析并且將結果存儲在 output 中。 _interpreter.run(input, output); var result = 0; // 如果第一個元素的輸出比第二個大,那么當前語句是消極的 if ((output[0][0] as double) > (output[0][1] as double)) { result = 0; } else { result = 1; } return result; } List> tokenizeInputText(String text) { // 用空格分詞 final toks = text.split(' '); // 創建一個列表,它的長度等于 _sentenceLen,并且使用 對應的字典值來填充 var vec = List.filled(_sentenceLen, _dict[pad].toDouble()); var index = 0; if (_dict.containsKey(start)) { vec[index++] = _dict[start].toDouble(); } // 對于句子中的每個單詞,在 dict 中找到相應的 index 值 for (var tok in toks) { if (index > _sentenceLen) { break; } vec[index++] = _dict.containsKey(tok) ? _dict[tok].toDouble() : _dict[unk].toDouble(); } // 按照我們的解釋器輸入 tensor 所需的形狀 [1,256] 返回 List> return [vec]; } }

現在,可以根據您的喜好實現 UI 的代碼,分類器的用法比較簡單。

// 創建 Classifier 對象 Classifer _classifier = Classifier(); // 將目標語句作為參數,調用 classify 方法 _classifier.classify("I liked the movie"); // 返回 1 (積極的) _classifier.classify("I didn't liked the movie"); // 返回 0 (消極的)

△ 文字分類示例應用

了解更多關于 tflite_flutter 插件的信息,請訪問 GitHub repo:am15h/tflite_flutter_plugin。

你問我答

問:tflite_flutter 和 tflite v1.0.5 有哪些區別?

tflite v1.0.5 側重于為特定用途的應用場景提供高級特性,比如圖片分類、物體檢測等等。而新的 tflite_flutter 則提供了與 Java API 相同的特性和靈活性,而且可以用于任何 tflite 模型中,它還支持 delegate。

由于使用 dart:ffi (dart (ffi) C),tflite_flutter 非常快 (擁有低延時)。而 tflite 使用平臺集成 (dart platform-channel (Java/Swift) JNI C)。

問:如何使用 tflite_flutter 創建圖片分類應用?有沒有類似 TensorFlow Lite Android Support Library 的依賴包?

TensorFlow Lite Flutter Helper Library為處理和控制輸入及輸出的 TFLite 模型提供了易用的架構。它的 API 設計和文檔與 TensorFlow Lite Android Support Library 是一樣的。更多信息請參考 TFLite Flutter Helper 的 GitHub 。

TFLite Flutter Helper 開發庫 GitHub 倉庫地址
https://github.com/am15h/tflite_flutter_helper

以上是本文的全部內容,歡迎大家對 tflite_flutter 插件進行反饋,請在 GitHub報 bug 或提出功能需求。謝謝關注,感謝 Flutter 團隊的 Michael Thomsen。

向 tflite_flutter 插件提出建議和反饋
https://github.com/am15h/tflite_flutter_plugin/issues

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • iOS
    iOS
    +關注

    關注

    8

    文章

    3395

    瀏覽量

    150701
  • 插件
    +關注

    關注

    0

    文章

    331

    瀏覽量

    22447
  • tensorflow
    +關注

    關注

    13

    文章

    329

    瀏覽量

    60537

原文標題:社區分享 | 在 Flutter 中使用 TensorFlow Lite 插件實現文字分類

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II

    ││└── widgets #通用小型 widgets, 純dart編寫的 Flutter UI 組件 │├── components #封裝組件庫,可以依賴于第三方庫/第三方插件,或依賴于 plugins中的插件
    發表于 12-26 14:59

    鴻蒙Flutter實戰:12-使用模擬器開發調試

    前提 開發電腦需為M系列芯片 (ARM架構) 的 Mac 電腦 目前 Flutter 鴻蒙開發,無法使用 X86 架構的模擬器,只能使用 ARM 架構的模擬器** 創建項目 等開發環境搭建
    發表于 11-10 13:13

    鴻蒙Flutter實戰:11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安裝 參考[鴻蒙Flutter實戰:01-搭建開發環境]文章的說明,首先安裝 Flutter SDK 3.22.0。 目前鴻蒙化
    發表于 11-01 15:03

    鴻蒙Flutter實戰:10-常見問題集合

    # 鴻蒙Flutter實戰:10-常見問題集合 ## 1. 學習路徑應該是怎樣的,需要掌握哪些技術才具備鴻蒙 Flutter 開發能力 1.1 學習和掌握 Flutter 開發技術,這塊需要
    發表于 10-23 17:05

    鴻蒙Flutter實戰:09-現有Flutter項目支持鴻蒙

    添加依賴項,首先添加純dart編寫的包,再添加依賴于原生代碼/插件的包。注意挨個添加依賴,不要一次添加太多依賴,方便排查定位問題, 解決版本依賴問題,鴻蒙Flutter項目目前需要依賴于3.7版本
    發表于 10-23 16:36

    鴻蒙Flutter實戰:08-如何調試代碼

    # 鴻蒙Flutter實戰:如何調試代碼 ## 1.環境搭建 參考文章[鴻蒙Flutter實戰:01-搭建開發環境](https://gitee.com/zacks
    發表于 10-23 16:29

    鴻蒙Flutter實戰:07混合開發

    參考資料 撰寫雙端平臺代碼(插件編寫實現) 鴻蒙Flutter功能開發 鴻蒙add-to-app示例 如何使用混合開發 module 【flutter鴻蒙技術交流】 目前 Flutter
    發表于 10-23 16:00

    鴻蒙Flutter實戰:06-使用ArkTs開發Flutter鴻蒙插件

    # 使用 ArkTs 開發 Flutter 鴻蒙平臺插件 本文講述如何開發一個 Flutter 鴻蒙插件,如何實現 Flutter 與鴻蒙
    發表于 10-22 21:56

    鴻蒙Flutter實戰:05-使用第三方插件

    # 鴻蒙Flutter 實戰:使用第三方插件 在鴻蒙Flutter開發中,如果涉及到使用原生功能,就要使用插件。使用插件有兩種方式,一種是
    發表于 10-22 21:54

    鴻蒙Flutter實戰:03-鴻蒙Flutter開發中集成Webview

    # 鴻蒙 Flutter 開發中集成 Webview ## 主要有兩種方案 ### 使用第三方庫 如 使用`flutter_inappwebview`插件,在 pubspec.lock 文件中
    發表于 10-22 21:51

    鴻蒙Flutter實戰:02-Windows環境搭建踩坑指南

    環境搭建 1. 下載Flutter SDK,配置環境變量 鴻蒙 Flutter SDK 需要在 Gitee 下載。目前建議下載 dev 分支代碼。 需要配置以下用戶變量 注意鴻蒙開發需要安裝Java
    發表于 10-22 15:05

    鴻蒙Flutter實戰:01-搭建開發環境

    ; 如果要適配ios,需要安裝Xcode Mac 安裝(推薦) 環境變量配置 # Flutter Mirror export PUB_HOSTED_URL=https
    發表于 10-21 19:35

    快速部署Tensorflow和TFLITE模型在Jacinto7 Soc

    電子發燒友網站提供《快速部署Tensorflow和TFLITE模型在Jacinto7 Soc.pdf》資料免費下載
    發表于 09-27 11:41 ?0次下載
    快速部署Tensorflow和<b class='flag-5'>TFLITE</b>模型在Jacinto7 Soc

    Flutter首次亮相Google Cloud Next大會

    Flutter 團隊在近期首次參加了 Google Cloud Next 大會,這意味著 Flutter 在開發社區中的影響力正在日益增長。
    的頭像 發表于 05-09 10:15 ?498次閱讀

    淺談兼容 OpenHarmony 的 Flutter

    OpenHarmony SIG 組織在 Gitee 開源了兼容 OpenHarmony 的 Flutter。該組織主要用于孵化 OpenHarmony 相關的開源生態項目。 ? ? ▲ 倉庫地址
    的頭像 發表于 02-02 15:22 ?620次閱讀
    淺談兼容 OpenHarmony 的 <b class='flag-5'>Flutter</b>
    主站蜘蛛池模板: 最近免费中文字幕大全免费| 校园全肉高h湿一女多男| 日本女人bbb| 最新色导航| 久久人妻熟女中文字幕AV蜜芽| 性饥渴姓交HDSEX| 国产精品永久免费| 乌克兰14一18处交见血| 高挑人妻无奈张开腿| 日本一本道高清码v| 成人在无码AV在线观看一| 欧美日韩中文国产一区| caoporn超碰视频| 欧美人妇无码精品久久| 99在线观看视频| 欧美又粗又大AAAA片| 啊轻点灬大JI巴又大又粗| 求个av网站| 女人夜夜春| 97久久无码精品AV| 男人插女人动态| WWW国产亚洲精品久久| 国产专区_爽死777| 亚洲免费高清视频| 久久www99re在线播放| 最近免费中文字幕MV在线视频3 | 欧美亚洲国产激情一区二区| 99re久久热在这里精品| 日本二区三区欧美亚洲国| 高清无码中文字幕影片| 午夜伦理电影在线观免费| 精品久久久无码21P发布| 最近日本MV字幕免费观看在线| 嫩草亚洲国产精品| 给我免费播放片bd国语| 亚洲国产综合另类视频| 就去色电影| 儿子操妈妈视频| 夜色伊甸园| 秋霞电影网伦大理电影在线观看| 国产成人无码精品久久久按摩 |