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

What's new in Vision

元の動画を見る

ハイライト

Vision は Apple のコンピュータビジョン框架で、顔検出、画像分類、輪郭検出などのアルゴリズムを提供します。すべてのアルゴリズムが統一された API パターンを共有し、1 つ覚えれば全体の使い方がわかります。

主要内容

Vision の価値は統一性にあります。開発者は文字認識、バーコード検出、顔検出、光流推定ごとにまったく異なる呼び出し方を学ぶ必要がありません。各能力は request で公開され、handler が実行し、結果は observation として返ります。

この Session は既存の 3 種類の request を更新します。文字認識、バーコード検出、光流推定です。既存框架を継続し、新しい revision で能力をアップグレードします。revision の意味は実用的です。同じ request タイプでも、呼び出しモデルを安定させたまま新言語、新 ML モデル、より高い精度、新しい出力制御を得られます。

この Session では整理も 2 つ行います。第一に、Vision は古い face detection と face landmarks revision 1 を新しい検出器にマッピングし、旧コードを動かし続けます。第二に、Xcode の Quick Look Preview で VNObservation を入力画像に直接重ねられ、デバッグ用の可視化ツールを自前で書く必要が減ります。

詳細

1. 文字認識 revision 3:新言語と自動言語検出(01:57

VNRecognizeTextRequestRevision3 は Vision 文字認識の第 3 revision で、Live Text の背後にあるテキスト認識器です。Session ではこの revision で韓国語と日本語が追加されたと明記しています。supportedRecognitionLanguages でサポート言語を照会できます。

もう一つの変化は自動言語認識です。以前は App が撮影言語を事前に知り、recognitionLanguages に書くことが多かったです。今は accurate recognition mode で automaticallyDetectsLanguagetrue にし、Vision に言語判定を任せられます。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNRecognizeTextRequest()
request.revision = VNRecognizeTextRequestRevision3
request.recognitionLevel = .accurate
request.automaticallyDetectsLanguage = true

キーポイント:

  • VNRecognizeTextRequest() で文字認識 request を作成します。
  • request.revision = VNRecognizeTextRequestRevision3 で第 3 版認識モデルを明示選択します。
  • request.recognitionLevel = .accurate は Session の accurate recognition mode 制限に対応します。
  • request.automaticallyDetectsLanguage = true で Vision がテキスト言語を自動認識します。

自動言語検出は「ユーザーがどの言語を撮るかわからない」場面向けです。Session は制約も示します。言語検出は時々誤判定します。目標言語が既知なら recognitionLanguages を設定し、自動検出はオフにした方がよいです。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNRecognizeTextRequest()
request.revision = VNRecognizeTextRequestRevision3
request.recognitionLevel = .accurate
request.recognitionLanguages = ["ja-JP", "ko-KR"]
request.automaticallyDetectsLanguage = false

キーポイント:

  • recognitionLanguages は Vision へ明示的な言語ヒントを与えます。
  • "ja-JP""ko-KR" は Session で示された新しい日本語・韓国語能力に対応します。
  • automaticallyDetectsLanguage = false は既知言語シーンでの余分な判定を避けます。

2. バーコード検出 revision 3:複数コードを一度に検出(03:34

VNDetectBarcodesRequestRevision3 はバーコード検出を現代の ML モデルに切り替えます。Session は 4 つの結果を強調します。複数コード画像の検出が速い、より多くのコードを認識、重複検出が少ない、境界ボックスがより完全。

カメラスキャン系 App に重要です。旧方式は複数コード画像で逐次処理したり、線形コードの境界が不完全なことがありました。revision 3 は複数コードを一度に処理します。EAN-13 のような線形コードでは、以前は線 1 本だけのこともありましたが、今は完全に見えるコード全体を囲む境界ボックスになります。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNDetectBarcodesRequest()
request.revision = VNDetectBarcodesRequestRevision3
let supported = request.supportedSymbologies

キーポイント:

  • VNDetectBarcodesRequest() でバーコード検出 request を作成します。
  • request.revision = VNDetectBarcodesRequestRevision3 で第 3 版 ML モデルを使用します。
  • supportedSymbologies で Vision が現在サポートするコード体系を照会します。

Session は文字認識 revision 3 とバーコード検出 revision 3 が VisionKit Data Scanner API の技術基盤であるとも説明します。Data Scanner は App に直接入れられるカメラスキャン UI で、カメラストリームを設定し文字とバーコード結果を返します。

3. 光流 revision 2:ML で動画内の局所運動を推定(05:19

VNGenerateOpticalFlowRequestRevision2 も現代の ML モデルに切り替えます。光流は時間順に並んだ 2 枚の画像、通常は動画の連続フレームを分析します。結果は第 1 フレームの内容が第 2 フレームに対応するにはどの方向にどれだけ動くかを記述します。

Vision は VNPixelBufferObservation を返します。画像全体の運動場で、2 チャンネル画像です。1 チャンネルが X 方向変位、もう 1 つが Y 方向変位。合わせて各ピクセル位置の 2 次元運動ベクトルになります。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNGenerateOpticalFlowRequest()
request.revision = VNGenerateOpticalFlowRequestRevision2

// Run the request with two chronological video frames.
// Read the VNPixelBufferObservation result as a two-channel flow image.

キーポイント:

  • VNGenerateOpticalFlowRequest() で光流 request を作成します。
  • request.revision = VNGenerateOpticalFlowRequestRevision2 で第 2 版 ML 光流モデルを使用します。
  • 入力は時間順の 2 フレームであるべきです。
  • 出力 VNPixelBufferObservation は各位置の X/Y 運動成分を保持します。

Session は海辺を走る犬で差をデモします。revision 2 は水筒の動きをより正確に捉え、尻尾や耳の動きも表現し、背景ノイズが少なく「背景が動かない」実情に近づきます。

この結果は 3 シーンに適します。第一、防犯動画で背景から外れた運動を特定。Session は光流が固定カメラ、多くの防犯カメラに最適と明記します。第二、Vision object tracker 開始前に追跡すべき運動領域を光流で見つける。第三、動画補間や動作分析など自前の動画処理へ光流結果を渡す。

4. 光流出力解像度:デフォルトはアップサンプル、ネットワーク生出力も可(09:10

revision 1 は常に入力と同解像度の光流場を返しました。revision 2 もデフォルトで同じ動作ですが、底层 ML モデルの生出力解像度は低いです。後方互換のため Vision は bilinear upsampling でネットワーク出力を入力画像解像度に拡大します。

選択が生じます。旧光流を使っている、またはフル解像度が必要ならデフォルトのアップサンプルを受け入れられます。tracker 初期化だけ、または自前でアップサンプルするなら keepNetworkOutput でモデル生出力を直接使えます。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNGenerateOpticalFlowRequest()
request.revision = VNGenerateOpticalFlowRequestRevision2
request.keepNetworkOutput = true
request.computationAccuracy = .medium

キーポイント:

  • keepNetworkOutput = true は Vision デフォルトのアップサンプルをスキップし、ネットワーク生出力を返します。
  • computationAccuracy は利用可能な出力解像度を選択します。
  • Session は observation 内 pixel buffer の幅高を常に確認することを推奨します。
  • ネットワーク出力と原図のアスペクト比が異なる場合、原図へのマッピングで解像度とアスペクト対応を処理する必要があります。

デフォルト動作では Vision は低解像度運動場を入力サイズに伸ばします。既存コードへの統合は容易ですが、メモリと遅延が増えます。ネットワーク生出力は軽量ですが、座標対応は開発者が処理します。

5. face detection と face landmarks の revision 1 整理(11:44

Vision 最初のリリースから face detection と face landmarks がありました。5 年後、Apple にはより効率的で正確な revision 2 と revision 3 があります。この版では底层 revision 1 検出器を削除しますが、revision 1 を指定するコードのサポートは継続します。

方法は、revision 1 request を revision 2 検出器が満たしつつ revision 1 の外部動作を保持することです。Session は 2 つの互換点を挙げます。revision 2 は逆さ顔も検出しますが revision 1 request 満たし時は返しません。revision 2 landmark detector も revision 1 landmark constellation に合う結果を返します。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNDetectFaceLandmarksRequest()
request.revision = VNDetectFaceLandmarksRequestRevision3

キーポイント:

  • 既存 revision 1 コードは動き続け、この整理のために即座にコード変更は不要です。
  • 新コードはデフォルトに頼らず revision を明示指定すべきです。
  • Session はこれらの request に revision 3 を推奨し、精度と性能が向上します。

6. Quick Look Preview:デバッグ時に observation オーバーレイを直接見る(14:34

Vision の結果は座標、境界ボックス、landmark 点群、pixel buffer であることが多く、console 出力だけでは正しい対象に乗っているか判断しにくいです。Xcode Quick Look Preview が Vision observation をサポートするようになりました。デバッグ時に VNObservation にマウスを置き、プレビューアイコンをクリックすると入力画像上にオーバーレイが見えます。

Session デモは face landmarks を使います。3 枚の顔を検出したあと、Quick Look で各 observation の顔枠と landmark constellation を個別表示でき、「最初の observation がどの顔か」を直接確認できます。

概念例:

// Conceptual Swift based on the session transcript.
let request = VNDetectFaceLandmarksRequest()
let handler = makeImageRequestHandler(for: image)
try handler.perform([request])
let results = request.results

// Keep `handler` in scope while inspecting `results` with Quick Look Preview.

キーポイント:

  • VNDetectFaceLandmarksRequest() はデモの顔 landmark request を表します。
  • handler.perform([request]) で Vision request を実行します。
  • request.results はデバッガで閲覧可能な observation を保持します。
  • image request handler はスコープ内に残す必要があり、Quick Look が observation を元入力画像に重ねられます。

image request handler がスコープ外だと、Quick Look はオーバーレイは描けますが元画像は表示できません。入力画像は handler に保存されているためです。Playground で Vision パラメータを素早く試すときのデバッグ規約に書いておく価値があります。

Session はバーコード Playground で revision 2 と revision 3 の差もデモします。revision 2 は 1 コードを見逃し、別を重複検出し、線 1 本を返しました。revision 3 では 2 コードとも検出され完全な境界ボックスが表示されます。Quick Look の価値は、追加描画ツールなしでモデル出力差を直接見られることです。

重要ポイント

  • やること:レシート、メニュー、商品ラベル向けの多言語 OCR を作る。 価値がある理由VNRecognizeTextRequestRevision3 は日本語、韓国語、自動言語検出を追加し、ユーザー言語が予測できない撮影シーンに適しています。 始め方supportedRecognitionLanguages でサポート確認。既知言語なら recognitionLanguages を設定。未知なら accurate モードで automaticallyDetectsLanguage をオン。

  • やること:複数 QR/バーコードを一度にスキャンする在庫ツールを作る。 価値がある理由VNDetectBarcodesRequestRevision3 は複数コードを一度に検出し、重複が少なく線形コード境界がより完全です。 始め方:バーコード request revision を VNDetectBarcodesRequestRevision3 に固定し、supportedSymbologies で必要なコード体系に限定する。

  • やること:固定カメラ動画に運動領域ヒントを追加する。 価値がある理由VNGenerateOpticalFlowRequestRevision2 は局所運動と静止背景をより区別でき、Session は防犯カメラを主用途と明記しています。 始め方:時間順に 2 フレームを取り光流 request を実行し、VNPixelBufferObservation の X/Y 運動成分を読み、運動強度をヒートマップにマッピングする。

  • やること:動画オブジェクト追跡前に tracker 初期位置を自動選択する。 価値がある理由:Session は光流が object tracker の開始位置決定に役立つと指摘しています。 始め方:光流で連続フレームの最も運動が顕著な領域を見つけ、その領域を tracker 初期化候補にする。

  • やること:Vision デバッグ Playground を構築する。 価値がある理由:Quick Look Preview は入力画像上に observation を直接表示し、request ごとの描画関数が不要です。 始め方:image request handler のスコープを保持し、文字・バーコード・顔・landmark request を実行し、Xcode または Playground で observation を個別プレビューする。

関連セッション

コメント

GitHub Issues · utterances