macでwaifu2x-converter-cppをビルドする

畳み込みニューラルネットワークにより、二次元のイラストを高品質に拡大するwaifu2xというプログラム。ご存知でしょうか。

macでwaifu2xを試してみたので、そのビルド手順について書き留めておきます。

waifu2xで超解像

そもそもwaifu2xとは、、、
畳み込みニューラルネットワークを駆使して画像のjpegノイズ除去・高解像度化するソフトウェアのことです。百聞は一見に如かず。まずは以下の画像をご覧ください。

元画像:300×295 jpg

waifu2xにて2倍(面積としては4倍)に拡大した画像:600×590 png

どうでしょう。全く違和感なく、綺麗に拡大されていますよね、
このように、waifu2xを使えば低解像度のイラストや、jpegノイズの乗った画像を高品質にすることができます。

アニメ・漫画などのお気に入りのキャラクターのことを「俺の嫁」とかっていいますよね。waifu2xの名前の由来は “嫁→ワイフ→waifu” を “2倍→2x” に拡大する。というところから来ているそうです。

waifu2x-converter-cppをgit cloneする

waifu2xにもいろいろな派生がありますが、今回ビルドに使うリポジトリはこちらを使わせていただきます。
https://github.com/tanakamura/waifu2x-converter-cpp

$ git clone https://github.com/tanakamura/waifu2x-converter-cpp

上記リポジトリのREADMEでは、対応するPlatformの欄で「Mac OS X?」とはてなマークがついています。「OpenCVなどを使ってビルドするだけだから多分大丈だけど作者は試していないよ。」ということらしいです。ちゃんとビルドできましたのでご安心を。

必要なライブラリなどを入れる

cmakeが必要です。

$ brew install cmake

opencvが入っていない人は入れましょう。2019年12月現在、以下コマンドでopencv4が入る。

$ brew install opencv

Mac用にsrc/common.cpp書き直す

フォルダ内の src/common.cppの修正をします。201行目と205行目をそれぞれ以下のように変更します。

201行目

// if (src_st.st_mtim.tv_sec > dst_st.st_mtim.tv_sec) {
if (src_st.st_mtimespec.tv_sec > dst_st.st_mtimespec.tv_sec) {

205行目

// if (src_st.st_mtim.tv_nsec > dst_st.st_mtim.tv_nsec) {
if (src_st.st_mtimespec.tv_nsec > dst_st.st_mtimespec.tv_nsec) {

その他ファイルでwarningが出ることがありましたが、クリティカルでは無いので無視します。

CMakeLists.txtを書き直す

CmakeLists.txtも微妙に書き直す必要がありました。

6行目   opencvのところをopencv4にします。
(古いopencvを使っている方はopencvのままで良いかもしれません、、、)

# pkg_check_modules(OPENCV_PKG opencv)
pkg_check_modules(OPENCV_PKG opencv4)

25行目
インクルードチェックにて、HAVE_OPENCVフラグを立たせるところ。これは私の環境だけ?かもしれませんが、以下の行でHAVE_OPENCV変数が立たなかったので、無理やりフラグを立てます。

check_include_file_cxx("opencv2/opencv.hpp" HAVE_OPENCV)
set(HAVE_OPENCV 1)   # <- 追加

「これじゃ、opencv2/opencv.hppのインクルードが通らないんじゃ無いの?」と思いますが、ちゃんとincludeは通るんですよね、、、

ちなみに、pkg-configでインクルードディレクトリを確認すると、

$ pkg-config opencv4 --cflags
-I/usr/local/Cellar/opencv/4.1.2/include/opencv4/opencv -I/usr/local/Cellar/opencv/4.1.2/include/opencv4

このような出力が得られ、確かにそのディレクトリにopencv.hppがあることが確認できます。

CMakeLists.txtを書き直す 2020/06追記

PCを新調したので、まっさらな状態でのビルドを試みたところ、opencv2/core.hppのインクルードも通らなくなりました。

上記のcflagsにて確認したディレクトリにopencv2/core.hppがあることを確認したのちに、CMakeLists.txtにそのまま追加することで取り敢えず解決しました。

if (${OPENCV_PKG_FOUND})
  set(CMAKE_REQUIRED_INCLUDES ${OPENCV_PKG_INCLUDE_DIRS})
  include_directories(${OPENCV_PKG_INCLUDE_DIRS})
  include_directories(/usr/local/Cellar/opencv/4.3.0_4/include/opencv4)   # <- 追加
  link_directories(${OPENCV_PKG_LIBRARY_DIRS})
else()

16行目あたりに、パスをそのままセットします。

cmakeでビルド

$ cd /path/to/the/waifu2x-converter-cpp
$ cmake .
$ make

これにて完成です!うまくいきましたでしょうか。上手くいっていれば、waifu2x-converter-cpp直下にwaifu2x-converter-cppという実行ファイルができているはずです。

waifu2x-converter-cppの使い方

waifu2x-converter-cppのよく使うオプションを列挙してみます。

$ cd /path/to/the/waifu2x-converter-cpp
$ ./waifu2x-converter-cpp -i <input_img> -o <output_img> -m noise_scale --noise_level 2

-i, –input_file <string>
入力画像のパスを指定します。

-o, –output_file <string>
出力画像のパスを指定します。
省略した場合、入力画像と同じディレクトリに出力されます。その際のファイル名は、”input_filename(noise_scale)(Level1)(x2.000000).png”のように、入力ファイル名+処理内容という形となります。

-m, –mode <noise|scale|noise_scale>
処理モードを指定します。確か何も指定しなければnoise_scale?だった気がします。noiseを指定すると、jpegノイズのみ除去。scaleを指定すると画像の拡大。noise_scaleで両方行います。

–noise_level <1|2>
jpegノイズの乗り具合を指定できます。ノイズ除去処理を行う場合のみ考慮されます。

以上、waifu2x-converter-cppをMacでビルドする手順についてでした。