cufilters (Aviutl用 CUDAフィルタ集)

NVEncにはいろいろなGPUフィルタをつけたのだけど、多くのフィルタはAviutlのCPUフィルタからのGPU版への移植なので、パラメータの効果の確認とか調整とかはAviutl版のほうで確認すればいい。ただ、一部のフィルタはNVEncにしかない(knnとか)ので、そういうフィルタは、エンコードしてみないと結果がわからなくて、パラメータの調整がしにくいのが不便だった。

そこで、GPUフィルタをそのままGPUで動かせるAviutlのフィルタを作ってみた。これでパラメータの効き具合もわかるようになるかと。


概要



NVEncにあるGPUフィルタの一部をAviutlのフィルタから使えるようにした。使えるGPUフィルタはいまのところ6つ。

・リサイズ
・ノイズ除去(knn)
・ノイズ除去(pmd)
・unsharp
・エッジレベル調整
・バンディング低減

CUDA版自動フィールドシフトは、本当はつけてみたかったのだけど、ちょっとかなり複雑になるのでひとまず放置です…。

処理手順としては、こんな感じ。

1. 一度YC48からYUV444(16bit)に変換
2. CPUからGPUへ転送
3. 6つのフィルタのうち、有効なフィルタ処理をGPUで実行 (内部形式: YUV444(16bit))
4. GPUからCPUへ転送
5. YUV444(16bit)からYC48に戻す

処理の速さは、GPUを使っているので速い!と言いたいところだけど、残念ながらそうでもない

というのも、やはりYUV444(16bit)とYC48の間の変換という余計な処理を挟んでいるし、さらにはとっても遅いCPU - GPU間のデータ転送を行っているので、どうしても時間がかかってしまう。

一応、複数のフィルタ処理をGPU上で一気に行えるので、フィルタをそれぞれ実行してCPU - GPU間のデータ転送を繰り返すのと比べれば、確実に速いはず。とはいえ、最近のCPUならきっとCPUのほうが速いかもで、やっぱりパラメータ調整用かなあ…。(具体的な速度はまだ測れてない)

GPUを使うとなると、CPU - GPU間のデータ転送が必要になるけど、CPUもGPUも年々どんどん速くなっているのにPCIeはいまいち速くならないから、どうしてもCPU - GPU間のデータ転送のせいで遅い、ということになりがち。まあ、計算させながら裏で転送する、というのが常識らしいのだけど、異常に面倒なコードになるので勘弁してほしい…。



設定画面



・フィルタが有効になると、一番上に使用されているデバイス名が表示されます。
・フィルタ名の横のチェックボックスをオンで有効になります。
・フィールド処理にチェックをすると、フィールドごとに処理を行います(インタレ維持モード)。





基本動作環境



Windows 7,8,8.1,10 (x86/x64)
Aviutl 0.99g4 以降
NVIDIA製 GPU GeForce Kepler以降 (GT/GTX 6xx 以降)
NVIDIA グラフィックドライバ 378.66以降

※NVEnc.auoの動作している環境なら動くはずです。



いつもの注意書き



無保証です。自己責任で使用してください。
cufiltersを使用したことによる、いかなる損害・トラブルについても責任を負いません。



ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。

ソースはこちら>>


スポンサーサイト



コメントの投稿

非公開コメント

No title

自動フィールドシフト以外のフィルタをavisynth用cudaプラグインとしての実装予定はありませんか?

No title

いつも様々なソフトを有り難く使わせて貰っています。
さて、私はプログラミングのプの字も分からない人間なのですが、
「とっても遅いCPU - GPU間のデータ転送」というのは
AMDの今ひとつ普及しそうもないHSAという技術で解決出来そうでしょうか?
昔、Dolphin開発者がブログあたりで技術だけは期待してるみたいな事を書いていた中
最近、rpcs3開発ブログでSkylakeから搭載されたHSA相当の機能で性能が出るみたいな事を書いていたように感じました。
CPU-GPU間のメモリの問題が解決されてもAPU(インテル含め)のGPU性能や帯域が足りない気もするのですが、
プログラムの難易度(私にはさっぱり分かりません)含め今後に期待出来たりする物なのでしょうかね?
(今のところVCEに期待できないので主にQSVでですが)

