前回の記事の続きを書いていきます。
前回までで、既存のpix2pixモデルを活用して、トレーニングと検証データを生成することが出来ました。
今回は、学習モデルを保存して、外部のnewデータでpix2pixで予測データを出力していきたいと思います。
引き続き、細かい部分の理解は疎い状態ですが、既存のコードを参考にさせて貰いつついきたいと思います。
大きな流れとしては、
( 1 ):外部の画像データをDataSetへ変換
( 2 ):学習完了したタイミングで、generator modelを活用して、(1)の画像データを用いてgeneratorで画像変換を実行
( 1 ):外部の画像データをDataSetへ変換
imagesSubDataフォルダを作成して、画像データを入れます。
非常に煩雑、かつ、img2h5.pyとほぼ同等ですが、
img2h5_vakidationDataset.py を新しくファイルとして追加します。
※コードは下記
import numpy as np import glob import argparse import h5py import matplotlib.pyplot as plt from keras.preprocessing.image import load_img, img_to_array import cv2 def main(): parser = argparse.ArgumentParser() parser.add_argument('--inpath', '-i', required=True) parser.add_argument('--outpath', '-o', required=True) parser.add_argument('--trans', '-t', default='gray') args = parser.parse_args() finders = glob.glob(args.inpath+'/*') print(finders) imgs = [] gimgs = [] for finder in finders: files = glob.glob(finder+'/*') for imgfile in files: img = load_img(imgfile) imgarray = img_to_array(img) #サイズの変換 imgarray = cv2.resize(imgarray, (128, 128)) imgs.append(imgarray) #画像保存 #plt.imshow(imgarray) #plt.savefig("imgs.png") if args.trans=='gray': grayimg = load_img(imgfile, grayscale=True) grayimgarray = img_to_array(grayimg) gimgs.append(grayimgarray) elif args.trans=='canny': grayimg = cv2.cvtColor(cv2.imread(imgfile), cv2.COLOR_BGR2GRAY) #サイズの変換 grayimg = cv2.resize(grayimg, (128, 128)) gray_canny_xy = cv2.Canny(grayimg, 128,128 ) gray_canny_xy = cv2.bitwise_not(gray_canny_xy) gimgs.append(gray_canny_xy.reshape(128,128,1)) #画像を表示 #plt.imshow(gray_canny_xy) #追加 #plt.show() ''' #画像確認のために、画像データを保存 numberimgs = len(imgs) - 1 for i in range(0,numberimgs): plt.imshow(imgs[i]) #plt.savefig("gimgs.png") p = str(i) plt.savefig("imgs"+p+".png") numbergimgs = len(gimgs) - 1 for i in range(0,numbergimgs): plt.imshow(gimgs[i].squeeze()) #理解出来ていないが、squeeze()することで出来た p = str(i) plt.savefig("gimgs"+p+".png") ''' perm = np.random.permutation(len(imgs)) #print(perm) -->配列返している imgs = np.array(imgs)[perm] #print(imgs.shape) gimgs = np.array(gimgs)[perm] threshold = len(imgs)//10*9 vimgs = imgs[threshold:] #閾値を境に分割 vgimgs = gimgs[threshold:] #同上 imgs = imgs[:threshold] #同上 gimgs = gimgs[:threshold] #同上 print('shapes') print('gen imgs : ', imgs.shape) #print(len(imgs)) --> 画像個数 print('raw imgs : ', gimgs.shape) print('val gen : ', vimgs.shape) print('val raw : ', vgimgs.shape) outh5 = h5py.File(args.outpath+'.hdf5', 'w') outh5.create_dataset('train_data_gen', data=imgs) #imgs => 薄い色合い outh5.create_dataset('train_data_raw', data=gimgs) #gimgs => 黄色と輪郭 outh5.create_dataset('val_data_gen', data=vimgs) outh5.create_dataset('val_data_raw', data=vgimgs) outh5.flush() outh5.close() if __name__=='__main__': main()
コマンドを実行して、
datasetSubimages.hd5 ファイルという画像データが生成されます。
python img2h5_vakidationDataset.py -i imagesSubData/ -o datasetSubimages -t canny
( 2 ):学習完了したタイミングで、generator modelを活用して、(1)の画像データを用いてgeneratorで画像変換を実行
pix2pix.py ファイルの中にコードを追加していきます。
■関数の追加
plot_Subgenerated_batchは、
白黒の画像のみを有力して、pix2pixで色付きに変換した画像を生成するための関数です。
# 画像生成,保存 def plot_Subgenerated_batch(X_raw, generator_model, batch_size, suffix): X_gen = generator_model.predict(X_raw) X_raw = my_inverse_normalization(X_raw) X_gen = my_inverse_normalization(X_gen) Xs = to3d(X_raw[:5]) Xg = to3d(X_gen[:5]) Xs = np.concatenate(Xs, axis=1) Xg = np.concatenate(Xg, axis=1) XX = np.concatenate((Xs,Xg), axis=0) print(X_gen) print(X_gen.shape) plt.imshow(XX) plt.axis('off') plt.savefig("./figures/current_batch_"+suffix+".png") plt.clf() plt.close()
■def my_train(args):に処理を追加していきます。
①:imagesSubDataをloadするための処理
# load data procImage_sub, rawImage_sub, procImage_val_sub, rawImage_val_sub = my_load_data(args.datasetpath_sub) print('procImage.shape : ', procImage_sub.shape) print('rawImage.shape : ', rawImage_sub.shape) print('procImage_val.shape : ', procImage_val_sub.shape) print('rawImage_val.shape : ', rawImage_val_sub.shape)
②:画像データをgeneratorへ入力するためのデータセットへ変形
:学習完了した後のgeneratorに対して、画像データの入力→出力
※def my_train(args):の一番した部分に追加
perm_sub = np.random.permutation(rawImage_sub.shape[0]) X_procImage_sub = procImage_sub[perm_sub] #[perm]でランダム配列を作り、画像データの順番を変更 X_rawImage_sub = rawImage_sub[perm_sub] X_procImageIter_sub = [X_procImage_sub[i:i+args.batch_size] for i in range(0, rawImage_sub.shape[0], args.batch_size)] #batch_sizeに合わせて画像データのサンプリング X_rawImageIter_sub = [X_rawImage_sub[i:i+args.batch_size] for i in range(0, rawImage_sub.shape[0], args.batch_size)] idx = np.random.choice(procImage_val_sub.shape[0], args.batch_size) X_gen_target_sub, X_gen_sub = procImage_val_sub[idx], rawImage_val_sub[idx] #要は順番をランダムにしているだけだよね. #plot_generated_batch(X_gen_target_sub, X_gen_sub, generator_model, args.batch_size, "LastData") #検証 plot_Subgenerated_batch(X_gen_sub, generator_model, args.batch_size, "LastData") #検証 #generator_model.save("./savemodel_gen.h5")
■def main():に処理を追加していきます。
下記を、追加
parser.add_argument(‘–datasetpath_sub’, ‘-s’, type=str, required=True)
■下記のコマンドで実行
python pix2pix.py -d datasetimages.hdf5 -s datasetSubimages.hdf5
そうすると、途中までは通常通りの学習が進んでいき、
最終的に学習が完了したタイミングで、学習完了した後のgeneratorに対して、画像変換が行われる処理が最後に実行されます。
figuresフォルダの中に、current_batch_LastData.pngという画像データが生成されていることでしょう。