ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
VisionフレームワークにおけるSwiftの機能強化
並列処理など、新しいSwift機能を利用できるようにVision Framework APIが刷新され、さまざまなVisionアルゴリズムをより簡単に、より迅速にアプリに統合できるようになりました。新しくなったVision Framework APIの内容を確認し、さらにサンプルコードとベストプラクティスをご紹介します。最小限のコーディングでこのフレームワークのメリットを得る方法を学びましょう。2つの新しい機能(画像の審美的評価と全身のポーズ)のデモも行います。
関連する章
- 0:00 - Introduction
- 1:07 - New Vision API
- 1:47 - Get started with Vision
- 8:59 - Optimize with Swift Concurrency
- 11:05 - Update an existing Vision app
- 13:46 - What’s new in Vision?
リソース
関連ビデオ
WWDC23
-
ダウンロード
こんにちはVisionフレームワークチームの Megan Williamsです VisionはコンピュータビジョンAPIを 提供するフレームワークです デベロッパはこれを使って 素晴らしい アプリや体験を作り出すことができます Visionフレームワークを使ってできることを いくつかご紹介します Visionは顔のほか 目 鼻 口など 顔のランドマークを検出できます
Visionフレームワークは18の異なる言語の テキストを認識できます 韓国語 スウェーデン語 中国語などを含みます
健康とフィットネスのアプリでは Visionで身体のポーズや動きを記録できます
Visionには手のポーズを 記録する機能もあります これは画面に触れずに Appleのデバイスと インタラクションする まったく新しい方法です 今のはほんの一例です 世界中で何千ものデベロッパが Visionで素晴らしいアプリを 開発しています 今年はアプリにコンピュータビジョンを 取り入れるのがさらに簡単になります このたび 従来同様にパワフルな 新しいAPIが登場しました これはSwiftのために設計された 簡潔な構文を使用するものです また Swiftの並行処理と Swift 6を完全にサポートしており かつてなく高性能なアプリを記述できます このセッションでは 新しいSwift APIの使い方を説明します その後 Swiftの並列処理を使って アプリを最適化する方法を実演します 次に 新しいAPIを使えるよう 既存のVisionアプリケーションを アップデートする方法を説明します 最後に 今年のVisionの新機能を いくつかご紹介します では始めましょう Visionではすべてが リクエストから始まります Visionのリクエストは 画像について尋ねる質問だと考えてください 例えば「この画像で顔はどこにありますか?」 「このレシートの合計はいくらですか?」 「この画像の被写体は何ですか?」などです DetectFaceRectangleRequestは 顔を見つけるための質問 RecognizeTextRequestは テキストを理解するための質問 GenerateObjectnessBasedSaliency ImageRequestは 画像内の際立ったオブジェクトを 見つけるための質問です
さて いくつかの質問ができたので それに対する答えも必要ですね Visionは質問への答えを Observationsという形で提供します それは要求を実行することで生成されます
DetectFaceRectanglesRequestは FaceObservationsを生成し 顔の位置を教えてくれます RecognizedTextObservationでは テキストを理解できます SaliencyImageObservationは 画像の重要部分を強調します
これらはほんの一例です Visionには31種類のリクエストがあり それぞれが画像分析のタイプを表します リクエストが多すぎるため すべては取り上げませんが 私のお気に入りをいくつかご紹介します Visionには一般的なコンピュータビジョンの タスクへのリクエストとして 例えば画像識別や テキスト認識などがあります Visionは画像内の様々な オブジェクトを検出して認識できます バーコードや 人物 動物などです また 2Dおよび3Dで体勢を推定するための APIもあります Visionでは動く物体を検出し 複数の フレームにわたって追跡することもできます
リクエストとは何かがわかったところで コードで例を見てみましょう これから食料品店のアプリを作ります 食料品店の様々な商品を見て回るために バーコードをスキャンできるように したいと思います これにはDetectBarcodesRequestを使います
この画像のバーコードを スキャンしてみましょう まずはリクエストを作成します そのあと 画像についての リクエストを実行します
これでbarcodeObservationsが生成され 画像から検出されたバーコードごとに 1つの観測値が表示されます
リクエストは失敗する可能性があるので try文を追加する必要があります
もう1つ重要な点として 新しいAPIは非同期であり アプリはAPIの終了を待つ必要があります これだけです わずか3行のコードで バーコードを検出できます これは一例ですが Visionリクエストはすべて 同じ一般的な構造に従っています
バーコードを検出したあとは バーコードのペイロードから 製品情報を取得できます これを使ってバーコードをスキャンします 画像内のバーコードの位置も わかりやすくしたいので ユーザーのために強調表示しましょう バーコードの位置は .boundingBoxプロパティで取得できます Visionの観測値の座標は 画像に対して正規化されていることに 注意してください
Visionのシステムでは 座標は0と1の間で正規化され 原点は左下隅になります よく使われるSwiftUIのような フレームワークでは 原点が左上隅なので それとは異なるかもしれません でもご心配なく今年提供を開始した新しいAPIでは 異なる座標系間の変換が 行いやすくなっています Visionの正規化座標から 元の画像の座標に戻すには toImageCoordinates()を呼び出して 画像のサイズを渡します また 座標の原点を画像の左上隅にするか 左下隅にするかも指定できます ここではupperLeftを使います
これで左上隅を原点とする 元の座標空間での バウンディングボックスが 画像として得られます これでオリジナル画像内の バーコードの位置を把握して ユーザーのために強調表示できます
これでバーコードをスキャンできる アプリができたので 何か所か最適化して アプリをさらに改善しましょう 多くのリクエストには パフォーマンス向上のために 微調整できるプロパティがあります DetectBarcodesRequest()は デフォルトで様々な種類の バーコードをスキャンします これは食料品店のアプリなので 食料品店によくあるバーコードだけを スキャンするようにしたいと思います
リクエストのsymbologiesプロパティを .ean13のスキャンだけに設定します これはすべての種類の バーコードをスキャンするよりも効率的で アプリのパフォーマンスが向上するでしょう
さて 基本的なAPIの使い方を説明したので 食料品店アプリの より高度なユースケースを 見てみたいと思います バーコードは画像からスキャンできますが 商品にバーコードがない場合は どうしたらいいでしょうか 代わりにラベルのテキストで 商品を識別することにします 2回目のリクエストを実行する 必要があるので この場合は RecognizeTextRequest()を 使うことにします
先ほどと同じようにリクエストを作成します
リクエストは1つずつ 実行することもできますが Visionでは最適なパフォーマンスのため まとめて実行するよう推奨されています そのためには ImageRequestHandlerが 必要です
ImageRequestHandlerは 画像の入れ物だと考えてください ハンドラを使って リクエストを実行します ハンドラはリクエストごとに 1つの結果を返します
これで画像内のバーコードをスキャンし 同時にテキストラベルを 識別できるようになりました
注目すべき点は このperformコールは パラメータパック構文を使っていて 任意の数のリクエストを実行できることです もうひとつ言及しておきたいのは この方法を利用する場合 すべてのリクエストが終了するまで待たないと 結果を使用できないということです
それで問題ないアプリもありますが この食料品店アプリでは DetectBarcodesRequestが バーコードを検出した場合 RecognizeTextRequestが完了するのを 待たずに バーコードをスキャンしたいです VisionはperformAllと呼ばれる 代替APIを提供しているので 複数のリクエストをまとめて実行し 各リクエストが終了すると同時に その結果を処理することができます performAllは結果を ストリームとして返します つまりリクエストが完了すると ほかのリクエストがまだ実行中でも 結果はただちに返されます
観測情報にアクセスするには ストリームからの結果を待ちます
そうすることで バーコードの観測値は 利用可能になり次第 すぐに使用することができ RecognizeTextRequestの終了を 待つ必要はありません
さて 基本を理解できたところで Swift並行処理を使って Vision APIを最適化する方法を説明します アプリでは複数の画像を 処理しなければならないことが多々あります そうした画像はforループで 一度に1枚ずつ処理できます ただし最高のパフォーマンスを得るには 並行処理を使用します
それにより 画像をまとめて撮影し 同時に処理することができます
例えばたくさんの画像が集められた フォトライブラリを考えてみましょう 画像をグリッドビューで 表示したいのですが 画像のサイズがバラバラです まず画像を正方形に トリミングする必要があります 画像の主な被写体を切り抜くように トリミングしたいと思います GenerateObjectnessBasedSaliency ImageRequestで 画像内の主な被写体の位置を特定し それを中心にトリミングします
関数のgenerateThumbnailを記述すると 画像内の際立った部分の周囲を トリミングできます 次にforループを使って ライブラリ内の画像を反復処理し それぞれのサムネールを生成します 画像を1つずつ処理しているので 時間がかかることがあります 並行処理を使うと それを高速化できます
代わりにTaskGroupsを使います TaskGroupを使うと リクエストを並行して実行する 複数のタスクを作成できます このコードはもう1か所 調整する必要があります
Visionリクエストはメモリの消費量が メモリの消費量が高い可能性があるので 同時実行するVisionリクエスト数を制限して アプリのメモリ占有量を削減することを おすすめします 今回はタスクの数を5つまでにします
1つのタスクが終了したら 別のタスクを追加して 次の画像の処理を開始します これにより 1回に処理されるリクエストを 常に5件以内にできます このアプリではタスクの数を 5つに制限していますが アプリによっては制限数を 変えた方がよい場合もあります
次はアプリを新しいAPI用に アップデートする方法を紹介します 古いSwift APIもなくなりはしませんが Swift 6とSwiftの並行処理を 最大限に活用するためには アプリで新しいAPIを採用することを 強くおすすめします 始める前にひとつ補足事項があります メモリ消費量を削減するため VisionではNeural Engineを搭載した デバイスの一部のリクエストについて CPUとGPUのサポートが削除されます
そうしたデバイスではNeural Engineが 最も高性能なオプションです
supportedComputeDevices()APIを使うと リクエストでサポートされている コンピュートデバイスを いつでもチェックできます
では既存のVisionアプリケーションを アップデートして 新しいAPIを 使用する方法を説明します これはわずか3つのステップで実行できます
最初に新しいリクエストタイプと 監視タイプを採用する必要があります 古いAPIのほとんどのリクエストは 直接相当するものが 新しいAPIにあります
新しいリクエストタイプや 監視タイプを取得するには Visionのタイプ名から VNプレフィックスを削除してください
次に リクエストの完了ハンドラは削除され async/await構文に置き換えられています
最後に リクエストによって 作成された観察値は perform()の呼び出しから 直接返されます ではコードを更新しましょう このコードは古いVision APIを使って 画像内のバーコードを検出しています
VNプリフィックスを削除することで VNDetectBarcodesRequestをアップデートし 新しいリクエストが使用されるようにします
以前のAPIでは完了ハンドラ内で 結果を処理していました 今はperform()から 直接結果が返されるので 完了ハンドラを削除することにします
代わりに perform()の呼び出しには async/await構文を採用します
非同期APIを使用するには 関数も非同期にする必要があります
完了ハンドラからバーコードの 観測値を取得する代わりに perform()の呼び出しで 観測値が直接返されるようになりました また オプショナル型をアンラップする 必要もなくなりました 最後に ここではリクエストを1つ 実行するだけなので imageRequestHandlerは実際には必要ありません 削除してコードを簡略化します
以上です
新しいAPIを採用することで コードの行数が10行から 6行に減りました 合理化された構文は 素晴らしいものです では最後に 今年Visionで提供される 2つの新しい機能について説明します まずCalculateImageAestheticsScoresRequest という新しいリクエストについてです このリクエストは画質を評価し 印象に残る写真を見つけるために使用できます
ブレや露出など 画質を決定するために 分析される要素がいくつかあります この画質は 画像に割り当てられる 総合スコアで表されます
このリクエストでは ユーティリティ画像も特定できます ユーティリティ画像とは 役に立つけれども 特に記憶に残るわけではない画像で 例えばスクリーンショットや レシートの写真などです 例を見てみましょう
この美しい風景の画像は 高スコアです 露出も問題なく よく撮れていて とても印象的です
この画像には明確な焦点がありません 誤って撮影されたらしく 低スコアになっています
この木箱の画像は 技術的にはよく撮れていますが 友人と共有したくなるような 印象的な写真ではないかもしれません これはユーティリティ画像です 新しいAPIを使うには 単に
このリクエストでは ImageAestheticsScoresObservationが生成され 画像がどの程度よく撮れているかが -1から1の総合スコアで示されます この観測値にはもう1つ isUtilityという名前のプロパティがあります これはよく撮れているが 記憶に残らない内容の 写真に対してtrueとなります
また 今年のVisionには新たに ホリスティックボディポーズが加わりました
以前のVisionでは 体と手のポーズ検出を 別々にリクエストしていましたが
全身のポーズを使うと 手と体を一緒に検知できます
全身のポーズを使用するには DetectHumanBodyPoseRequestを作成します
リクエストのdetectsHandsは trueに設定します
このリクエストでは HumanBodyPoseObservationが生成されます これには2つの追加プロパティがあり 1つは右手の観察用で もう1つは左手の観察用です 新しい内容が多かったので 簡単にまとめておきます 新しいSwift APIは並行処理と Swift 6をサポートしているため Swiftエコシステムでうまく動作します これにより Swiftアプリケーションで Visionを簡単に採用できるようになります
それを念頭に置いて 今後Visionでは新しい機能を Swiftのみに導入していきます 既存のAPIは廃止されませんが 新しいAPIを採用することを 強くおすすめします 新しい画像の審美的評価と 全身のポーズAPIで 皆さんのアプリに 新しい機能を追加してください
ご視聴ありがとうございました 皆さんがVisionで作成する 素晴らしいアプリを楽しみにしています
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。