困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

画像加工の話~TecoGANを試してみた~

巷で話題のTecoGAN。
これを試してみたので、導入と使い方と感想を記事にした。

▼TecoGANとは

ai-scholar.tech

簡単に言えば、機械学習によって、荒い解像度のドットを、鮮明に映るドットに変換してくれるアプコン(アップコンバート)アルゴリズムのようだ。

私がこれを試した理由は、熟練読者であれば簡単に思いつくと思うが、 あえて使用用途は書かずに、詳細だけお伝えする。

▼導入
簡単に言うと

Pythonが動く環境を用意する
  ・Anacondaインストール
  ・計算用GPU、CPUモジュールのインストール

・TecoGANを用意する
  ・GITHUBからZIPダウンロード
  ・学習モデルのインストール

・TecoGANのPythonスクリプトを起動して実行

以上だ。

この人の記事を参考にしたので、導入に関しては、私の記事を読み進めるより、こちらの人を参考にした方が良い。

www.eximradar.jp

1.Pythonが動く環境を用意する。
1-1. Anacondaのインストール
どうやら、「Anaconda」と呼ばれる、機械学習などに特化したモジュールが使えるようになっている、Pythonの統合環境が存在するようで、まずはそれをインストールする。

こちらからインストールする。

www.anaconda.com

インストールが終わると、「Anaconda Prompto」なる、ターミナルが使用できるようになるので、これを起動する。

1-2. 仮想環境の構築
次の、Anaconda内に、Pythonの仮想環境を構築する。
以下のコマンドを実行する。

conda create -n tcgn python=3.5 Anaconda

tcgnは仮想環境名なので、なんでも良いらしい。

構築が済んだら、下記のコマンドで仮想環境に入る。

conda activate tcgn

2. 計算用モジュールの追加(GPU)
次に、計算用のモジュールを追加する。
GPUとCPUと存在しているが、両方使えるようにした方が良い。 理由としては

・小さいサイズの画像は、速度重視でGPUで行う
・大きいサイズの画像は、速度が遅くてもCPUでしか行えない(メモリの都合上)

このあたりの理由だ。

GPUは、NVIDIAのグラボなら使えるらしい。
GPUモジュール追加は、 →CUDA9

developer.nvidia.com

本体とパッチ4つをダウンロードして、順次インストール。パッチ1は、もしかしたら反応しないかもしれない。

→cuDNN 7.1

developer.nvidia.com

色々入力して会員登録が必要だが、それが済んでから7.n系をインストールするらしい。
cuDNNはzipを解凍後、

”C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0″

内の同名ディレクトリに中身をコピーすれば導入完了らしい。

導入できたら、AnacondaPromptを再起動して

conda install tensorflow-gpu keras-gpu opencv 

これで、GPUモジュールのインストールは完了だ。

3. 計算用モジュールの追加(CPU)
CPUモジュール追加は仮想環境内に入って、

conda install tensorflow keras opencv

これでよいようだ。

4. TecoGANの準備
GITHUBから、ZIPをダウンロードしてくる。

github.com

これを、適当な所に展開しておく。

本来であれば、Anaconda上から、

python runGan.py 0

とすると、必要なデータをインストールしてくるらしいのだが、
Windows用には作られていないので、自分でURLへアクセスしてmodelを取得する。

https://ge.in.tum.de/download/data/TecoGAN/model.zip

これを、runGan.pyがあるディレクトリに配置して、準備完了。

余談だが、GPUとCPUの切り替えは、多分、runGan.py内の

for nn in range(len(testpre)):
        cmd1 = ["python", "main.py",
            "--cudaID", "1",             # set the cudaID here to use only one GPU 

このcudalID1にすると、CPU。0だとGPU。多分ね、多分。

5. TecoGANに実行
Anaconda環境から、自分のtcgn仮想環境に入り、TecoGANのディレクトリまで移動したら、

python runGan.py 1

で、起動する。 効果は、LR/calendarにある画像を、resultsにエクスポートすること。 お試しあれ。

▼諸々試したうえでの、備忘録
GPU使用時、多分メモリ不足でエラー

(tcgn) D:\TecoGAN-master>python runGan.py 1Testing test case 1D:\anacon\envs\tcgn\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_convertersUsing TensorFlow backend.input shape: [1, 330, 640, 3]output shape: [1, 1320, 2560, 3]Finish building the networkLoading weights from ckpt modelFrame evaluation starts!!Traceback (most recent call last):  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1278, in _do_call    return fn(*args)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1263, in _run_fn    options, feed_dict, fetch_list, target_list, run_metadata)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1350, in _call_tf_sessionrun    run_metadata)tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[1,64,1320,2560] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc         [[Node: generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1 = Conv2DBackpropInput[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 2, 2], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1-0-LayoutOptimizer, generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/weights/read, generator/generator_unit/conv_tran2highres/Relu)]]Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

