【问题标题】:static library fails to init mlmodel静态库无法初始化 mlmodel
【发布时间】:2018-07-05 20:55:37
【问题描述】:

我想将我的模型加载到我的库 (.a) 中

init 试图从应用程序包中加载已编译的 mlmodel,但该包包含应用程序编译库的路径,而不是相反

>     convenience init() {
        let bundle = Bundle(for: TinyYOLO.self)
        let assetPath = bundle.url(forResource: "TinyYOLO", withExtension:"mlmodelc")
        try! self.init(contentsOf: assetPath!)
    }

似乎找不到任何相关问题。

设置是经典的,一个objective-c项目(带有react-native)将多个xcodeproj作为库嵌入(尽管模型是在swift中加载的),我认为hacky解决方法是将编译模型包含在修改后的类中加载它,但看起来很脏。

有什么想法吗?

【问题讨论】:

  • 在构建相关问题上不要删除相关标签!
  • “来自捆绑包”。哪个捆绑包?应用程序包?
  • app bundle 是的,很奇怪
  • 模型实际上是如何包含在包中的?资产路径实际上是非零的吗?
  • 模型在库中,所以资产路径是 nil,因为模型不在应用程序包中(它不应该是?)。简单的解决方法是将模型包含在应用程序中,但这会破坏目的:/

标签: ios swift xcode coreml


【解决方案1】:

好的,为了更大的空间,在这里解决您在 cmets 中写的内容。

静态库不能包含非代码资产。唯一的方法是通过“诡计”使您的资产的字节数据成为.a 中的uint8_t *(其他其他适当的数据类型)符号。通过这样做,您将引用内存(通过该符号)而不是文件。由于许多原因,显然不理想。

您可以采取以下几种方法:

  • 直接将项目添加到应用程序包中。
  • 如果您使用 Xcode 构建您的 .a,请在构建 .a 时为资产创建一个捆绑包。然后将该捆绑包包含到应用中。

我目前为我的游戏引擎执行后者,其中我嵌入了字体(如调试字体)和引擎所需的其他资产。请注意,无论如何,您都必须将单个资产或捆绑包添加到应用程序(应用程序包)。但是,对于后者,您只会添加一项。

您拥有的任何捆绑包引用都指向该捆绑包。我处理这个问题的方法是有一个后备系统,我可以将我的代码指向正在使用的包。然后它沿着链条向下寻找我需要的资产。

【讨论】:

  • 我已经在使用第一个选项(只需添加参考就足够了),因为使用第二个选项(我实际上已经研究过,但我认为我可以找到更好/更容易的东西)太麻烦了我在做什么。令我惊讶的是,似乎没有简单的方法可以做一些应该非常简单的事情(可以肯定的是,在一个快速项目中的框架是开箱即用的),感觉就像我回到了 90 年代跨度>
  • 好吧,您使用的是静态库,这是“较旧”的技术。
  • 是的,我在 react-native 上遇到了一些问题,来自 facebook 和 google 的人到处都在使用 Objective-c 和静态库,所以第三个也会效仿,真的很烦人。
猜你喜欢
  • 2016-02-29
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2011-11-11
  • 2020-10-02
  • 2011-07-09
  • 2012-01-01
  • 2020-04-14
相关资源
最近更新 更多