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ノイズの乗り具合を指定できます。ノイズ除去処理を行う場合のみ考慮されます。