diff --git a/classifiers/attribute_classifiers/atr_data_io_helper.py b/classifiers/attribute_classifiers/atr_data_io_helper.py index 572704d7e7ab247f1e921f2f665172efa8a122a7..36b810bd07db5f7f83b5d7b8c29bf15c00a93990 100644 --- a/classifiers/attribute_classifiers/atr_data_io_helper.py +++ b/classifiers/attribute_classifiers/atr_data_io_helper.py @@ -19,6 +19,7 @@ def atr_mini_batch_loader(json_data, image_dir, mean_image, start_index, batch_s #image = np.zeros(shape=[img_height, img_width, channels]) crop_shape = np.array([image.shape[0], image.shape[1]])/3 grid_config = json_data[i] + counter = 0; for grid_row in xrange(0,3): for grid_col in xrange(0,3): diff --git a/classifiers/attribute_classifiers/atr_data_io_helper.pyc b/classifiers/attribute_classifiers/atr_data_io_helper.pyc index 457ee8ea56d594f13e29953a5ac035b031255cd4..187b0e4658b6c36ac6b9bbd41bd3757353a845e4 100644 Binary files a/classifiers/attribute_classifiers/atr_data_io_helper.pyc and b/classifiers/attribute_classifiers/atr_data_io_helper.pyc differ diff --git a/classifiers/attribute_classifiers/train_atr_classifier.py b/classifiers/attribute_classifiers/train_atr_classifier.py index 0c59564150a6cfd0ee4f0f6ccee80674ba743ac6..00fc144ad3bf313dab9bbf6bc12c83ee0874a4c8 100644 --- a/classifiers/attribute_classifiers/train_atr_classifier.py +++ b/classifiers/attribute_classifiers/train_atr_classifier.py @@ -83,20 +83,15 @@ def train(train_params): train_acc_array_epoch = np.zeros([max_epoch]) for epoch in range(max_epoch): for i in range(max_iter): - print(i) - # start = time.time() + if i%100==0: + print('Iter: ' + str(i)) train_batch = atr_data_loader.atr_mini_batch_loader(train_json_data, image_dir, mean_image, 1+i*batch_size, batch_size, img_height, img_width) - # end = time.time() - # print(end-start) feed_dict_train={x: train_batch[0], y: train_batch[1], keep_prob: 0.5} _, current_train_batch_acc = sess.run([train_step, accuracy], feed_dict=feed_dict_train) train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] + current_train_batch_acc - # val_acc_array_iter[i+epoch*max_iter] = accuracy.eval(feed_dict_val) - # plotter.plot_accuracy(np.arange(0,i+1+epoch*max_iter)+1, val_acc_array_iter[0:i+1+epoch*max_iter], xlim=[1, max_epoch*max_iter], ylim=[0, 1.], savePath=os.path.join(outdir,'valAcc_vs_iter.pdf')) - # print('Step: {} Val Accuracy: {}'.format(i+1+epoch*max_iter, val_acc_array_iter[i+epoch*max_iter])) train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] / max_iter - val_acc_array_epoch[epoch] = val_acc_array_iter[i+epoch*max_iter] + val_acc_array_epoch[epoch] = accuracy.eval(feed_dict_val) plotter.plot_accuracies(xdata=np.arange(0,epoch+1)+1, ydata_train=train_acc_array_epoch[0:epoch+1], ydata_val=val_acc_array_epoch[0:epoch+1], xlim=[1, max_epoch], ylim=[0, 1.], savePath=os.path.join(outdir,'acc_vs_epoch.pdf')) _ = atr_saver.save(sess, os.path.join(outdir,'atr_classifier'), global_step=epoch) _ = obj_atr_saver.save(sess, os.path.join(outdir,'obj_atr_classifier'), global_step=epoch) diff --git a/classifiers/attribute_classifiers/train_atr_classifier.pyc b/classifiers/attribute_classifiers/train_atr_classifier.pyc index 500169dccf17b7b3efcb303cb4ea2258248b13b3..a80445734eae7f1bbe09a014ed07d0acab095d64 100644 Binary files a/classifiers/attribute_classifiers/train_atr_classifier.pyc and b/classifiers/attribute_classifiers/train_atr_classifier.pyc differ diff --git a/classifiers/object_classifiers/eval_obj_classifier.py b/classifiers/object_classifiers/eval_obj_classifier.py index e9320c43652b62c54349d950f69415ed4ac93cfa..6d209dfb2b9500fb7453d464bc86fef11290fb06 100644 --- a/classifiers/object_classifiers/eval_obj_classifier.py +++ b/classifiers/object_classifiers/eval_obj_classifier.py @@ -1,4 +1,5 @@ import sys +import json import os import matplotlib.pyplot as plt import matplotlib.image as mpimg @@ -20,6 +21,13 @@ def eval(eval_params): saver.restore(sess, eval_params['model_name'] + '-' + str(eval_params['global_step'])) mean_image = np.load(os.path.join(eval_params['out_dir'], 'mean_image.npy')) test_json_filename = eval_params['test_json'] + with open(test_json_filename, 'r') as json_file: + raw_json_data = json.load(json_file) + test_json_data = dict() + for entry in raw_json_data: + if entry['image_id'] not in test_json_data: + test_json_data[entry['image_id']]=entry['config'] + image_dir = eval_params['image_dir'] html_dir = eval_params['html_dir'] if not os.path.exists(html_dir): @@ -39,9 +47,7 @@ def eval(eval_params): batch_size = 100 correct = 0 for i in range(50): - test_batch = shape_data_loader.obj_mini_batch_loader(test_json_filename, image_dir, mean_image, 10000 + i * batch_size, batch_size, 75, 75) - #print(test_batch[0].dtype) -# print([np.amax(test_batch[0][0,:, :, :]), np.amax(mean_image)]) + test_batch = shape_data_loader.obj_mini_batch_loader(test_json_data, image_dir, mean_image, 10000 + i * batch_size, batch_size, 75, 75) feed_dict_test = {x: test_batch[0], y: test_batch[1], keep_prob: 1.0} result = sess.run([accuracy, y_pred], feed_dict=feed_dict_test) correct = correct + result[0] * batch_size diff --git a/classifiers/object_classifiers/eval_obj_classifier.pyc b/classifiers/object_classifiers/eval_obj_classifier.pyc index 48898ca0a27747f6356b9311b4ebe8a2e4f3f745..8b6be912f6e9110be8d3644516b9293701cce808 100644 Binary files a/classifiers/object_classifiers/eval_obj_classifier.pyc and b/classifiers/object_classifiers/eval_obj_classifier.pyc differ diff --git a/classifiers/object_classifiers/obj_data_io_helper.py b/classifiers/object_classifiers/obj_data_io_helper.py index 1e9b435f2b9f058837044ca08a182622af0b750e..16280b4790d82098c662dc78b320d45bc80ac411 100644 --- a/classifiers/object_classifiers/obj_data_io_helper.py +++ b/classifiers/object_classifiers/obj_data_io_helper.py @@ -7,10 +7,7 @@ import numpy as np import tensorflow as tf from scipy import misc -def obj_mini_batch_loader(json_filename, image_dir, mean_image, start_index, batch_size, img_height = 100, img_width = 100, channels = 3): - - with open(json_filename, 'r') as json_file: - json_data = json.load(json_file) +def obj_mini_batch_loader(json_data, image_dir, mean_image, start_index, batch_size, img_height = 100, img_width = 100, channels = 3): obj_images = np.empty(shape=[9 * batch_size, img_height / 3, img_width / 3, channels]) obj_labels = np.zeros(shape=[9 * batch_size, 4]) @@ -19,8 +16,7 @@ def obj_mini_batch_loader(json_filename, image_dir, mean_image, start_index, bat image_name = os.path.join(image_dir, str(i) + '.jpg') image = misc.imresize(mpimg.imread(image_name), (img_height, img_width), interp='nearest') crop_shape = np.array([image.shape[0], image.shape[1]]) / 3 - selected_anno = [ q for q in json_data if q['image_id'] == i ] - grid_config = selected_anno[0]['config'] + grid_config = json_data[i] counter = 0 for grid_row in range(0, 3): @@ -28,27 +24,29 @@ def obj_mini_batch_loader(json_filename, image_dir, mean_image, start_index, bat start_row = grid_row * crop_shape[0] start_col = grid_col * crop_shape[1] cropped_image = image[start_row:start_row + crop_shape[0], start_col:start_col + crop_shape[1], :] + if np.ndim(mean_image) == 0: obj_images[9 * (i - start_index) + counter, :, :, :] = cropped_image / 254.0 else: obj_images[9 * (i - start_index) + counter, :, :, :] = (cropped_image / 254.0) - mean_image + obj_labels[9 * (i - start_index) + counter, grid_config[6 * grid_row + 2 * grid_col]] = 1 counter = counter + 1 return (obj_images, obj_labels) -def mean_image_batch(json_filename, image_dir, start_index, batch_size, img_height = 100, img_width = 100, channels = 3): - batch = obj_mini_batch_loader(json_filename, image_dir, np.empty([]), start_index, batch_size, img_height, img_width, channels) +def mean_image_batch(json_data, image_dir, start_index, batch_size, img_height = 100, img_width = 100, channels = 3): + batch = obj_mini_batch_loader(json_data, image_dir, np.empty([]), start_index, batch_size, img_height, img_width, channels) mean_image = np.mean(batch[0], 0) return mean_image -def mean_image(json_filename, image_dir, num_images, batch_size, img_height = 100, img_width = 100, channels = 3): +def mean_image(json_data, image_dir, num_images, batch_size, img_height = 100, img_width = 100, channels = 3): max_iter = np.floor(num_images / batch_size) mean_image = np.zeros([img_height / 3, img_width / 3, channels]) for i in range(max_iter.astype(np.int16)): - mean_image = mean_image + mean_image_batch(json_filename, image_dir, 1 + i * batch_size, batch_size, img_height, img_width, channels) + mean_image = mean_image + mean_image_batch(json_data, image_dir, 1 + i * batch_size, batch_size, img_height, img_width, channels) mean_image = mean_image / max_iter return mean_image diff --git a/classifiers/object_classifiers/obj_data_io_helper.pyc b/classifiers/object_classifiers/obj_data_io_helper.pyc index 9bdb6c7015cc3a0da7906325045969549a720070..ae5847b62758c1ea8aec0706d785fa461c734d1f 100644 Binary files a/classifiers/object_classifiers/obj_data_io_helper.pyc and b/classifiers/object_classifiers/obj_data_io_helper.pyc differ diff --git a/classifiers/object_classifiers/train_obj_classifier.py b/classifiers/object_classifiers/train_obj_classifier.py index debc76d22ea4565b002b57b77273898abe6e6751..b3711271bc3b6a25ccfab0145724800d104eebe6 100644 --- a/classifiers/object_classifiers/train_obj_classifier.py +++ b/classifiers/object_classifiers/train_obj_classifier.py @@ -1,5 +1,6 @@ import sys import os +import json import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np @@ -25,17 +26,25 @@ def train(train_params): img_width = 75 img_height = 75 train_json_filename = train_params['train_json'] + with open(train_json_filename, 'r') as json_file: + raw_json_data = json.load(json_file) + train_json_data = dict() + for entry in raw_json_data: + if entry['image_id'] not in train_json_data: + train_json_data[entry['image_id']]=entry['config'] + + image_dir = train_params['image_dir'] if train_params['mean_image']=='': print('Computing mean image') - mean_image = atr_data_loader.mean_image(train_json_filename, image_dir, 1000, 100, img_height, img_width) + mean_image = shape_data_loader.mean_image(train_json_data, image_dir, 1000, 100, img_height, img_width) else: print('Loading mean image') mean_image = np.load(train_params['mean_image']) np.save(os.path.join(outdir, 'mean_image.npy'), mean_image) # Val Data - val_batch = shape_data_loader.obj_mini_batch_loader(train_json_filename, image_dir, mean_image, 9501, 499, img_height, img_width) + val_batch = shape_data_loader.obj_mini_batch_loader(train_json_data, image_dir, mean_image, 9501, 499, img_height, img_width) feed_dict_val = {x: val_batch[0], y: val_batch[1], keep_prob: 1.0} # Session Saver @@ -51,16 +60,17 @@ def train(train_params): train_acc_array_epoch = np.zeros([max_epoch]) for epoch in range(max_epoch): for i in range(max_iter): - train_batch = shape_data_loader.obj_mini_batch_loader(train_json_filename, image_dir, mean_image, 1 + i * batch_size, batch_size, img_height, img_width) + if i%100==0: + print('Iter: ' + str(i)) + print('Val Acc: ' + str(accuracy.eval(feed_dict_val))) + + train_batch = shape_data_loader.obj_mini_batch_loader(train_json_data, image_dir, mean_image, 1 + i * batch_size, batch_size, img_height, img_width) feed_dict_train = {x: train_batch[0], y: train_batch[1], keep_prob: 0.5} _, current_train_batch_acc = sess.run([train_step, accuracy], feed_dict=feed_dict_train) train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] + current_train_batch_acc - val_acc_array_iter[i + epoch * max_iter] = accuracy.eval(feed_dict_val) - plotter.plot_accuracy(np.arange(0, i + 1 + epoch * max_iter) + 1, val_acc_array_iter[0:i + 1 + epoch * max_iter], xlim=[1, max_epoch * max_iter], ylim=[0, 1.0], savePath=os.path.join(outdir, 'valAcc_vs_iter.pdf')) - print 'Step: {} Val Accuracy: {}'.format(i + 1 + epoch * max_iter, val_acc_array_iter[i + epoch * max_iter]) train_acc_array_epoch[epoch] = train_acc_array_epoch[epoch] / max_iter - val_acc_array_epoch[epoch] = val_acc_array_iter[i + epoch * max_iter] + val_acc_array_epoch[epoch] = accuracy.eval(feed_dict_val) plotter.plot_accuracies(xdata=np.arange(0, epoch + 1) + 1, ydata_train=train_acc_array_epoch[0:epoch + 1], ydata_val=val_acc_array_epoch[0:epoch + 1], xlim=[1, max_epoch], ylim=[0, 1.0], savePath=os.path.join(outdir, 'acc_vs_epoch.pdf')) save_path = saver.save(sess, os.path.join(outdir, 'obj_classifier'), global_step=epoch) diff --git a/classifiers/object_classifiers/train_obj_classifier.pyc b/classifiers/object_classifiers/train_obj_classifier.pyc index b0dd5d511a461b073a33139526028efddda13b3c..ade9078d1c8faa943b94a78edd7d8a3f03589eaf 100644 Binary files a/classifiers/object_classifiers/train_obj_classifier.pyc and b/classifiers/object_classifiers/train_obj_classifier.pyc differ diff --git a/classifiers/train_classifiers.py b/classifiers/train_classifiers.py index e7d0ba922063e68a0e3e8f6c54e853356a283410..dc0d5aa5317ecb257eed174c990f96607600dc20 100644 --- a/classifiers/train_classifiers.py +++ b/classifiers/train_classifiers.py @@ -1,4 +1,5 @@ import sys +import json import os import matplotlib.pyplot as plt import matplotlib.image as mpimg @@ -10,9 +11,9 @@ import attribute_classifiers.train_atr_classifier as atr_trainer import attribute_classifiers.eval_atr_classifier as atr_evaluator workflow = { - 'train_obj': False, - 'eval_obj': False, - 'train_atr': False, + 'train_obj': True, + 'eval_obj': True, + 'train_atr': True, 'eval_atr': True, } @@ -21,8 +22,8 @@ obj_classifier_train_params = { 'adam_lr': 0.001, 'train_json': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/train_anno.json', 'image_dir': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/images', - 'mean_image': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier/mean_image.npy', -# 'mean_image': '', +# 'mean_image': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier/mean_image.npy', + 'mean_image': '', } obj_classifier_eval_params = {