💬

【iOS】Live Textを活用した画像解析

2024/12/25に公開

本記事はTimee Product Advent Calendar 2024の25日目の記事です。

本記事では、Live Textを使用した画像解析について解説します。近年のサービスでは、サービスの利用を開始する前に、個人情報を求められるシーンが多くあります。タイミーにおいても、サービスを安全に利用していただくために、本人確認書類の提出と個人情報の登録をお願いしています。ご登録いただいた情報とご提出いただいた書類の内容が、完全に一致していることを確認できてからサービスの利用が開始できるようになっているので、なりすましやアカウントの偽造を行うことができないようになっています。しかし、個人情報を登録する作業量は、ユーザーにとって負担となっており、誤った個人情報を登録してしまうリスクもあります。

本記事では、そのような問題を解決するために、Live Textを活用した画像解析を行う方法の解説に加えて、画像解析を応用して個人情報を登録する負担を減らす方法について解説します。

Live Textとは

Live Textとは、画像を解析し、画像内の文字をテキストとして抽出することができる機能です。Live TextはWWDC22で発表され、ディベロッパ向けにLive Text APIが用意されています。
https://developer.apple.com/jp/videos/play/wwdc2022/10026/

Live Text APIの概要

Live Text APIの主要なクラスは以下の四つです。

  • ImageAnalyzer
  • ImageAnalysis
  • ImageAnalysisInteraction
  • ImageAnalysisOverlayView

ImageAnalyzer オブジェクトに解析したい画像をフィードすると、ImageAnalyzer オブジェクト内でフィードされた画像の解析を行います。解析結果はImageAnalysis オブジェクトとして、ImageAnalysisOverlayView オブジェクトまたは、ImageAnalysisInteraction オブジェクトに提供されます。

実装

解析結果を操作するための設定

画像解析の結果を操作するための設定は、ImageAnalysisInteractionを使用します。ImageAnalysisInteraction は画像の解析結果を操作するインターフェイスを提供するクラスです。UIImageView オブジェクトが持つaddInteraction(_:) メソッドの第一引数に、ImageAnalysisInteraction オブジェクトを指定することで、UIImageView オブジェクトを介して画像の解析結果を操作することができるようになります。

解析対象の設定

解析対象の設定を行うには、ImageAnalyzer.Configurationを使用します。画像の解析を行う前に、解析対象の設定をImageAnalyzer.Configuration オブジェクトで定義します。ImageAnalyzer.Configuration オブジェクトはinit(_:) イニシャライザで取得することができます。

init(_ types: ImageAnalyzer.AnalysisTypes)

init(_:) イニシャライザの第一引数には、解析の対象を表すImageAnalyzer.AnalysisTypes オブジェクトの配列を指定します。.text はテキストの解析、.machineReadableCode はQRコードの解析を行う時に指定します。

画像の解析

ImageAnalyzer オブジェクトのanalyze(_:configuration:) メソッドで解析処理を開始します。

final func analyze( _ image: UIImage, configuration: ImageAnalyzer.Configuration ) async throws -> ImageAnalysis

analyze(_:configuration:) メソッドの第一引数には、解析対象の画像を表すUIImage オブジェクトを指定します。第二引数には前項で作成したImageAnalyzer.Configuration オブジェクトを指定します。
analyze(_:configuration:) メソッドを実行すると、ImageAnalysis が返されます。ImageAnalysisImageAnalyzer オブジェクトによって生成される解析結果を保持するクラスです。ImageAnalysisInteraction オブジェクトのanalysis プロパティに代入することで
ImageAnalysisInteraction オブジェクトが追加されたUIImageView オブジェクトを介して画像の解析結果を操作することができます。ImageAnalysisInteraction オブジェクトのpreferredInteractionTypes プロパティに.textSelection を代入することで、画像内に表示されている文字列を選択することができるようになります。

以下は一連の処理を行っているソースコードです。

実行結果


画像を解析してテキストを抽出することができており、テキストが表示されている箇所をロングタップすると、テキストの選択を行うことができています。また、住所や地名を表すテキストをロングタップすると、住所や地名に対応するマップを開くこともできます。

画像内から住所を抽出する

Live Text APIを使用して、画像内から住所を抽出します。
例えば、下記画像を解析してみます。

analyze(_:configuration:) メソッド実行後に返されるImageAnalysis オブジェクトのtranscriptプロパティには、抽出した文字列が格納されています。上記画像を解析した結果を表すImageAnalysis オブジェクトのtranscriptプロパティには、以下のような文字列が格納されてます。

所在地
東京本社
Т 105-7135
東京都港区東新橋1-5-2
汐留シティセンター35Google map o

文字列の中に、「所在地」、「Google map o」といった、住所以外の文字列が含まれているので、これらを除外する必要があります。文字列の中から住所を抽出するには、NSDataDetector を使用します。NSDataDetector は、文字列内で特定のパターン(URL、住所など)を検出することができる機能を持つクラスです。NSDataDetector オブジェクトはinit(types:) イニシャライザで取得することができます。

init(types checkingTypes: NSTextCheckingTypes) throws

types 引数にはNSTextCheckingResult.CheckingType オブジェクトを指定します。NSTextCheckingResult.CheckingType は抽出したい情報のタイプを表し、住所情報を抽出したい時は、NSTextCheckingResult.CheckingType.address.rawValue を指定します。

住所の抽出は、NSDataDetector オブジェクトのmatches(in:options:range:) メソッドを使用します。in 引数には抽出対象の文字列を、options 引数には文字列を抽出する方法のオプション、range 引数には抽出対象の範囲を指定します。

matches(in:options:range:) メソッドを実行すると、[NSTextCheckingResult] オブジェクトが返されます。[NSTextCheckingResult] オブジェクトには、文字列の解析結果が格納されています。

NSTextCheckingResult オブジェクトのaddressComponents プロパティは[NSTextCheckingKey : String] 型で、住所情報がキーと値のペアで格納されています。

以下は文字列の中から住所情報を抽出する関数です。

実行結果

画像を解析し、「郵便番号」、「都道府県」、「市区町村」、「町・番地・建物名」と個別に文字列で抽出できていることがわかります。例えば、この機能をタイミーアプリに応用すると、本人確認書類を撮影又は写真アルバムから選択した時に、画像内を解析して住所情報を自動で入力させることができます。

おわりに

本記事では、Live Textを活用した画像解析を行う方法に加えて、画像解析を応用して個人情報を登録する負担を減らす方法について解説しました。Live Text APIは非常に扱いやすく、最小実装ならば数十行のコードで画像内のテキストを抽出することができます。本記事では、住所入力の自動化といったトピックで解説しましたが、日記アプリやメモアプリにも応用できる機能です。ぜひ、ご自身のアプリに応用できる箇所がないか検討してみてください!

参考資料

https://developer.apple.com/documentation/visionkit

Discussion