巷で話題のTecoGAN。
これを試してみたので、導入と使い方と感想を記事にした。
▼TecoGANとは
簡単に言えば、機械学習によって、荒い解像度のドットを、鮮明に映るドットに変換してくれるアプコン(アップコンバート)アルゴリズムのようだ。
私がこれを試した理由は、熟練読者であれば簡単に思いつくと思うが、 あえて使用用途は書かずに、詳細だけお伝えする。
▼導入
簡単に言うと
・Pythonが動く環境を用意する
・Anacondaインストール
・計算用GPU、CPUモジュールのインストール
・TecoGANを用意する
・GITHUBからZIPダウンロード
・学習モデルのインストール
以上だ。
この人の記事を参考にしたので、導入に関しては、私の記事を読み進めるより、こちらの人を参考にした方が良い。
1.Pythonが動く環境を用意する。
1-1. Anacondaのインストール
どうやら、「Anaconda」と呼ばれる、機械学習などに特化したモジュールが使えるようになっている、Pythonの統合環境が存在するようで、まずはそれをインストールする。
こちらからインストールする。
インストールが終わると、「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
本体とパッチ4つをダウンロードして、順次インストール。パッチ1は、もしかしたら反応しないかもしれない。
→cuDNN 7.1
色々入力して会員登録が必要だが、それが済んでから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をダウンロードしてくる。
これを、適当な所に展開しておく。
本来であれば、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をモザイク軽減に利用するのは、使い方が間違っていると思われる。
ひとまず、今はこのツールはいったん様子見扱いとして、実験を終えることとする。