【问题标题】:Flutter Firebase Machine learning how to use remote labelsFlutter Firebase 机器学习如何使用远程标签
【发布时间】:2022-12-14 03:07:47
【问题描述】:

我第一次尝试在 flutter 上使用 firebase 机器学习,我已经很容易地在自定义模型部分上传 .tflite 文件,然后很好地使用远程模型,我唯一不明白的问题是我是否更新模型并想添加更多标签 我理想情况下也使用远程 .txt 文件,但我如何将其上传到机器学习部分,因为我只能找到说明如何使用模型文件本身的文档。

FirebaseModelDownloader.instance
    .getModel(
        "Breed-Detector",
        FirebaseModelDownloadType.localModel,
        FirebaseModelDownloadConditions(
          iosAllowsCellularAccess: true,
          iosAllowsBackgroundDownloading: false,
          androidChargingRequired: false,
          androidWifiRequired: false,
          androidDeviceIdleRequired: false,
        ))
    .then((customModel) async {
  final localModelPath = customModel.file;

  // ...
  Tflite.close();
  String res;
  res = (await Tflite.loadModel(
      model: localModelPath.toString(), labels: "assets/labels.txt"))!;

那么我如何将远程 labels.txt 与远程模型一起使用而不是使用远程模型并且必须在本地存储标签

【问题讨论】:

    标签: flutter firebase


    【解决方案1】:

    我设法为此使用了 Firebase 存储,它错过了版本控制的想法......

    这是我的解决方案 首先创建一个存储桶并在那里更新您的文件: https://firebase.google.com/docs/storage/flutter/start

    我使用了以下规则:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read;
          allow write: if request.auth != null;
        }
      }
    }
    

    然后在 flutter 应用程序中:

    late File labelsFile;
    
    Future<File> getFirebaseFile(String fileName) async {
      Directory appDocDir = await getApplicationDocumentsDirectory();
      File labelsFile = File('${appDocDir.path}/$fileName');
      if (!labelsFile.existsSync()) {
        await downloadFirebaseFile(labelsFile, fileName);
      }
      return labelsFile;
    }
    
    Future<void> downloadFirebaseFile(File file, String fileName) async {
      try {
        await FirebaseStorage.instance.ref(fileName).writeToFile(file);
      } on FirebaseException catch (e) {
        print("Error loading labelsFile $e");
      }
    }
    

    然后您可以在 localModelPath 实例化之后立即使用它:

    labelsFile = await getFirebaseFile("labels.txt");
    
    // init inference
    TfliteAudio.loadModel(
        numThreads: numThreads,
        isAsset: false,                    //<-- this is important
        outputRawScores: outputRawScores,
        inputType: inputType,
        model: localModelPath.path,
        label: labelsFile.path,
    );
    

    在 fetchLabels 方法中:

    Future<List<String>> fetchLabelList() async {
      List<String> labelList = [];
      labelsFile = await getFirebaseFile("labels.txt");
      await labelsFile.readAsString().then((q) {
        for (String i in const LineSplitter().convert(q)) {
          labelList.add(i);
        }
      });
      return labelList;
    }
    

    如果标签的文件在本地不存在,将被下载,如果它改变版本,它不会被更新......我不知道如何处理这个......

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 2020-11-11
      • 2020-03-09
      • 2016-07-28
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多