Vision.framework と CoreML

CoreML を使い始める。物体の写真を撮って、何が写っているか分類する。ネットに情報は色々あるけど、自分のやりたいことズバリに答えてくれる情報はない。しかも、Swift の情報ばかりで、Objective-C で書く人は完全にマイノリティ。しょうがないので、試行錯誤し、今日わかったのはこんなこと。

まず、モデルの指定方法。VGG16 というモデルが Developer サイトからダウンロードできるので、このデータを使う。Xcode にファイルを追加し、プログラム上ではファイルのパスを指定しモデルのポインタを生成する。ファイルパスの指定でつまずいてしまった・・・まず、ファイルの拡張子は.mlmodel となっているので、ofType で指定してやると見つけられないとのエラー。具体的にはこんな感じ。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSString stringWithUTF8String:]: NULL cString

 
よく調べてみたら、Xcode に .mlmodel を追加すると、勝手にコンパイルされるのだそうで、指定する拡張子は mlmodelc にしないとならない。Xcode では .mlmodel と表示されているのに、プログラム上では .mlmodelc を指定する、具体的にはこんな感じ。
 
    NSString* filepath = [[NSBundle mainBundle] pathForResource:@"VGG16" ofType:@"mlmodelc"];
    NSURL* modelUrl = [NSURL URLWithString:filepath];
    NSError* error;
    MLModel* model = [MLModel modelWithContentsOfURL:modelUrl error:&error];
 
うーん、こんなのわかんないよーと思いつつ、さて、.mlmodelc は一体どこに存在するのかというと、build したアプリケーションの中に保存してありました。
素の .mlmodel は 500 M 超と、最近の HD は大容量になったよね・・・といった風潮でも、ちょっと看過できないぐらい大きい。実際にアプリに bundle してリリースするのはかなり気が引けるのですが・・・
コンパイルしたファイルの大きさは変わるのかどうか、build したアプリで調べてみたらほとんど容量が変わっていない・・・やっぱりアプリ内にモデルを置くのはまずいよね、こういう大きいのはネットから引いてくるべきなんだろうなと。でも、モデルファイルの置き場所をネットにしたら、使用する時に多分一度は全部ファイルを持ってこないとダメなはずで、今度は通信にすごい時間かかりそう。結局のところ、モデルファイルは小さくなるように自作するか、モデルとロジックをネットにおいて結果を受け取るような作りにするのが正しいやり方なんでしょうね。
試している段階で既に課題が出てきた・・・