StoreKit 2でのサブスクリプション更新処理が一段落したところで、次はカメラで撮影した写真から物体を判別する機能を作りたくなり、Core MLとVisionフレームワークに挑戦しました。
1. 自分でモデルを作らないといけないと思い込んでいた
最初、画像認識をするには自分で機械学習モデルを一から学習させる必要があると思い込み、そのハードルの高さに二の足を踏んでいました。
実際に使えたもの:
Appleが配布している学習済みモデル(MobileNetV2など)
実際にはApple Developerサイトで配布されている学習済みのCore MLモデルをそのままXcodeプロジェクトに追加するだけで、一般的な物体認識であればすぐに使い始められることが分かりました。自分でモデルを訓練する知識がなくても、既存のモデルを組み込むだけで十分実用的な機能が作れると気づくまでに時間をかけすぎました。
2. 認識結果の信頼度を確認せずに使っていた
モデルから返ってくる認識結果をそのまま画面に表示していたところ、明らかに違うものを自信満々に表示してしまう場面がありました。
let results = request.results as? [VNClassificationObservation]
let topResult = results?.first
VNClassificationObservationにはconfidenceという信頼度の値が含まれており、これを確認せずに一番上の結果を採用していたことが原因でした。信頼度が低い場合は「認識できませんでした」という表示に切り替えるよう改修し、精度の低い結果をそのまま見せてしまう問題を解消しました。
3. カメラの向きでVisionの座標系が崩れた
物体の位置を画面上に枠で表示する機能を作っていたところ、デバイスを横向きにした際に枠の位置がずれてしまう不具合が発生しました。
発生した問題:
縦向きでは正しいが横向きにすると枠の座標がずれる
Visionフレームワークの座標系は画像の向きを前提にした処理になっており、imageOrientationをデバイスの向きに合わせて正しく渡していなかったことが原因でした。カメラアプリでは向きの扱いが想像以上に複雑だと実感しました。
4. 毎フレーム処理してアプリが重くなった
リアルタイムでカメラ映像を認識させようとして、取得できるフレームすべてに対して認識処理を実行したところ、アプリの動作が目に見えて重くなってしまいました。
一定間隔でフレームを間引いて処理する仕組みに変更し、認識処理中は次のフレームの処理を開始しないよう制御を入れることで解決しました。リアルタイム性と処理負荷は常にトレードオフの関係にあり、用途に応じて間引き具合を調整する必要があると学びました。
まとめ
- 学習済みモデルを組み込むだけでも実用的な画像認識機能は作れる。自分でモデルを訓練する必要は必ずしもない
- 認識結果は信頼度(confidence)を必ず確認し、低い場合の表示を用意する
- カメラ映像を扱う際は画像の向き(imageOrientation)をデバイスの向きに合わせて正しく渡す
- リアルタイム認識ではフレームを間引くなど、処理負荷とのバランスを取る工夫が必要
一度動いてしまえば魔法のように感じる機能ですが、精度と負荷のバランスを取るまでに地味な調整が多い実装でした。
次は、WeatherKitで天気情報を取得してみて分かったことをまとめます。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント