- 投稿日:2020-06-23T21:33:05+09:00
Cycle GANをCoreMLモデルに変換
*論文:サイクルでつながった敵対的ネットワークを使用するペアになっていない画像から画像への変換
CoreMLに変換することでCycleGAN画像変換をiPhoneアプリで使用できます。
このストーリーでは、TensorFlow CoreのCycleGANチュートリアルモデルを使用します。
最初に、Colaboratoryでチュートリアルモデルをトレーニングします。
colabの以下のセルまでの全てのセルを実行します。
colabfor epoch in range(EPOCHS): start = time.time() n = 0 for image_x, image_y in tf.data.Dataset.zip((train_horses, train_zebras)): train_step(image_x, image_y) if n % 10 == 0: print ('.', end='') n+=1 clear_output(wait=True) # Using a consistent image (sample_horse) so that the progress of the model # is clearly visible. generate_images(generator_g, sample_horse) if (epoch + 1) % 5 == 0: ckpt_save_path = ckpt_manager.save() print ('Saving checkpoint for epoch {} at {}'.format(epoch+1, ckpt_save_path)) print ('Time taken for epoch {} is {} sec\n'.format(epoch + 1, time.time()-start))モデルのトレーニングが完了したら、新しいセルを挿入して以下の手順で変換を実行します。
1、TFCoreMLをインストールします。
colab!pip install --upgrade tfcoreml2、チェックポイントを復元します。
colabcheckpoint_path = "./checkpoints/train" ckpt = tf.train.Checkpoint(generator_g=generator_g, generator_f=generator_f, discriminator_x=discriminator_x, discriminator_y=discriminator_y, generator_g_optimizer=generator_g_optimizer, generator_f_optimizer=generator_f_optimizer, discriminator_x_optimizer=discriminator_x_optimizer, discriminator_y_optimizer=discriminator_y_optimizer) ckpt_manager = tf.train.CheckpointManager(ckpt, checkpoint_path, max_to_keep=5) # if a checkpoint exists, restore the latest checkpoint. if ckpt_manager.latest_checkpoint: ckpt.restore(ckpt_manager.latest_checkpoint) print ('Latest checkpoint restored!!')3、「saved_model」フォーマットでジェネレータg(これがhorse2zebraジェネレーターです。ジェネレーターfはzebra2horse)を保存します。
colabgenerator_g.save( './ savedmodel')4、変換を実行します。
import tfcoreml input_name = generator.inputs[0].name.split(':')[0] print(input_name) #Check input_name. keras_output_node_name = generator_g.outputs[0].name.split(':')[0] graph_output_node_name = keras_output_node_name.split('/')[-1] mlmodel = tfcoreml.convert('./savedmodel', input_name_shape_dict={input_name: (1, 256, 256, 3)}, output_feature_names=[graph_output_node_name], minimum_ios_deployment_target='13', image_input_names=input_name, image_scale=2/ 255.0, red_bias=-1, green_bias=-1, blue_bias=-1, ) mlmodel.save('./cyclegan.mlmodel')これで、iOSプロジェクトでCycleGANを使用できます。
import Vision lazy var coreMLRequest:VNCoreMLRequest = { let model = try! VNCoreMLModel(for: cyclegan().model) let request = VNCoreMLRequest(model: mode, completionHandler: self.coreMLCompletionHandler0) return request }() let handler = VNImageRequestHandler(ciImage: ciimage,options: [:]) DispatchQueue.global(qos: .userInitiated).async { try? handler.perform([coreMLRequest]) }multiArrayを画像として視覚化するには、Hollance氏のCoreML Helpersが非常に便利です。
MultiArrayからImageへの変換 CoreMLHelper
自分でデータセットを用意してトレーニングすれば何2何でも作れます!
- 投稿日:2020-06-23T19:12:13+09:00
TensorFlow2の動作確認用のコードサンプル(非チュートリアル)
インストール直後にやるべき動作確認
TensorFlowをインストールしたあと、動作確認に使うコードのサンプルを紹介します。
- バージョン確認だけだと、学習させたときにエラーが出ないか、GPUを使っているかなどの確認ができない。
- チュートリアルだと長過ぎる(というかコピペできるように紹介してない)ことが多い。
ので、簡単な動作確認として、バージョンとGPU確認、最低限の学習をするコードを書いています。
import numpy as np import tensorflow as tf print(tf.__version__) gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: logical_gpus = tf.config.experimental.list_logical_devices('GPU') print("Physical GPUs: {}, Logical GPUs: {}".format(len(gpus), len(logical_gpus))) else: print("CPU only") x = np.arange(-1, 1, 0.0001) y = 0.8 * x + 0.2 model = tf.keras.Sequential([tf.keras.layers.Dense(1, activation=None)]) model.compile("sgd", "mse") model.build(input_shape=(0,1)) model.summary() model.fit(x, y, epochs=5) print("ground truth: 0.8, 0.2") print("estimated: ", model.variables[0][0,0].numpy(), model.variables[1][0].numpy())バージョンやGPUの情報がTensorFlowのログに紛れて見にくいので、必要に応じて改行とかを入れてください。
dockerを使っていたりすると、GPUの設定を間違えやすいので、GPUが認識されているかはしっかり確認しましょう。
学習中にnvidia-smi
でGPUが使われているかの確認もしておきましょう。
学習が始まるとGPU-UtilとMemory-Usageが増えて、学習が終わるとGPU-Utilだけ下がり、Memory-Usageはそのままになるはずです。学習については、$y = ax + b$の$a(=0.8)$, $b=(0.2)$を線形回帰していて、
estimated
として近い値を求められていればOKです。
- 投稿日:2020-06-23T19:12:13+09:00
TensorFlow2の動作確認(非チュートリアル)
インストール直後にやるべき動作確認
TensorFlowをインストールしたあと、動作確認に使うコードのサンプルを紹介します。
- バージョン確認だけだと、学習させたときにエラーが出ないか、GPUを使っているかなどの確認ができない。
- チュートリアルだと長過ぎる(というかコピペできるように紹介してない)ことが多い。
ので、簡単な動作確認として、バージョンとGPU確認、最低限の学習をするコードを書いています。
import numpy as np import tensorflow as tf print(tf.__version__) gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: logical_gpus = tf.config.experimental.list_logical_devices('GPU') print("Physical GPUs: {}, Logical GPUs: {}".format(len(gpus), len(logical_gpus))) else: print("CPU only") x = np.arange(-1, 1, 0.0001) y = 0.8 * x + 0.2 model = tf.keras.Sequential([tf.keras.layers.Dense(1, activation=None)]) model.compile("sgd", "mse") model.build(input_shape=(0,1)) model.summary() model.fit(x, y, epochs=5) print("ground truth: 0.8, 0.2") print("estimated: ", model.variables[0][0,0].numpy(), model.variables[1][0].numpy())バージョンやGPUの情報がTensorFlowのログに紛れて見にくいので、必要に応じて改行とかを入れてください。
dockerを使っていたりすると、GPUの設定を間違えやすいので、GPUが認識されているかはしっかり確認しましょう。
学習中にnvidia-smi
でGPUが使われているかの確認もしておきましょう。
学習が始まるとGPU-UtilとMemory-Usageが増えて、学習が終わるとGPU-Utilだけ下がり、Memory-Usageはそのままになるはずです。学習については、$y = ax + b$の$a(=0.8)$, $b=(0.2)$を線形回帰していて、
estimated
として近い値を求められていればOKです。