最初に書かせていただくのですが、TensorFlow2.*でtf.flagsが使用できないのは知っています。
自分がお聞きしたいのは、バージョンが変わりflagsの代わりがありそうなのでその使い方をお聞きしたくて質問しました。
こちらのサイトでは
主要な変更
API掃除
tf.app, tf.flags, tf.logging → absl-py
となっており、tf.flagsがabsl-pyでできると思いました。
こちらのサイトを参考にtf.flagsをflagsに変更していきました。
そしたら下記のようなエラーが出てきました
$ python3 hdrcnn_predict.py -h Traceback (most recent call last): File "hdrcnn_predict.py", line 43, in <module> sx = int(np.maximum(32, np.round(FLAGS.width/32.0)*32)) File "/Users/1831083/Library/Python/3.7/lib/python/site-packages/absl/flags/_flagvalues.py", line 499, in __getattr__ raise _exceptions.UnparsedFlagAccessError(error_message) absl.flags._exceptions.UnparsedFlagAccessError: Trying to access flag --width before flags were parsed.
in getattr
raise _exceptions.UnparsedFlagAccessError(error_message)
このエラーは、2つ目のこちらのサイトの下に解決策が書かれており、
解決策:main関数を直接呼び出していないですか?app.run(main)の形で呼び出しましょう。
とあったので、とりあえずapp.run(main)を入れたところ
Python
1# -*- coding: utf-8 -*- 2 3#Copyright (c) 2017, Gabriel Eilertsen. 4#All rights reserved. 5 6import os, sys 7import tensorflow as tf 8import tensorlayer as tl 9import numpy as np 10import network, img_io 11 12from absl import app 13from absl import flags 14 15app.run(main) 16 17eps = 1e-5 18 19def print_(str, color='', bold=False): 20 if color == 'w': 21 sys.stdout.write('\033[93m') 22 elif color == "e": 23 sys.stdout.write('\033[91m') 24 elif color == "m": 25 sys.stdout.write('\033[95m') 26 27 if bold: 28 sys.stdout.write('\033[1m') 29 30 sys.stdout.write(str) 31 sys.stdout.write('\033[0m') 32 sys.stdout.flush() 33 34 35#設定、TensorFlow引数を使用 36FLAGS = flags.FLAGS 37flags.DEFINE_integer("width", "1024", "Reconstruction image width") 38flags.DEFINE_integer("height", "768", "Reconstruction image height") 39flags.DEFINE_string("im_dir", "data", "Path to image directory or an individual image") 40flags.DEFINE_string("out_dir", "out", "Path to output directory") 41flags.DEFINE_string("params", "hdrcnn_params.npz", "Path to trained CNN weights") 42 43flags.DEFINE_float("scaling", "1.0", "Pre-scaling, which is followed by clipping, in order to remove compression artifacts close to highlights") 44flags.DEFINE_float("gamma", "1.0", "Gamma/exponential curve applied before, and inverted after, prediction. This can be used to control the boost of reconstructed pixels.") 45 46#32の倍数に丸めて、オートエンコーダのプーリングとアップサンプリングを行う 47#入力画像と同じサイズになります 48sx = int(np.maximum(32, np.round(FLAGS.width/32.0)*32)) 49sy = int(np.maximum(32, np.round(FLAGS.height/32.0)*32)) 50if sx != FLAGS.width or sy != FLAGS.height: 51 print_("Warning: ", 'w', True) 52 print_("prediction size has been changed from %dx%d pixels to %dx%d\n"%(FLAGS.width, FLAGS.height, sx, sy), 'w') 53 print_("ピクセル、オートエンコーダのプーリングとアップサンプリングに準拠します。\n\n", 'w') 54 55#情報 56print_("\n\n\t-------------------------------------------------------------------\n", 'm') 57print_("\t ディープCNNを使用した単一露光からのHDR画像再構成\n\n", 'm') 58print_("\t 予測設定\n", 'm') 59print_("\t -------------------\n", 'm') 60print_("\t 入力画像のディレクトリ/ファイル:%s\n" % FLAGS.im_dir, 'm') 61print_("\t 出力ディレクトリ:%s\n" % FLAGS.out_dir, 'm') 62print_("\t CNN重み:%s\n" % FLAGS.params, 'm') 63print_("\t 予測解像度: %dx%d ピクセル\n" % (sx, sy), 'm') 64if FLAGS.scaling > 1.0: 65 print_("\t Pre-scaling: %0.4f\n" % FLAGS.scaling, 'm') 66if FLAGS.gamma > 1.0 + eps or FLAGS.gamma < 1.0 - eps: 67 print_("\t Gamma: %0.4f\n" % FLAGS.gamma, 'm') 68print_("\t-------------------------------------------------------------------\n\n\n", 'm') 69 70# シングルフレーム 71frames = [FLAGS.im_dir] 72 73# ディレクトリが指定されている場合は、パス内のすべてのファイルの名前を取得します 74if os.path.isdir(FLAGS.im_dir): 75 frames = [os.path.join(FLAGS.im_dir, name) 76 for name in sorted(os.listdir(FLAGS.im_dir)) 77 if os.path.isfile(os.path.join(FLAGS.im_dir, name))] 78 79#画像入力用のプレースホルダー 80x = tf.placeholder(tf.float32, shape=[1, sy, sx, 3]) 81 82#HDR再構成オートエンコーダモデル 83print_("Network setup:\n") 84net = network.model(x) 85 86#CNN予測(これには入力画像xとのブレンドも含まれます) 87y = network.get_final(net, x) 88 89#推論を実行するためのTensorFlowセッション 90sess = tf.InteractiveSession() 91 92#トレーニング済みのCNNウェイトをロードする 93print_("\nLoading trained parameters from '%s'..."%FLAGS.params) 94load_params = tl.files.load_npz(name=FLAGS.params) 95tl.files.assign_params(sess, load_params, net) 96print_("\tdone\n") 97 98if not os.path.exists(FLAGS.out_dir): 99 os.makedirs(FLAGS.out_dir) 100 101print_("\nStarting prediction...\n\n") 102k = 0 103for i in range(len(frames)): 104 print("Frame %d: '%s'"%(i,frames[i])) 105 106 try: 107 #フレームの読み込み 108 print_("\tReading...") 109 x_buffer = img_io.readLDR(frames[i], (sy,sx), True, FLAGS.scaling) 110 print_("\tdone") 111 112 print_("\t(Saturation: %0.2f%%)\n" % (100.0*(x_buffer>=1).sum()/x_buffer.size), 'm') 113 114 # 実行予測。 115 # ガンマ値は、再構成されたハイライトの強度を高める/減らすことを可能にするために使用されます。 116 # y = f(x)が再構成されたものであれば、ガンマ値 gは、y = f(x^(1/g))^gに従ってこれを変更します。 117 print_("\tInference...") 118 feed_dict = {x: np.power(np.maximum(x_buffer, 0.0), 1.0/FLAGS.gamma)} 119 y_predict = sess.run([y], feed_dict=feed_dict) 120 y_predict = np.power(np.maximum(y_predict, 0.0), FLAGS.gamma) 121 print_("\tdone\n") 122 123 # ガンマ補正出力 124 y_gamma = np.power(np.maximum(y_predict, 0.0), 0.5) 125 126 # ディスクへの書き込み 127 print_("\tWriting...") 128 k += 1; 129 img_io.writeLDR(x_buffer, '%s/%06d_in.png' % (FLAGS.out_dir, k), -3) 130 img_io.writeLDR(y_gamma, '%s/%06d_out.png' % (FLAGS.out_dir, k), -3) 131 img_io.writeEXR(y_predict, '%s/%06d_out.exr' % (FLAGS.out_dir, k)) 132 print_("\tdone\n") 133 134 except img_io.IOException as e: 135 print_("\n\t\tWarning! ", 'w', True) 136 print_("%s\n"%e, 'w') 137 except Exception as e: 138 print_("\n\t\tError: ", 'e', True) 139 print_("%s\n"%e, 'e') 140 141print_("Done!\n") 142 143sess.close()
Traceback (most recent call last):
File "hdrcnn_predict.py", line 12, in <module>
app.run(main)
NameError: name 'main' is not defined
となってしまいました。
このプログラムに元々mainがないので、app.run(main)の入れ方が分かりません。
どうしたら良いのでしょうか?
回答2件
あなたの回答
tips
プレビュー