-
Core ImageによるRAW画像処理の強化
Core ImageによるRAW画像処理APIのバージョン9では、Apple Neural Engineを使用してパフォーマンスを最適化しつつ、画像のシャープネスを高め色をより詳細に定義することで、アプリの画質を劇的に向上させます。CIRAWFilter APIを使用すると、露出、ノイズリダクション、シャープネス、コントラストなどを変更してRAW写真を編集できる機能をユーザーに提供できます。タイルサイズやバッファ管理を細かく制御してパフォーマンスを最適化できるようにする、各種の新しいCIImageProcessor APIも紹介します。
関連する章
- 0:00 - Introduction
- 0:52 - How Core Image supports RAW
- 2:48 - The evolution of RAW support
- 3:33 - RAW 9 overview
- 3:56 - RAW 9 quality improvements
- 5:50 - Enable and edit RAW 9 with CIRAWFilter API
- 8:33 - RAW 9 performance overview
- 9:19 - Interactive editing
- 10:52 - Exporting to other formats
- 11:50 - New CIImageProcessor features
リソース
関連ビデオ
WWDC22
WWDC21
-
このビデオを検索
みなさん、ようこそ。 David Haywardです Core Imageの機能強化と RAWイメージファイルの サポートについてお話しします
主に4つのトピックについて お話しします まず、カメラからの RAWイメージファイルが AppleプラットフォームのCore Imageで どのようにサポートされるかを説明します iOSにおける重大な RAW品質の改善点をご紹介します iPadOS、macOS、 そしてvisionOS 27での改善です
次に、RAWレンダリングにおける 最適なパフォーマンスの実現方法を説明します
最後に、AppleがRAW向けに CIImageProcessorクラスに 追加した機能を紹介します
まず、Core ImageのRAWサポートの 概要をお伝えします RAWファイルは多様な カメラメーカーやモデルから生成されますが HEIFやJPEGとは異なり 表示前に 特別な処理が必要です
最初のステップは ファイルのメタデータを解析して RAWセンサー値を アンパックすることです この段階では 各ピクセル位置に モザイクパターンで配置された 赤、緑、または青の値だけがあります このパターンが見えるよう 大幅にクロップされたイメージです 次のステップで センサーデータをデモザイクして 各ピクセルに赤、緑、青の 値を持たせます
続いてピクセルを デノイズ処理します フォトンノイズ、リードノイズ、 熱ノイズを除去します その後コンボリューションを適用して エッジをシャープにし ローカルコントラストを加えます
最後の主要ステップは ホワイトバランス、露出 カラーとトーンを調整して 美しい最終イメージを作ることです これらすべてのステップのアルゴリズムは iOSに組み込まれています iPadOS、macOS、 そしてvisionOSにも搭載されています Finderなどのシステムアプリで RAWファイルを表示できます プレビューやフリーボードでも可能です
Image IO APIを使用する アプリやフレームワークはどれでも RAWサポートが 自動的に有効になります
基本的な表示を超えて CIRAWFilter APIを使用するアプリは 高度な編集コントロールを 提供できます
このAPIは写真や Pixelmator Proなどのアプリが使用しています NitroやAcornをはじめ 多くのアプリにも活用されています
2006年当初 システムには21機種向けの 手調整されたキャリブレーションのみがありました それ以来、その数は 784機種にまで増加しました 主要カメラベンダーの すべてをカバーしています iPhoneカメラ向けの Apple Pro RAWファイルのサポートも含まれています
しかしRAWの重要な機能は 何年も前に撮ったお気に入りの写真を 最新の最先端アルゴリズムで 再処理できることです AppleのRAW処理パイプラインは これまでに8回更新されてきました デモザイク、デノイズ、 カラーが毎回改善されています 古いバージョンの一部は 引き続き維持されており 希望する場合は 引き続き使用できます
そして今、Appleは 最大のアップデートを発表しました:RAW 9!
このバージョンはRAWファイルの レンダリングを劇的に改善します タイル型CoreMLモデルを 基盤として構築されており 最高品質のために デモザイクとデノイズを組み合わせています このモデルはApple Neural Engineのコアを使い デバイス上で実行されます 最適なパフォーマンスを 実現します
改善点を より詳しく見てみましょう
RAW 8を使用した 低ノイズイメージの拡大クロップです Sony Alpha 7 IIで撮影した このビンテージ計器のイメージは 実はかなり良い仕上がりです しかし 同じイメージをRAW 9で見ると イメージはよりシャープで鮮明になり 細かいテキストも読みやすくなります
高ノイズのイメージを見ると 違いはさらに顕著です まず、このRAWデータを 観察してください 非常にノイズの多い ISO 51,200のイメージに含まれています
Canon 5D Mark IIIを使った この例では クレヨンの箱を 10倍クロップしたイメージです RAWデータには輝度ノイズと 色ノイズが非常に多く 各クレヨンの固有の色を 識別することができません 従来のアルゴリズムを使用すると この結果になります!
RAW 8はシーンの実際の色を ある程度回復しましたが RAW 9での結果を 確認すると 出力結果は格段に優れています 色が正確で はっきりしています クレヨンの光沢ある 鏡面ハイライトも見えています
最後の例は 刺繍糸の写真のクロップです Fujifilm X-T5を使用して ISO 12,800で撮影されました このカメラは 非従来型のセンサーパターンを持ち デモザイクが困難です RAW 8の結果では 糸に色のアーチファクトと ディテールの損失があります しかし同じイメージを RAW 9で見ると 結果は明らかに優れています 小さなテキストが読みやすくなり 糸のテクスチャもより鮮明です
アプリケーションでRAW 9を 有効にする方法を見てみましょう まず、CIRAWFilter APIを使って RAWファイルを読み込みます このAPIはWWDC 21の "Capture and process ProRAW images"で詳しく説明されています
ただし、RAW 9はデフォルトでは 有効になっていないことに注意してください supportedDecoderVersionsプロパティに version9列挙型が含まれているか 確認してください 含まれている場合は decoderVersionプロパティを version9に設定してオプトインできます
RAW 9をサポートする カメラモデルを確認するには supportedCameraModelsという 新しいクラスメソッドがあります このAPIはアプリに 指定バージョンでサポートされている すべてのモデルの配列を提供します iOS、iPadOS、macOS、 visionOS 27のリリースでは RAW 9を使用できる 数百ものモデルが追加されます 主要なプロフェッショナル カメラベンダーすべてが含まれます このカメラリストは OSの無線アップデートを通じて 拡張されます RAW 9はDNGをネイティブで撮影する カメラにも自動的にサポートされます Apple iPhoneなどが その例です
CIRAWFilter APIの真のパワーが 発揮されるのは アプリがプロパティを 変更するときです これによりRAWファイルの 表示方法をカスタマイズできます
現在、調整できる キャリブレーション済みプロパティは20個です アプリにこれらの調整機能を 組み込んでください RAWイメージ編集の フルパワーを活用できます RAW編集で最も重要な コントロールはこちらです: 露出:イメージの明暗を 調整するコントロールです luminanceNoiseReductionAmount 輝度グレインの可視量を 調整します sharpnessAmount:エッジの シャープネスの度合いを決定します
contrastAmount:エッジ付近の ローカルコントラストの適用量を変更します
これらのコントロールは RAW 9でさらに効果的になりました
RAW 9では不要になった プロパティもあります colorNoiseReductionAmountプロパティは 効果がなくなりました CoreMLモデルが色ノイズリダクションを 自動的に処理するためです
また、detailAmountと moireReductionAmountプロパティも RAW 9では不要となり サポートされなくなりました
isSupportedプロパティを呼び出して プロパティがフィルタインスタンスで 機能するか確認できます
RAW 9の外観と動作を 理解したところで そのパフォーマンスについて 説明します 根本的に、このような品質向上を 実現するために RAW 9は旧バージョンより パフォーマンスとリソースを多く消費します RAW 9はイメージごとに CoreMLモデルを数百回実行しますが アプリがCIRAWFilterのプロパティを 編集しているときでも 後続のレンダリングは 高速でレスポンシブです
Core Imageが 中間結果をキャッシュするためです 最適なパフォーマンスを得るための ベストプラクティスは アプリがRAWファイルをどのように 使用するかによって異なります 最も一般的な2つのユースケースの 推奨事項をお伝えします まず、インタラクティブ編集の ユースケースについて説明します
インタラクティブ編集とは 1つのRAWファイルを 画面解像度で複数回レンダリングすることです 通常は、アプリがCIRAWFilterの プロパティを調整するたびに行います 露出やシャープネスなどです RAWをインタラクティブに 編集する際は CIRAWFilterの scaleFactor プロパティを使用します 縮小サイズで イメージを表示する場合です これは重要で、表示解像度を超える メガピクセルを持つイメージの レンダリング作業を軽減します
ビューごとに1つのCIContextを使用し cacheIntermediatesオプションをtrueに設定します キャッシュにより負荷の高い CoreMLの処理をスキップできます アプリがCIRAWFilterのプロパティを 調整する際に有効です
Core Imageはレンダリング間の キャッシュにより多くのメモリを使用します アプリに"Extended Virtual Addressing entitlement"を追加すると有効です AppleのWebサイトに 詳細なドキュメントがあります また、Metal対応ビューへ 直接レンダリングしてください これにより繰り返しレンダリングの パフォーマンスが向上します Metalが次のフレームの作業を 開始できるためです 前のフレームが完了する 前でも可能です MTKViewへのレンダリングの 詳細については "Display EDR content with Core Image, Metal, and SwiftUI" WWDC 22を参照してください
インタラクティブ編集の アドバイスに続いて ファイルをエクスポートする際の 重要なヒントをお伝えします
エクスポートのユースケースとは 複数のRAWファイルをそれぞれ フル解像度で1回レンダリングして HEIFやJPEGなどの 他のフォーマットに変換することです
このケースのベストプラクティスは CIContextを使ってエクスポートし cacheIntermediatesオプションを falseに設定することです
また、Core Imageに各エクスポート時に より多くのメモリを使用するよう指示できます コンテキストの memoryLimitオプションを設定します iOSではデフォルトの制限が 保守的な256メガバイトです 512または1024メガバイトに設定すると パフォーマンスが大幅に向上します
コンテキストメソッドを使うことで メモリ使用量をさらに削減できます Image IOを直接呼び出す代わりに heifRepresentationやjpegRepresentationを使います 最後のセクションでは CIImageProcessor APIの 改善についてお話しします
RAW 9はCIImageProcessor APIを 使用しています CoreMLを他のCIKernelと組み合わせる アルゴリズムを可能にするためです
この取り組みの結果として Core Imageチームは2つの機能を CIImageProcessor APIに追加しました アプリで活用できるかもしれません 最初にお話しするのは 明示的な出力タイルサイズのサポートです
これは典型的な CIImageProcessorクラスの例です region of interestコールバックを 実装しています 指定した出力矩形にどれだけの 入力が必要かを定義します
最も重要なのは processコールバック内で input.regionとoutput.regionを 認識する必要があることです プロセッサが操作すべき 領域です メモリが十分にある場合 Core Imageはprocess関数を 呼び出します イメージ全体の output.regionで呼び出されます メモリが限られている場合は output.regionが大幅に 小さくなる場合があります
プロセッサは出力タイルサイズを 明示的に制御できるようになりました プロセッサクラスのコードは 以前と同じですが 任意の出力領域を使用するよう Core Imageに指示できます
まず配列を作成します イメージをカバーする すべての希望タイルを配列に追加します この例では、タイリング戦略が 入力イメージの範囲を取得して 512×512ピクセルの タイルに分割します プロセッサを使用する イメージを作成する際は applyメソッドを呼び出し イメージをカバーするタイル配列を渡します
明示的な出力タイルサイズについて 説明しましたので 最後のトピックは テンポラリバッファ機能です
CoreMLを呼び出すCIImageProcessorが テンポラリバッファを使用することは一般的です Core Imageはインターリーブ形式の イメージバッファを使用するため CoreML用にプレーナーデータに 変換する必要があるためです プロセッサコールバックが 多くのタイルに対して呼び出されると テンポラリバッファが 繰り返し作成・破棄されます これはパフォーマンスに 影響します CIImageProcessorOutputクラスに 解決するメソッドが追加されました 仕組みを説明します!
シンプルなCIImageProcessorクラスの 例を見てみましょう テンポラリバッファ機能を 使用しています 入力から出力への 直接処理の代わりに このコールバックは スクラッチバッファを要求します outputオブジェクトに テンポラリのCVPixelBufferを求めます
その際、識別子を提供します これは、複数のテンポラリバッファを使用する processコールバックで重要です
次に、このプロセッサの例は 入力ピクセルバッファから テンポラリバッファにコピーして テンポラリバッファのピクセルを インプレースで変更し出力にコピーします Core Imageはテンポラリバッファの ライフサイクルを管理します 自動的にリリースされ 適切なタイミングで解放されます 次のタイルでプロセッサが 呼び出されると再利用されます ここで重要なポイントを まとめます アプリでRAW 9を試してください 大幅な品質向上です 有効にするのも 数行のコードだけです
パフォーマンスの ベストプラクティスに従ってください 高速なエクスポートと レスポンシブな編集のために説明したものです
アプリにCIRAWFilterの強力な 編集プロパティへのアクセスを提供してください RAWイメージの表示を 細かく調整できるようになります 最後に、CIImageProcessorで 最適なパフォーマンスを得るために 明示的タイリングと テンポラリバッファAPIを使用してください 個人的に、20年以上にわたって RAWで撮影してきた 7000枚以上の家族写真の ライブラリを見直すのが楽しかったです ノイズリダクションの品質向上を 実感できて本当に良かったです アプリをご利用の方々も これらの改善を楽しんでいただけると思います ご視聴ありがとうございました!
-
-
11:08 - Contact for exports
let exportCtx = CIContext(options : [ .cacheIntermediate : false, .memoryLimit : 512 ]) -
12:23 - CIImageProcessor with explicit output tile sizes
import CoreImage class MyProcessor: CIImageProcessorKernel { override class func roi(forInput input: Int32, arguments: [String : Any]?, outputRect: CGRect) -> CGRect { return outputRect } override class func process(with inputs: [CIImageProcessorInput]?, arguments: [String : Any]?, output: CIImageProcessorOutput) throws { guard let input = inputs?.first, let iBuffer = input.pixelBuffer, let oBuffer = output.pixelBuffer else { return } let iRegion = input.region let oRegion = output.region // controlled by Core Image // MyCopyBuffer(iBuffer,iRegion, oBuffer,oRegion) } } let extent = inImg.extent let tileSize = 512.0 // whatever tile size you want var tiles: [CIVector] = [] for y in stride(from: extent.minY, to: extent.maxY, by: tileSize) { for x in stride(from: extent.minX, to: extent.maxX, by: tileSize) { let tile = CGRect(x: x, y: y, width: min(tileSize, extent.maxX - x), height: min(tileSize, extent.maxY - y)) tiles.append(CIVector(cgRect: tile)) } } let result = try MyProcessor.apply(withTiledExtent: tiles, inputs: [inImg], arguments: [:]) -
14:24 - CIImageProcessor using temporary PixelBuffer
import CoreImage class MyProcessor: CIImageProcessorKernel { override class func process(with inputs: [CIImageProcessorInput]?, arguments: [String: Any]?, output: CIImageProcessorOutput) throws { guard let input = inputs?.first, let srcPixelBuffer = input.pixelBuffer, let dstPixelBuffer = output.pixelBuffer else { return } // Get a scratch buffer from Core Image's cache guard let scratch = output.temporaryPixelBuffer(identifier : "myScratch", format: kCVPixelFormatType_64RGBAHalf, width: Int(output.region.width), height: Int(output.region.height), pixelBufferAttributes: nil) else { return } // Step 1: copy input CVPixelBuffer → scratch // Step 2: process pixels in scratch // Step 3: copy scratch → output CVPixelBuffer } }
-
-
- 0:00 - Introduction
Enhancements to Core Image and its support for RAW image files across Apple platforms.
- 0:52 - How Core Image supports RAW
An overview of the RAW processing stages, including demosaic, denoising, convolution, and color adjustments, and their support in Apple's operating systems and developer frameworks.
- 2:48 - The evolution of RAW support
A look at how Apple's RAW processing pipeline has evolved across nine versions, now supporting 784 camera models.
- 3:33 - RAW 9 overview
Explore the new RAW 9 processing pipeline, which leverages a Core ML model to significantly improve demosaic and denoise for the highest image quality.
- 3:56 - RAW 9 quality improvements
A side-by-side comparison of RAW 8 and RAW 9 demonstrating significant improvements in sharpness, color accuracy, and noise reduction.
- 5:50 - Enable and edit RAW 9 with CIRAWFilter API
How to opt in to RAW 9 using CIRAWFilter's decoderVersion property, check which camera models are supported, and use the CIRAWFilter editing properties to give people full control over how their RAW images appear.
- 8:33 - RAW 9 performance overview
Best practices for optimizing performance when using RAW 9.
- 9:19 - Interactive editing
Best practices for rendering a RAW file repeatedly at screen resolution, including using the scaleFactor property, enabling cacheIntermediates, the Extended Virtual Addressing entitlement, and rendering to Metal-backed MTKViews.
- 10:52 - Exporting to other formats
Best practices for exporting multiple RAW files to HEIF or JPEG at full resolution, including disabling cacheIntermediates, tuning the memoryLimit option, and using Core Image's heifRepresentation and jpegRepresentation methods.
- 11:50 - New CIImageProcessor features
Discover new API features added to CIImageProcessor, including explicit output tile sizes and temporary buffers.