Visionでオフライン動画処理 - VNVideoProcessor
VNVideoProcessorはVisionにiOS 14, macOS 11.0で新規追加された、オフライン動画処理用のクラス。昨年はこの存在に気付かず、iOS 15の新APIチェックをしていて発見した。昨年のWWDCセッションでもおそらく触れられておらず、Appleのサンプルでも使用されておらず、GitHub検索してもわずか数個のリポジトリでしか使用されていない地味なAPIだが、個人的にはわりと「かゆいところに手が届く」系の嬉しい更新。
何が嬉しいのか
これまで動画ファイル等に対してVisionのビルトインの機能なりCore MLモデルなりで画像分類やら物体検出を行う場合、動画からフレームを抽出してから、
それぞれのフレーム画像に対してVisionの処理を行う、ということをやっていた。
これが、VNVideoProcessorを使うと、フレーム抽出を実装することなく、動画に対してVisionの処理を行うことができる。
実装が楽になるだけ?
上述のように書くと、フレームを抽出して各フレーム画像についてVisionの処理を行う、の実装分だけ楽になる、コードがスッキリする、ぐらいのメリットしかなさそうにも見える。
実際のところ、こういうの(フレーム抽出処理)は一度書いてしまえば使い回せるので、ここ自体はまったく苦労はない。少なくとも僕は動画からのフレーム抽出の実装は仕事でも自分のアプリでも使いまわしていて、オフライン動画処理を実装すること自体は一瞬でできる。
しかしまぁどんなものでも標準で用意されたなら、きっとそっちの方(自前実装よりも)が最適化されていていい感じに動く可能性が高い、とまずは考えるようにしている。
たとえば、フレーム抽出時には必ず動画エンコードが入る。これは(エンコード形式にもよるが)ハードウェアで処理される。
よくわからないが、もしかしたらその後のVisionの処理(GPU, Neural Engineも利用)といい感じに連携してくれてるとかあるかもしれない(なさそう)。
あと、Vision内部で結局各フレーム画像を単体で処理しているのではなくて、複数フレームを効率よく扱うようなことももしかしたら内部で行われているかもしれない。
VNVideoProcessor.RequestProcessingOptions, VNVideoProcessor.Cadence
VNVideoProcessorはリクエスト追加時にVNVideoProcessor.RequestProcessingOptions型でオプションを指定できる。
func addRequest(_ request: VNRequest,
processingOptions: VNVideoProcessor.RequestProcessingOptions) throws
VNVideoProcessor.RequestProcessingOptionsには今のところcadenceプロパティしかない。
@NSCopying var cadence: VNVideoProcessor.Cadence? { get set }
これは、動画のフレームを抽出する頻度を指定するもの。
フレームレートで指定できるFrameRateCadenceと、
class FrameRateCadence : VNVideoProcessor.Cadence
タイムインターバルで指定できるTimeIntervalCadenceとがある。
class TimeIntervalCadence : VNVideoProcessor.Cadence
実装例
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/