PCでPythonを使って学習させたscikit-learnのランダムフォレストのモデルをFlutterで開発しているiosアプリでスマホ上で動かしたかったので、Appleが提供している機械学習ライブラリ?のCoreMLを使用することになりました。

CoreMLとは、sklearn、PyTorch、Tensolflowなどで構築された機械学習モデルをAppleのデバイスで動かすためのApple純正フレームワークです。機械学習モデルをiosアプリの中でスタンドアローンで運用することができるので、サーバーを介さずに推論を行うことができます。

ただ、CoreMLのドキュメントどおりに使用すると、モデルをプロジェクトにインポートされない(正確にはモデルを使用するために自動的生成されるクラスが読み込めない)という問題に直面するのでその解決方法を書いておきます。


起こったエラー

モデルの追加時に自動生成されるクラスを読み込もうとすると、クラスが見つからず以下のエラーが出ます(SampleModelがモデル名かつ自動で生成されるクラス名です)。

 let model = SampleModel()
Cannot find 'SampleModel' in scope
'init()' is deprecated: Use init(configuration:) instead and handle errors appropriately.

ビルドしようとすると以下のエラーメッセージが出てビルドが失敗する

 Command CoreMLModelCodegen failed with a nonzero exit code



エラーの原因

原因は自動的にできるクラスの言語がFlutterアプリだとSwiftではなく、Objective-Cになっていることでした。

Swiftで開発しているならSampleModelというモデルに対してSampleModel.swiftというプログラムが生成されるはずですが、その言語は自動で選択されFlutterで開発されるとObjective-Cのプログラムが生成されてしまうみたいです。

「Command CoreMLModelCodegen failed with a nonzero exit code」に関してはネットに上がっている報告を見る限り、CoreMLのモデルの変換時に説明変数の変数名に2バイト文字をしていしてもエラーが起こるみたいです。



解決方法

ということで、生成されるプログラムの言語をSwiftに指定すればOKです。

Build Settings、All、Labelsから変更できます。

それでは。