【目次】
・使用するファイルについて
・呼び出し方について
・サンプルコード
・関数の詳細
・FAQ(必読)
・その他メモ
【使用するファイルについて】
・DLLにはx86版とx64版があります。状況に応じて選択しましょう
・w2xc.dllとw2xc.libがありますので、静的リンク・動的リンクどちらでもOKです
【呼び出し方について】
1. w2xconv.hをincludeします
2. w2xconv_init関数で初期化します。引数はとりあえず(1, 0, 0)でいいでしょう
3. w2xconv_load_models関数でモデルデータを読み込みます
4. w2xconv_convert_file関数やw2xconv_convert_rgb関数などで変換します
5. ソフト終了時はw2xconv_fini関数でリソースを解放するのを忘れずに
6. エラー処理はw2xconv_strerror関数とw2xconv_free関数を使用します
【サンプルコード】
○指定したファイルを変換させたい!
#include "w2xconv.h"
W2XConv *conv = w2xconv_init(1, 0, 0);
int retval = w2xconv_load_models(conv, "models");
if(retval < 0)
throw "error";
retval = w2xconv_convert_file(conv, dst_path, src_path, 1, 2.0, 512);
if(retval < 0)
throw "error";
w2xconv_fini(conv);
○読み込んだ(用意した)画像データを変換させたい!
#include "w2xconv.h"
W2XConv *conv = w2xconv_init(1, 0, 0);
int retval = w2xconv_load_models(conv, "models");
if(retval < 0)
throw "error";
unsigned char *src = new unsigned char[src_w * src_h * 3];
unsigned char *dst = new unsigned char[src_w * src_h * 3 * 4];
size_t src_step_byte = src_w * 3;
size_t dst_step_byte = src_w * 3 * 2;
retval = w2xconv_convert_rgb(conv, dst, dst_step_byte, src, src_step_byte, src_w, src_h, 1, 2.0, 512);
if(retval < 0)
throw "error";
w2xconv_fini(conv);
【関数の詳細】
・W2XConv *w2xconv_init(int enable_gpu, int njob, int enable_log)
環境を初期化する関数です。W2XConv型のポインタを返します。
enable_gpuが0だとCPU演算、enable_gpuが1だとGPU演算です。
enable_gpuが1で、かつGPUが使用できない場合はCPU演算します。詳しくはFAQ参照。
njobとenable_logはとりあえず0で問題ないでしょう。
・int w2xconv_load_models(struct W2XConv *conv, const char *model_dir)
モデルデータを読み込む関数です。返り値が負数の場合、読み込みに失敗しています。
convは、w2xconv_init関数の返り値をそのまま使ってください。
model_dirはモデルデータ(json形式)が入っているフォルダのことです。
なお、モデルデータはRGB版とY版の両方に対応しています。
・void w2xconv_fini(struct W2XConv *conv)
convが示す先を解放します。ソフト終了時に使います。
・int w2xconv_convert_file(
struct W2XConv *conv, const char *dst_path, const char *src_path,
int denoise_level, double scale, int block_size)
ファイル単位で、waifu2xの処理を行います。返り値が負数の場合、変換に失敗しています。
src_pathで指定されたファイルを読み込み、dst_pathに出力します。
denoise_levelは0~2がそれぞれデノイズ無し・弱・強に対応します。
scaleは実数指定です。拡大しない場合は1.0、2倍にする場合は2.0……となります。
block_sizeは処理する際のブロックサイズですが、設定する際の目安はFAQ参照。
なお、scaleが2の冪乗ではない場合、大きめに拡大してから線形フィルタで縮小します。
・int w2xconv_convert_rgb(
struct W2XConv *conv, unsigned char *dst, size_t dst_step_byte,
unsigned char *src, size_t src_step_byte,
int src_w, int src_h, int denoise_level, double scale, int block_size)
srcに入った画像データをdstに変換します。返り値が負数の場合、変換に失敗しています。
w2xconv_convert_file関数と異なり、ファイルを介さず変換することができます。
入力・出力共に、データは1画素づつRGBの順番で並んでいることに注意してください。
(R・G・Bがそれぞれunsigned char型で格納されている)
src_step_byteとdst_step_byteは、「横幅×1画素毎のバイト数」という意味です。
(この場合は、1画素毎のバイト数=sizeof(unsigned char)×3=3)
データ順は、素直に左上→右上→左下→右下といった順番です。
┌─┬─┬─┐
│ 1│ 2│ 3│
├─┼─┼─┤
│ 4│ 5│ 6│
├─┼─┼─┤
│ 7│ 8│ 9│
└─┴─┴─┘
なお、scaleが1.0以外の場合、dstおよびdst_step_byteを調整する必要があります。
・int w2xconv_convert_yuv(
struct W2XConv *conv, unsigned char *dst, size_t dst_step_byte,
unsigned char *src, size_t src_step_byte,
int src_w, int src_h, int denoise_level, double scale, int block_size)
srcに入った画像データをdstに変換します。返り値が負数の場合、変換に失敗しています。
入力・出力共に、データは1画素づつYCbCrの順番で並んでいることに注意してください。
ただ、Y・Cb・Crは0以上1以下のfloat型なので、要するに「キャストしろ」ということです。
(C形式キャストやreinterpret_castが嫌いな方はご注意ください)
src_step_byteとdst_step_byteは、「横幅×1画素毎のバイト数」という意味です。
(この場合は、1画素毎のバイト数=sizeof(float)×3=12)
・int w2xconv_apply_filter_y(
struct W2XConv *conv, W2XConvFilterType type,
unsigned char *dst, size_t dst_step_byte,
unsigned char *src, size_t src_step_byte, int src_w, int src_h, int block_size)
srcに入った画像データをdstに変換します。返り値が負数の場合、変換に失敗しています。
入力・出力共に、データは1画素づつYデータが並んでいることに注意してください。
(Yは0以上1以下のfloat型)
src_step_byteとdst_step_byteは、「横幅×1画素毎のバイト数」という意味です。
(この場合は、1画素毎のバイト数=sizeof(float)×1=4)
・int w2xconv_test(struct W2XConv *conv, int block_size)
convとblock_sizeを指定すると、テストデータを出力します。
返り値が負数の場合、変換に失敗しています。
【FAQ(必読)】
Q. RGB版での処理になるのか、Y版での処理になるのかは何で決まるの?
A. 関数名は一切関係なく、読み込むモデルデータの種類によります。
RGB版のモデルデータならRGB処理、Y版のモデルデータならY処理します。
なお、RGB版のデータでw2xconv_convert_yuvを使えばエラーが出ます。
また、Y版のデータでw2xconv_convert_rgbを使うと、内部でYUVへの変換・逆変換処理が入ります。
(Y版での処理の場合、Y成分にwaifu2xを適用し、U・V成分はバイキュービックします)
Q. CPUで計算するか、GPUで計算するかはどこで決まるの?
A. w2xconv_init関数で初期化する時点で決まります。CPUで計算する場合とGPUで計算する場合を
切り替える際は、その度にw2xconv_init関数とw2xconv_load_models関数で
初期化し直す必要があります。
Q. GPUを使用するように初期化する場合、事前にGPUが存在するかをチェックしないとダメ?
A. 使用可能なGPUが存在しない状態で、w2xconv_init関数の第一引数を1にすると、
ハードウェアの状態が自動的に判別されて、CPU計算になります。
要するに、ただ使うだけならとりあえず1として初期化すれば大丈夫です。
Q. その「自動判別」する際には、どのハードウェアが優先されるの?
A. 優先度が高い順に、CUDA>OpenCL>FMA>AVX>(OpenCVの)filter2Dとなります。
ただし、Intel GPUでOpenCLを使用するぐらいならCPUで計算したほうが速いので、
Intel GPUが見えても無視するようになっています。
Q. ブロックサイズってどう設定すればいいの?
A. 無駄が出ないように、元画像の縦横の公約数にすることを推奨します。
……と言いたかったのですが、実験してみるとなぜか大きめにするほど速かったりしたので、
メモリが許す限り大きめにしておきましょう(当然画像サイズより大きくしても無駄ですが)。
Q. CPUやGPUで計算する場合の効率は?
A. ハードウェアや周辺プログラムによって異なるので一概には言えません。
参考までに実測値を載せておくと、800x480の画像をデノイズ&2倍に拡大した場合、
Core i7-4790K・GALAXY GF PGTX750TI-OC/2GD5・64bitWin8.1の環境で次のようになりました。
(どちらも定格動作・RGB版)
・演算時間……CPU動作で10899ms・GPU動作で1755ms
・実測FLOPS……101.9GFLOPS・632.9GFLOPS
・理論FLOPS(float型での値)……537.6GLOPS・1.522TFLOPS
・効率……19.0%・41.6%
【その他メモ】
w2xc.dll作成者:tanakamura (@tanakmura)氏
文章作成者:YSR (@YSRKEN)
w2xc.dllの入手先(2015/07/09現在):http://d...content-available-to-author-only...e.jp/w_o/20150629#1435585193
aviutl-waifu2x-w2xcの入手先:https://g...content-available-to-author-only...b.com/YSRKEN/aviutl-waifu2x-w2xc/releases