ハイライト
VisionKit は iOS 17 と macOS Sonoma で Subject Lifting(主体抽出)と Visual Look Up(ビジュアル検索)の 2 つの中核機能を追加しました。DataScannerViewController には光学フロー追跡と通貨認識が加わり、macOS ネイティブ App は ImageAnalysisOverlayView で Live Text、Subject Lifting、Visual Look Up を統合できます。画像分析 API を既に使っている App では、ほとんどの機能がコード変更なしで自動的に有効になります。
主要内容
課題: 画像内の情報を直接活用しにくい
ユーザーが App 内で画像を見たとき、テキストを抽出したり、画像内の物体を識別したり、主体を切り出して共有したりしたいことがあります。従来は開発者が複雑なコンピュータビジョン モデルを統合し、シナリオごとのエッジケースを処理する必要がありました。
VisionKit は WWDC22 で Live Text と DataScanner を導入し、これらの問題にシステムレベルの解決策を提供しました。WWDC23 では 3 つの機能を拡張しました。
- Subject Lifting: 長押しで画像から主体を抽出。ステッカー作成にも対応
- Visual Look Up: ペット、植物、ランドマーク、芸術作品などを認識。食物、製品、標識・記号を新たに追加
- macOS ネイティブサポート: Catalyst とネイティブ macOS App の両方で VisionKit を利用可能
詳細
Subject Lifting は自動で利用可能(01:13)
VisionKit の画像分析 API を既に使っている場合、Subject Lifting は既に有効です。
import VisionKit
let analyzer = ImageAnalyzer()
let interaction = ImageAnalysisInteraction()
// 画像を解析
let configuration = ImageAnalyzer.Configuration([
.text,
.machineReadableCodes
])
let analysis = try? await analyzer.analyze(image, configuration: configuration)
interaction.analysis = analysis
imageView.addInteraction(interaction)
キーポイント:
- 既存コードの変更は不要—Subject Lifting は自動で有効になります
- 分析設定に特別なパラメータを追加する必要はありません
- Subject Lifting の分析は初期分析完了後に遅延実行され、電力を節約します
- iOS では画像表示から数秒後にトリガー、macOS では初回メニュー表示時にトリガーされます
インタラクションタイプの制御(02:38)
// Subject Lifting のみを有効化し、テキスト選択は含めない
interaction.preferredInteractionTypes = .imageSegmentation
// 複数のインタラクションタイプを組み合わせる
interaction.preferredInteractionTypes = [.imageSegmentation, .textSelection]
// iOS 16 の自動動作を維持(テキスト + QR コード、Subject Lifting は含まない)
interaction.preferredInteractionTypes = .automaticTextOnly
// デフォルト: すべての機能を含む
interaction.preferredInteractionTypes = .automatic
キーポイント:
.automaticはテキスト選択、Subject Lifting、データ検出などすべての機能を含みます.imageSegmentationは主体抽出のみを有効にします.automaticTextOnlyは iOS 16 の動作を維持し、Subject Lifting は含みません- 配列で複数のタイプを組み合わせられます
Visual Look Up(03:23)
Visual Look Up は以下のカテゴリを認識します。
- 既存カテゴリ: ペット、自然(植物/花)、ランドマーク、芸術作品、メディア
- iOS 17 新規: 食物、製品、標識と記号
Visual Look Up を有効にするには、分析設定に .visualLookUp を追加します。
let configuration = ImageAnalyzer.Configuration([
.text,
.visualLookUp
])
let analysis = try? await analyzer.analyze(image, configuration: configuration)
interaction.analysis = analysis
キーポイント:
- Visual Look Up の処理は 2 段階に分かれます
- 第 1 段階は完全にデバイス上で完了: 結果のバウンディングボックスを特定、トップレベルカテゴリ(猫、本、植物など)を判定、特徴を抽出
- 第 2 段階はユーザーのリクエスト時のみネットワーク接続: カテゴリと画像埋め込みをサーバーに送信して詳細情報を取得
- プライバシー保護: デバイスは特徴埋め込みのみを送信し、元画像は送信しません
Visual Look Up の 2 つのインタラクションモード(04:40)
モード 1: Subject Lifting との連動
抽出した主体に関連する Visual Look Up 結果が 1 つだけの場合、メニューに “Look Up” オプションが表示されます。VisionKit がこのインタラクションを自動処理します。
モード 2: モーダルバッジモード
// Visual Look Up を優先インタラクションタイプに設定
interaction.preferredInteractionTypes = .visualLookUp
キーポイント:
- 画像上にバッジで各ビジュアル検索結果をマークします
- バッジはビューポート外に出ると自動的にコーナーに移動します
- ユーザーがバッジをタップして Look Up 結果を表示します
- このモードは他のインタラクションタイプを上書きします(テキスト選択は同時にできません)
- 通常はボタンと組み合わせて、このモードへの入退出をユーザーに制御させます
DataScannerViewController の強化(06:03)
光学フロー追跡: リアルタイムカメラ内のテキストハイライトをより安定させます。
let scanner = DataScannerViewController(
recognizedDataTypes: [.text()],
qualityLevel: .balanced,
recognizesMultipleItems: true,
isHighFrameRateTrackingEnabled: true // デフォルトで有効
)
キーポイント:
- 光学フロー追跡は自動で有効—追加コード不要
- テキスト認識時のみ利用可能。QR コードには非対応
- 具体的なテキストコンテンツタイプを指定しない必要があります
highFrameRateTrackingはデフォルトでオンです
通貨認識:
let scanner = DataScannerViewController(
recognizedDataTypes: [
.text(textContentType: .currency)
]
)
// 認識結果を処理
for await item in scanner.recognizedItems {
if case .text(let text) = item {
let transcript = text.transcript // 例: "$12.99"
// transcript には通貨記号と金額が含まれる
}
}
キーポイント:
textContentType: .currencyで通貨認識を有効化- 認識結果には通貨記号と金額テキストが含まれます
- 現在のロケールと組み合わせて具体的な通貨値を解析できます
Live Text の強化(08:27)
新言語サポート: タイ語とベトナム語。
テーブル検出: Live Text が画像内のテーブル構造の検出と抽出に対応しました。
// ユーザーが表領域を選択してコピー
// Numbers や Notes に貼り付けると、表構造が自動的に保持される
// セル結合などの複雑な構造も含まれる
コンテキスト認識データ検出器:
ユーザーが画像から連絡先を追加するとき、システムが周辺の関連データ検出器情報(電話番号、住所など)を自動抽出し、連絡先カードに入力します。
新しいテキスト選択 API(10:04)
// 選択されたプレーンテキストを取得
let selectedText = interaction.selectedText
// 属性付きテキストを取得
let selectedAttributedText = interaction.selectedAttributedText
// 選択範囲を取得
let selectedRange = interaction.selectedRange
// 選択の変化を監視
func imageAnalysisInteraction(
_ interaction: ImageAnalysisInteraction,
didUpdateSelectionWithText selectedText: String?
) {
// UI を更新、たとえばカスタムメニュー項目の有効/無効を切り替える
}
キーポイント:
selectedTextはプレーンテキスト文字列を返しますselectedAttributedTextは書式付きのNSAttributedStringを返しますselectedRangeは分析テキスト内の範囲を返します- 新しいデリゲートメソッドが選択変更時にコールバックします
カスタムメニュー(10:31)
override func buildMenu(with builder: UIMenuBuilder) {
super.buildMenu(with: builder)
// 現在選択されているテキストを取得
guard let selectedText = interaction.selectedText,
!selectedText.isEmpty else { return }
// カスタムコマンドを作成
let createReminderAction = UIAction(title: "Create Reminder") { _ in
// 選択したテキストでリマインダーを作成
self.createReminder(with: selectedText)
}
// メニューを作成
let reminderMenu = UIMenu(title: "", children: [createReminderAction])
// システムメニューの後に挿入
builder.insertSibling(reminderMenu, afterMenu: .share)
}
キーポイント:
UIMenuBuilderAPI でカスタムメニュー項目を挿入します- 現在選択中のテキストに基づいてメニューを動的に作成できます
- カスタムメニューはシステムメニュー(コピー、共有など)と並んで表示されます
macOS Catalyst サポート(11:08)
Catalyst App は再コンパイルするだけで VisionKit サポートを取得できます。
- Live Text、Subject Lifting、Visual Look Up をサポート
- QR コードスキャンは非対応(Catalyst 上で
.machineReadableCodesは no-op) - 設定に
.machineReadableCodesを残しても安全で、エラーにはなりません
macOS ネイティブ API: ImageAnalysisOverlayView(12:14)
ネイティブ macOS App は ImageAnalysisOverlayView を使用します。
import VisionKit
// 画像を解析(iOS と同じ)
let analyzer = ImageAnalyzer()
let configuration = ImageAnalyzer.Configuration([.text, .visualLookUp])
let analysis = try? await analyzer.analyze(image, configuration: configuration)
// オーバーレイビューを作成
let overlayView = ImageAnalysisOverlayView()
overlayView.analysis = analysis
// ビュー階層に追加
imageView.addSubview(overlayView)
// NSImageView を使う場合、trackingImageView を設定して contentsRect を自動計算
overlayView.trackingImageView = imageView
// NSImageView を使わない場合、contentsRect を手動で提供
extension ViewController: ImageAnalysisOverlayViewDelegate {
func contentsRect(for overlayView: ImageAnalysisOverlayView) -> CGRect {
// overlayView 座標系における画像内容の位置を返す
return imageContentRect
}
}
キーポイント:
ImageAnalysisOverlayViewはNSViewのサブクラスです- 画像コンテンツの上にビュー階層に追加する必要があります
trackingImageViewプロパティがcontentsRectの計算を自動処理しますcontentsRectは単位座標系を使用します(原点は左上)
macOS コンテキストメニュー統合(15:13)
extension ViewController: ImageAnalysisOverlayViewDelegate {
func overlayView(
_ overlayView: ImageAnalysisOverlayView,
updatedMenu menu: NSMenu,
for event: NSEvent,
at point: CGPoint
) -> NSMenu {
// VisionKit メニュー項目を取得
let copySubjectItem = menu.item(withTag: ImageAnalysisOverlayView.MenuItemTag.copySubject.rawValue)
// 自分のメニューに追加
let myMenu = NSMenu()
myMenu.addItem(copySubjectItem!)
// またはメニュー項目のタイトルを変更
copySubjectItem?.title = "Copy Photo"
// またはカスタム項目を VisionKit メニューに挿入
let myItem = NSMenuItem(title: "My Custom Action", action: #selector(customAction), keyEquivalent: "")
if let recommendedIndex = menu.indexOfItem(withTag: ImageAnalysisOverlayView.MenuItemTag.recommendedAppItems.rawValue) {
menu.insertItem(myItem, at: recommendedIndex)
}
return menu
}
}
キーポイント:
updatedMenu:forEvent:atPoint:でコンテキストメニューを変更または置換できます- VisionKit メニュー項目は
MenuItemTagで識別されます recommendedAppItemsタグはカスタム項目の推奨挿入位置を示します- メニュー項目は毎回再作成されるため、プロパティの変更は安全です
- VisionKit がメニューハイライト時の主体抽出アニメーションを自動処理します
重要ポイント
-
アルバム App にワンタップ主体抽出共有を追加: 画像を表示する App では、
ImageAnalysisInteractionのpreferredInteractionTypesを.automaticに設定し、ユーザーが長押しで主体を抽出・共有できるようにします。価値がある理由: 主体抽出は iOS 17 の象徴的な機能で、ユーザーは既にこの操作に慣れています。対応すればシステムの Photos App と一貫した UX になります。始め方: 画像分析コードがあることを確認し、preferredInteractionTypesを.automaticTextOnlyから.automaticに変更します。 -
ショッピング App に Visual Look Up を統合: 商品画像で Visual Look Up を有効にし、ユーザーが製品を識別して詳細情報を取得できるようにします。価値がある理由: Visual Look Up は製品認識に対応し、画像から直接商品詳細を知れて検索ステップが減ります。始め方:
ImageAnalyzer.Configurationに.visualLookUpを追加し、ボタンと組み合わせてpreferredInteractionTypes = .visualLookUpでバッジモードに入ります。 -
家計簿 App にレシートスキャンを追加: DataScannerViewController の通貨認識でレシートの金額を自動抽出して集計します。価値がある理由: 手動入力は面倒でミスも起きやすい。DataScanner は通貨値をリアルタイム認識し、光学フロー追跡でハイライトが安定します。始め方:
DataScannerViewControllerを作成し、recognizedDataTypesを.text(textContentType: .currency)に設定、recognizedItemsストリームで金額を累積します。 -
macOS 画像エディタに Live Text を追加:
ImageAnalysisOverlayViewで macOS App が画像内テキストの選択・コピーに対応します。価値がある理由: macOS ユーザーは右クリックメニュー操作に慣れており、Live Text で OCR 前処理なしに画像内テキストを直接編集できます。始め方:ImageAnalysisOverlayViewを作成しimageViewのサブビューに設定、trackingImageViewを設定し、overlayView:updatedMenu:forEvent:atPoint:でメニューをカスタマイズします。
関連セッション
- Lift subjects from images in your app — Subject Lifting の Vision フレームワーク実装と高度な使い方
- Discover machine learning enhancements in Create ML — カスタム画像理解モデルのトレーニング。VisionKit と補完関係
- Detect animal poses in Vision — Vision の動物姿勢検出。VisionKit と組み合わせて使えます
コメント
GitHub Issues · utterances