During handling of the above exception, another exception occurred:
Traceback (most recent call last):  File "main.py", line 259, in <module>    output_frame = sess.run(outputs, feed_dict=feed_dict)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 877, in run    run_metadata_ptr)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1100, in _run    feed_dict_tensor, options, run_metadata)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1272, in _do_run    run_metadata)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\client\session.py", line 1291, in _do_call    raise type(e)(node_def, op, message)tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[1,64,1320,2560] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc         [[Node: generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1 = Conv2DBackpropInput[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 2, 2], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1-0-LayoutOptimizer, generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/weights/read, generator/generator_unit/conv_tran2highres/Relu)]]Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

Caused by op 'generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1', defined at:  File "main.py", line 204, in <module>    gen_output = generator_F(inputs_all, 3, reuse=False, FLAGS=FLAGS)  File "D:\TecoGAN-master\lib\frvsr.py", line 76, in generator_F    net = conv2_tran(net, 3, 64, 2, scope='conv_tran2')  File "D:\TecoGAN-master\lib\ops.py", line 40, in conv2_tran    activation_fn=None, weights_initializer=tf.contrib.layers.xavier_initializer())  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\contrib\framework\python\ops\arg_scope.py", line 183, in func_with_args    return func(*args, **current_args)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\contrib\layers\python\layers\layers.py", line 1407, in convolution2d_transpose    outputs = layer.apply(inputs)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 805, in apply    return self.__call__(inputs, *args, **kwargs)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\layers\base.py", line 362, in __call__    outputs = super(Layer, self).__call__(inputs, *args, **kwargs)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 736, in __call__    outputs = self.call(inputs, *args, **kwargs)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\keras\layers\convolutional.py", line 781, in call    data_format=conv_utils.convert_data_format(self.data_format, ndim=4))  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\ops\nn_ops.py", line 1254, in conv2d_transpose    name=name)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\ops\gen_nn_ops.py", line 1228, in conv2d_backprop_input    dilations=dilations, name=name)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper    op_def=op_def)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\util\deprecation.py", line 454, in new_func    return func(*args, **kwargs)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\framework\ops.py", line 3155, in create_op    op_def=op_def)  File "D:\anacon\envs\tcgn\lib\site-packages\tensorflow\python\framework\ops.py", line 1717, in __init__    self._traceback = tf_stack.extract_stack()
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[1,64,1320,2560] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc         [[Node: generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1 = Conv2DBackpropInput[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 2, 2], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/conv2d_transpose_1-0-LayoutOptimizer, generator/generator_unit/conv_tran2highres/conv_tran2/Conv2d_transpose/weights/read, generator/generator_unit/conv_tran2highres/Relu)]]Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

GPUを使う場合は、180/144程度まで元画像のサイズを小さくしないと、大体このエラーが出る。CPUを使う場合は、これでも可能だが、べらぼうに時間がかかるので、実験する時は画像の総量を減らすなどの工夫が必要。

〇成功したんだけど、画像が出てこない

(tcgn) D:\TecoGAN-master>python runGan.py 1Testing test case 1D:\anacon\envs\tcgn\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_convertersUsing TensorFlow backend.input shape: [1, 93, 180, 3]output shape: [1, 372, 720, 3]Finish building the networkLoading weights from ckpt modelFrame evaluation starts!!Warming up 5total time 1.5041420459747314, frame number 1

ログ的には成功しているが、画像のコンバートがされていない場合は、恐らくLR内に入れている画像が少ない。体感、5枚以上は無いとこの現象が起きる。

成功すると、このログが出る。

(tcgn) D:\TecoGAN-master>python runGan.py 1Testing test case 1D:\anacon\envs\tcgn\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_convertersUsing TensorFlow backend.input shape: [1, 93, 180, 3]output shape: [1, 372, 720, 3]Finish building the networkLoading weights from ckpt modelFrame evaluation starts!!Warming up 5Warming up 4Warming up 3Warming up 2Warming up 1saving image output_0002 ←これが、成功のログsaving image output_0003saving image output_0004saving image output_0005total time 2.584836006164551, frame number 9

▼所感
勘違いをしていたが、恐らく、これを使う人の望む効能は
「荒い画像が、綺麗になる」
なのだと思うけど、このツールの効能は、
「その画像を拡大しても、元のサイズと同じ見え方になる」
だと思う。
つまり、拡大しても元の見え方と同じという意味では「画質」は向上していると言えるが、元の画像以上に綺麗になるという事は無いと思う。

また、発想を変えて、元の画像を小さく縮小し、見た目は高解像度な状態の物をコンバートしたが、やはりこれも、大した効果は得られなかったように感じる。
もし、これをモザイク処理を軽減する目的で使用するのであれば、そもそも、何らかの別の手段を用いて、モザイクを軽減した後のデータに適用すべきであって、
最初からTecoganをモザイク軽減に利用するのは、使い方が間違っていると思われる。
ひとまず、今はこのツールはいったん様子見扱いとして、実験を終えることとする。