swiftpackage 打包 mlpackage

.mlpackage 文件是苹果的机器学习框架 CoreML 模型包的格式。一般使用的时候是将它直接拖进 xcode 中。
这时,xcode 会将它编译生成 .mlmodelc 文件以及对应的 swiftobject-c 代码文件。
这样,在你的项目里面才能正常使用他们。

当使用 swiftpackage 中通过 resources 字段来打包 .mlpackage 包的时候,
它们并不会自动编译,此时就会无法正常使用了。需要采用如下步骤来处理:

  1. 使用命令行手动编译 .mlpacakge
xcrun coremlcompiler compile <mlpcakge path> <output dir> # 生成 .mlmodelc 文件
xcrun coremlcompiler generate --language Swift <mlpackage path> <output dir> # 生成 swift 代码

如果 xcrun 说找不到 coremlcompiler,你需要运行如下指令:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
  1. 修改生成代码文件

假设我们的原始模型文件叫 abc.mlpacakge。通过执行上面的指令,你会获得:

  • abc.mlmodelc
  • abc.swift

你需要将它们拷贝到你的 swiftpackage 项目中,并修改一下 abc.swift 中一个函数:

class nmp {
    // 找到这个函数,修改其实现为如下内容。否则通过 swiftpacakge 引入的时候会找不到资源
    class var urlOfModelInThisBundle : URL {
        return Bundle.module.url(forResource: "abc", withExtension: "mlmodelc", subdirectory: nil)!
    }
}
  1. 修改 swiftpackage 中 resources 字段引入的名字

修改 Package.swift

targets: [
    .target(
        name: "target1",
        // 假设原来为 resources: [.process("abc.mlpackage")]
        resources: [.process("abc.mlmodelc")]
    ),
]

完成以上步骤,就可以让你的机器学习模型正常运行了。