WWDC Quick Look 💓 By SwiftGGTeam
What's new in VisionKit

What's new in VisionKit

元の動画を見る

ハイライト

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 つの機能を拡張しました。

  1. Subject Lifting: 長押しで画像から主体を抽出。ステッカー作成にも対応
  2. Visual Look Up: ペット、植物、ランドマーク、芸術作品などを認識。食物、製品、標識・記号を新たに追加
  3. 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)
}

キーポイント:

  • UIMenuBuilder API でカスタムメニュー項目を挿入します
  • 現在選択中のテキストに基づいてメニューを動的に作成できます
  • カスタムメニューはシステムメニュー(コピー、共有など)と並んで表示されます

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
    }
}

キーポイント:

  • ImageAnalysisOverlayViewNSView のサブクラスです
  • 画像コンテンツの上にビュー階層に追加する必要があります
  • 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 がメニューハイライト時の主体抽出アニメーションを自動処理します

重要ポイント

  1. アルバム App にワンタップ主体抽出共有を追加: 画像を表示する App では、ImageAnalysisInteractionpreferredInteractionTypes.automatic に設定し、ユーザーが長押しで主体を抽出・共有できるようにします。価値がある理由: 主体抽出は iOS 17 の象徴的な機能で、ユーザーは既にこの操作に慣れています。対応すればシステムの Photos App と一貫した UX になります。始め方: 画像分析コードがあることを確認し、preferredInteractionTypes.automaticTextOnly から .automatic に変更します。

  2. ショッピング App に Visual Look Up を統合: 商品画像で Visual Look Up を有効にし、ユーザーが製品を識別して詳細情報を取得できるようにします。価値がある理由: Visual Look Up は製品認識に対応し、画像から直接商品詳細を知れて検索ステップが減ります。始め方: ImageAnalyzer.Configuration.visualLookUp を追加し、ボタンと組み合わせて preferredInteractionTypes = .visualLookUp でバッジモードに入ります。

  3. 家計簿 App にレシートスキャンを追加: DataScannerViewController の通貨認識でレシートの金額を自動抽出して集計します。価値がある理由: 手動入力は面倒でミスも起きやすい。DataScanner は通貨値をリアルタイム認識し、光学フロー追跡でハイライトが安定します。始め方: DataScannerViewController を作成し、recognizedDataTypes.text(textContentType: .currency) に設定、recognizedItems ストリームで金額を累積します。

  4. macOS 画像エディタに Live Text を追加: ImageAnalysisOverlayView で macOS App が画像内テキストの選択・コピーに対応します。価値がある理由: macOS ユーザーは右クリックメニュー操作に慣れており、Live Text で OCR 前処理なしに画像内テキストを直接編集できます。始め方: ImageAnalysisOverlayView を作成し imageView のサブビューに設定、trackingImageView を設定し、overlayView:updatedMenu:forEvent:atPoint: でメニューをカスタマイズします。


関連セッション

コメント

GitHub Issues · utterances