Загрузка моделей tflite с сервера, а не использование моделей из папки активов в Swift - PullRequest
1 голос
/ 26 февраля 2020

Я видел примеры tenorflow lite для iOS, и они находятся в папке ресурсов. У нас есть какая-то модель на сервере, которую я хочу загрузить и сохранить в каталоге документов и использовать.

Вот как я могу загрузить и сохранить модель в каталоге документов.

class ModelFileManager {

  let folderRoute = "Models"

  func saveModel(with file: String, data: Data, extension fileExtension: String) {
      let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(folderRoute, isDirectory: true)

      if !FileManager.default.fileExists(atPath: documentsDirectory.path) {
          do {
              try FileManager.default.createDirectory(atPath: documentsDirectory.path, withIntermediateDirectories: true, attributes: nil)
          } catch {
              print(error)
          }
      }

      let fileURL = documentsDirectory.appendingPathComponent("\(file).\(fileExtension)", isDirectory: false)

      do {
          try data.write(to: fileURL)
          print("File save at \(fileURL.absoluteString)")
      } catch {
          print("File can't not be save at path \(fileURL.absoluteString), with error : \(error)");
      }
  }

  func fetchModel(for name: String) -> String {
      let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(folderRoute, isDirectory: true)
      let fileURL = documentsDirectory.appendingPathComponent("\(name)", isDirectory: false)
      return fileURL.absoluteString
  }
}

Итак когда я даю путь к файлу Interpreter, он говорит

The model is not a valid Flatbuffer file
Failed to create the interpreter with error: Failed to load the given model.

1 Ответ

0 голосов
/ 28 февраля 2020

Я решил это, заменив file:/// пустой строкой из absoluteString

func fetchModel(for name: String) -> String {
  let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(folderRoute, isDirectory: true)
  let fileURL = documentsDirectory.appendingPathComponent("\(name)", isDirectory: false)
  return fileURL.absoluteString.replacingOccurrences(of: "file:///", with: "")
}
...