iOSアプリに画像解析機能を組み込む場合、多くは「OCRを実行する」「画像分類を行う」といった単一の処理を前提に設計します。しかし実際の入力画像は多様であり、文字情報が中心の画像と、物体や風景が主役の画像とでは適切な解析方法が異なります。
そこで今回は、Vision フレームワークを利用し、画像の内容を簡易的に推定した上で処理を切り替えるサンプルアプリを実装しました。文字が多い場合は高精度OCRを実行し、そうでない場合は物体認識を行う構成です。実装過程で発生した Vision のローカライズに関する問題とその対応についてもあわせて整理します。
開発環境は Xcode 26.2、Swift、iOS 16 以上です。
全体構成
解析処理は ViewController に直接書かず、責務ごとに分離しました。
- ImageAnalyzer:処理全体の制御
- TextDetector:文字量の判定用OCR
- TextRecognizer:高精度OCR
- ImageClassifier:物体認識
ViewController では画像選択後に ImageAnalyzer を呼び出すだけの構成にしています。
文字量をもとに画像の性質を判定する
まず軽量な OCR を実行し、文字がどれくらい含まれているかを推定します。TextDetector.swiftでは以下のように実装しています。

「.fast」モードで素早く文字領域を検出し、総文字数を指標に画像の性質を判断します。
OCR処理(精度優先)
文字が多いと判断された場合は、改めて高精度OCRを実行します。

ここで重要なのがrecognitionLanguagesの指定です。
初期実装では英語のみ正しく認識され、日本語テキストがほぼ取得できないという現象が発生しました。Vision は自動的にすべての言語を認識してくれるわけではありません。日本語環境で使用する場合は”ja-JP”を明示的に指定する必要があります。
物体認識処理
文字が少ない場合は画像分類を実行します。

VNClassificationObservation.identifierは英語固定です。システムロケールが日本語でも自動翻訳はされません。
処理の分岐制御
ImageAnalyzer.swiftでは、上記処理を統合しています。

バックグラウンドで解析を実行し、UI更新のみをメインスレッドへ戻す構成としています。これを怠るとUIがフリーズするため注意が必要です。
動作確認
まず、リンゴの写真を選択して解析を実行します。

画像選択後、アプリは文字量を判定し、文字が少ないと判断されたため、物体認識処理へ分岐します。画面下部には「物体認識結果」という見出しとともに、推定されたラベルと信頼度(confidence)が表示されます。
VNClassificationObservation.identifierは英語固定で出力されます。システムロケールが日本語であっても、自動的に翻訳されたラベルが返ることはありません。今回のサンプルアプリでは、そのまま英語ラベルを表示する構成としています。
もし日本語での表示が必要な場合は、いくつかの方法が考えられます。例えば、アプリ側で英語ラベルと日本語表示名の対応表を持ち、表示前に変換する方法があります。また、サーバー側で翻訳APIを利用して動的にローカライズする構成も考えられます。
次に、文字を多く含む画像を選択します。

画面下部には「OCR結果」として、抽出されたテキストが改行付きで表示されます。日本語を含む画像についても、recognitionLanguagesに”ja-JP”を指定しているため、正しく文字列が取得できることを確認しました。
一方で、文字列を自動改行させたくない場合は、区切り文字を空文字列に変更することで、連続したテキストとして表示することも可能です。

同一のUIから入力された画像であっても、その内容に応じて解析処理が切り替わり、結果表示も動的に変化することが確認できます。
おわりに
今回は Vision を利用して画像内の文字量を手がかりに解析方法を切り替える実装を紹介しました。画像認識のAPIを単独で使うのではなく、その結果をさらにアプリの制御ロジックへ活用することで、入力に応じて振る舞いが変わる柔軟な構成を実現できます。
Vision は比較的少ないコードで導入できる一方で、設計次第で応用範囲が大きく広がるフレームワークでもあります。本記事が実装検討の一例となれば幸いです。








