花サーチは、カメラで撮影した花・植物をオンデバイスで認識するiOSアプリです。ネットワーク接続不要で、写真が端末外に送信されない設計にこだわりました。その内部実装を紹介します。
目次
ベースモデル:nature_flowers
認識モデルには crossprism/nature_flowers(分類ヘッド)と crossprism/efficientnetv2-21k-fv-m(特徴抽出器)を採用しました。いずれもApache 2.0ライセンスで公開されており、App Store公開アプリ「CrossPrism Nature Guide」が実際に使用しているモデルです。
花・植物16,827種を分類できる規模のモデルで、一般的な植物図鑑アプリよりも広いカバレッジを持っています。
2段階推論の構成
認識処理は2段階に分かれています。
- 特徴抽出器(Vision経由)で画像を1280個の数値からなる特徴ベクトル(画像の見た目を表す数値の並び)に変換
- 分類ヘッド(Core ML)でその特徴ベクトルを16,827クラスに分類
特徴抽出器と分類ヘッドを分離しているため、分類ヘッドだけを差し替えれば別のクラス構成にも対応しやすい構成になっています。確信度上位3件を結果として表示します。
8bit量子化による軽量化
特徴抽出器は元々211MBありましたが、モデル変換ツール(coremltools)の8bit重み量子化(モデル内の数値を32bitや16bitではなく8bitで表現し直し、サイズを縮める処理)により52MBまで圧縮しました。精度への影響を抑えながらアプリサイズを大幅に削減できています。分類ヘッド側にも同様の8bit量子化を適用しています。
16,827クラスという大規模な分類ヘッドをそのままアプリに同梱するとサイズが問題になるため、量子化は必須の工程でした。
顕著性検出によるトリミング補助
花・植物の認識精度は、対象物が画像内でどれだけ大きく写っているかに強く依存します。背景が多いと余計な情報がノイズになり、誤判定につながります。
そこで、撮影・選択した画像から花の部分だけを自由な矩形で切り出せるトリミング機能を用意しました。トリミング画面を表示した直後、Visionの顕著性検出機能(画像のどこに視線が集まりやすいかをAIが推定する機能)を非同期で走らせ、検出に成功すれば初期のトリミング範囲を花の位置に自動で合わせます。検出できない場合は画像周囲15%を切り取った範囲を初期値にします。
自動トリミングはあくまで初期値で、その後手動での調整も可能にしています。全自動にしすぎず、モデルが外した場合にユーザー側で補正できる余地を残すことを重視しました。
属名を必ず表示する理由
認識結果の表示名は、種名だけを単独で出すのではなく、「属の通称+種の通称」(例:「マーガレット属フランスギク」「エリカ属〜」)を組み立てて表示するようにしています。16,827種という規模になると、種としての標準和名が存在しても大半のユーザーにとって聞き慣れない名前になってしまい、それだけでは「見た目としてどんな仲間の花なのか」が伝わりません。属の通称を必ず前に付けることで、学術的な種名だけでは伝わらない「仲間としての見た目」をユーザーに伝えられるようにしています。
なお、見た目がマーガレット(Argyranthemum frutescens)にそっくりな近縁属(Argyranthemum, Leucanthemum, Leucanthemopsis, Arctanthemum, Coleostephus)は、ユーザーにとって学術的な区別が重要でないため、属の通称自体を「マーガレット」に丸めています。一方で見た目が異なる種を含むTanacetum属(タンジーやフィーバーフューなど)はこの丸め込みの対象外にしています。「似ているものは一緒に、違うものは分ける」という見た目基準の線引きです。
種の日本語名が対応表にない場合は「マーガレット属」のように属名のみを表示し、属名も対応表にない場合のみ英語の学名を表示します。
日本語名対応表をJSONで持つ理由
学名ラベルから日本語花名への対応表は16,827種全件をカバーし、属レベルの通称は種の対応表とは別ファイルで管理しています。標準和名がある種はそれを、ない種はカタカナ表記を採用しました。
この対応表はSwiftソースに直接埋め込むのではなく、JSONリソースとしてアプリに同梱し、初回アクセス時に読み込む方式にしています。1万6千件を超える辞書リテラルをSwiftコードに直接書くと、コンパイル時にメモリを大量消費し、ビルドが極端に遅くなる(あるいは失敗する)ためです。JSON化することで、ビルド時間への影響を避けつつ、大規模な対応表を無理なく持てるようにしています。
苦労した点
分類対象が16,827種と多いため、似た種同士での誤判定は避けられません。認識結果ごとに虫眼鏡アイコンから学名でGoogle検索できるようにしたのは、モデルの限界を割り切った上で「候補を絞り込むための入口」として使ってもらう狙いです。完全な正解を返すツールというより、調べ物の起点として使えるアプリを目指しました。
オンデバイス推論・トリミング補助・軽量化のどれも地味な積み重ねですが、電波のない野外でもその場で花の名前にたどり着けるようになったときは手応えがありました。画像認識モデルを組み込んだアプリ開発の参考になれば幸いです。