No title

>avisynth用cudaプラグイン
いまのところ、予定はありません。

>HSAという技術で解決出来そうでしょうか?
HSAが理想的な形で実装されれば、CPU - GPU間のデータ転送は不要となり、プログラミングは比較的容易になると思います。

ただ、残念ながら、現状すぐに使えるという状態ではないと思います。

まず、HSAというとCPUとiGPUの連携になるのかと思いますが、現状ではiGPU自体の性能がどうしてもdGPUと比べるとコア数・メモリ帯域の双方でかなり見劣りしてしまい、速度が出ないという問題があります。

また、IntelのiGPUの場合には、おっしゃるようにSkylake以降HSAのようなことができるのですが、GPUに実行命令を出してから実行されるまでが遅い、という問題があり結局あまり速度が出ないということも(Skylakeでは)ありました。

もちろん、1年ぐらい前に試したもので最近試したものではないので、状況は変わっているかもしれません。

今後、進展があれば期待できるのではないかと思います。

No title

話が出たついでに質問(というか実質的に要望なんですが)

普通の自動フィールドシフトのavisnthへの移植は難しいですか?
avisnthのテレシネ解除プラグインは厳密過ぎて使いづらいので、ぜひとも欲しいところなんですが・・

Re: No title

あまりavisynthプラグインの作り方をわかっていないので、難しいかもです…。

avisynthでは、自動フィールドシフトはwarpsharpパッケージのLoadAviUtlFilterPlugin経由で使っていた記憶がありますが、いかがでしょうか。(もしかしてもうご存知でしょうか?)


function AU_afsvf(clip clip,
\ int "i0", int "i1", int "i2", int "i3",
\ int "i4", int "i5", int "i6", int "i7",
\ int "i8", int "i9", int "i10", int "i11",
\ bool "b0", bool "b1", bool "b2", bool "b3",
\ bool "b4", bool "b5", bool "b6", bool "b7",
\ bool "b8", bool "b9", bool "b10", bool "b11")
{
LoadAviUtlFilterPlugin(AviUtl_plugin_directory+"afsvf.auf", "_AU_afsvf", copy=AviUtl_plugin_copy, debug=AviUtl_plugin_debug, thread=AviUtl_plugin_thread)
return clip._AU_afsvf(
\ default(i0,16), default(i1,16), default(i2,32), default(i3,32),
\ default(i4,0), default(i5,192), default(i6,128), default(i7,64),
\ default(i8,128), default(i9,256), default(i10,4), default(i11,2),
\ default(b0,true), default(b1,true), default(b2,true), default(b3,false),
\ default(b4,false), default(b5,false), default(b6,false), default(b7,false),
\ default(b8,false), default(b9,false), default(b10,true), default(b11,false))
}

ConvertYUY2ToAviUtlYC()
AU_afsvf(16,16,32,32,64,128,128,64,96,128,3,16,true,true,true,true,false,false,false,false,false,false,false,false)
ConvertAviUtlYCToYUY2()
ConvertToYV12()

あとはこのavsをx264afsに読ませるとできたように記憶しています。

可能なら超解像フィルタもお願いします。

CUDAを使った「ディープラーニングで」、とは申しませんので、超解像系のフィルタもお願いできないでしょうか?

あと、フィルタ処理をかける順番は任意指定できないのでしょうか?
また、単にスケーリングで拡大する場合、ノイズを加えて映像がボケた感じにならないようにする手法もあるのでノイズを加えるようなフィルタがあっても良いのではと・・・。

Re: 可能なら超解像フィルタもお願いします。

いずれも簡単にはできそうにないです…。

特に超解像系はアルゴリズムがよくわからなかったり、あるいはDeep Learning系だとやたらと重くて最適化が難しかったりする印象です。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

tsreplace
- tsの映像のみを置き換えて圧縮

rkmppenc
- Rockchip系SoCのhwエンコーダ

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR