Ubuntu Weekly Recipe

第586回waifu2xで画像をきれいに拡大する

今回は画像の拡大とノイズ除去を行うWebサービスであるwaifu2xから変換のみの機能を切り出したwaifu2x-converter-cppを紹介します。

きっかけ

少し前の話になるのですが、5月の連休中にざっクリわかるVirtualBox 6.0対応版という同人誌を書きました。Markdownで下書きしたものをRe:VIEW形式に変換し、EPUBとPDF形式で出力するのですが、トリミングした画像が小さすぎるという問題に直面しました。具体的には図1のような感じです。これでは書かれている文字が読めません。

図1 トリミングした画像をPDFにすると小さすぎる
画像

GIMPやImagemagickでも画像を拡大することができますが、少し試した限りでは思っていたようなクオリティになりませんでした。そしてwaifu2xの存在を思い出し、拡大してみるとすごくきれいで驚きました。図2が原寸で、図3が拡大したものです。

図2 原寸画像(438x181ピクセル)
画像
図3 waifu2xで拡大した画像(876x362ピクセル)
画像

その際に枚数が多くてサーバーに負荷をかけたのを申し訳なく思い、次からは手元で拡大するようにしようと調べて見つけたのがwaifu2x-converter-cppです。GPUで高速化でき、しかもIntel/AMD/NvidiaそれぞれのGPUに対応しています。

ビルド

インストールするパッケージ

ではビルドしてみましょう。今回使用するUbuntuのバージョンは19.04です。19.10以降もこの手順で動作するものと思われます。

基本的に必要になるパッケージはgccgitcmakeopencl-headerslibopencv-devの5つで、あとはどのGPGPUを使用するのかによって変わります。

NVIDIA
NVIDIAのプロプライエタリなドライバーを使用している場合、CUDAが使用できます。CUDAのパッケージ名はnvidia-cuda-toolkitです。
AMD
AMDのGPU/APUでオープンソースドライバーを使用している場合、mesa-opencl-icdopencl-headersが必要です。プロプライエタリ―なドライバーは、今回は試していません。
Intel
IntelのCPU内蔵GPUを使用している場合、beignet-opencl-icdopencl-headersが必要のようですが、動作検証は行っていません。

実際のビルド

ビルドを実行するコマンドは次のとおりです。

git clone "https://github.com/DeadSix27/waifu2x-converter-cpp"
cd waifu2x-converter-cpp
mkdir out && cd out
cmake ..
make -j16
sudo make install
sudo ldconfig

makeコマンドのj16オプションは、16スレッドのCPUでビルドする場合です。ビルドするCPUに合わせて変更してください。ldconfigコマンドは正確にはビルドに必要なわけではなく、ビルドしたwaifu2x-converter-cppコマンドを実行するに必要です。

実行

ビルドができたら、まずは次のコマンドを実行してください。

$ waifu2x-converter-cpp -l

どのGPU/CPUを選択できるのかのリストが表示されます図4⁠。原則としては上から順番に速いことが期待されます。

図4 waifu2x-converter-cpp -lコマンドの実行例
画像

実際に変換するコマンドの実行例は次のとおりです。

$ waifu2x-converter-cpp --scale-ratio 2 -m scale -p (先ほどのリストの番号) -i "/path/to/image.png" -o "/path/to/image-big.png" 

--scale-ratioオプションはその名のとおり何倍に拡大するかで、ここでは2倍にしています。-mオプションはモードの指定で、scaleは拡大するだけです。noiseとするとノイズの除去をしてくれます。両方を指定するnoise-scaleもあります。-pオプションは先ほどのリストの番号を指定します。省略しても構いません。-iオプションは入力、-oオプションは出力するファイル名です。詳しいコマンドのオプションは-hオプション付きで実行して確認してください。

今回サンプルとして使用した元画像は図5で2011年8月27日に北海道帯広市の幸福駅(幸福交通公園)で筆者が撮影したものです。図6が拡大したものです。とてもきれいに拡大されていることがわかります。

図5 拡大前のサンプル画像(2048x1536ピクセル)
画像
図6 拡大後のサンプル画像(4096x3072ピクセル)
画像

ベンチマーク

waifu2x-converter-cppは完了後にかかった時間を出力します。そこで筆者が所有するいくつかのCPU/GPUでベンチマークとして実行してみました。結果は以下のとおりです。

GPU/CPU OpenCL/CUDA 時間(秒)
AMD Ryzen 7 2700X - 27.372s
AMD Ryzen 5 3600 - 19.626s
AMD Radeon RX 560 OpenCL 24.580s
NVIDIA Geforce GT 1030 CUDA 20.399s
NVIDIA GeForce GT 1030 OpenCL 24.526s
NVIDIA GeForce GTX 1050 CUDA 15.260s
NVIDIA GeForce GTX 1050 OpenCL 17.316s
NVIDIA GeForce GTX 1650 CUDA 11.758s
NVIDIA GeForce GTX 1650 OpenCL 12.024s

通常2048x1536ピクセルの画像をwaifu2xでさらに拡大するということはないでしょうから、ここまで大きな差が開くこともまたないでしょう。結果としては黙ってCUDAを使用しましょうというしかなく、ローエンドであるGeForce GT 1030ですらRyzen 5 3600と同等なのは軽く驚きです。

オープンソースでなんとかしようとすると、高速なCPUを購入するのがよさそうということもわかります。

Ryzen 7 2700XとRyzen 5 3600の速度差が気になりますが、ほかのベンチマークについては本日発売のSofware Design 2019年10月号に掲載されている「Ubuntu Monthly Report 第113回 UbuntuでRyzen 5 3600を使用する際の注意点」をご覧ください。

おすすめ記事

記事・ニュース一覧