【iOS】Live Textを活用した画像解析
本記事はTimee Product Advent Calendar 2024の25日目の記事です。
本記事では、Live Textを使用した画像解析について解説します。近年のサービスでは、サービスの利用を開始する前に、個人情報を求められるシーンが多くあります。タイミーにおいても、サービスを安全に利用していただくために、本人確認書類の提出と個人情報の登録をお願いしています。ご登録いただいた情報とご提出いただいた書類の内容が、完全に一致していることを確認できてからサービスの利用が開始できるようになっているので、なりすましやアカウントの偽造を行うことができないようになっています。しかし、個人情報を登録する作業量は、ユーザーにとって負担となっており、誤った個人情報を登録してしまうリスクもあります。
本記事では、そのような問題を解決するために、Live Textを活用した画像解析を行う方法の解説に加えて、画像解析を応用して個人情報を登録する負担を減らす方法について解説します。
Live Textとは
Live Textとは、画像を解析し、画像内の文字をテキストとして抽出することができる機能です。Live TextはWWDC22で発表され、ディベロッパ向けにLive Text APIが用意されています。
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
が返されます。ImageAnalysis
はImageAnalyzer
オブジェクトによって生成される解析結果を保持するクラスです。ImageAnalysisInteraction
オブジェクトのanalysis
プロパティに代入することで
、ImageAnalysisInteraction
オブジェクトが追加されたUIImageView
オブジェクトを介して画像の解析結果を操作することができます。ImageAnalysisInteraction
オブジェクトのpreferredInteractionTypes
プロパティに.textSelection
を代入することで、画像内に表示されている文字列を選択することができるようになります。
以下は一連の処理を行っているソースコードです。
実行結果
画像を解析してテキストを抽出することができており、テキストが表示されている箇所をロングタップすると、テキストの選択を行うことができています。また、住所や地名を表すテキストをロングタップすると、住所や地名に対応するマップを開くこともできます。
画像内から住所を抽出する
Live Text APIを使用して、画像内から住所を抽出します。
例えば、下記画像を解析してみます。
analyze(_:configuration:)
メソッド実行後に返されるImageAnalysis
オブジェクトのtranscript
プロパティには、抽出した文字列が格納されています。上記画像を解析した結果を表すImageAnalysis
オブジェクトのtranscript
プロパティには、以下のような文字列が格納されてます。
所在地
東京本社
Т 105-7135
東京都港区東新橋1-5-2
汐留シティセンター35階
Google 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は非常に扱いやすく、最小実装ならば数十行のコードで画像内のテキストを抽出することができます。本記事では、住所入力の自動化といったトピックで解説しましたが、日記アプリやメモアプリにも応用できる機能です。ぜひ、ご自身のアプリに応用できる箇所がないか検討してみてください!
参考資料
Discussion