From 271e7575694026ab7557253a52f7866828b740e6 Mon Sep 17 00:00:00 2001 From: tgupta6 <tgupta6@illinois.edu> Date: Sun, 20 Mar 2016 19:29:32 -0500 Subject: [PATCH] adding code for answer classifier and region ranker --- classifiers/__init__.py | 0 classifiers/answer_classifier/__init__.py | 0 classifiers/answer_classifier/__init__.pyc | Bin 0 -> 116 bytes .../answer_classifier/ans_data_io_helper.py | 129 ++++++++++++++++ .../answer_classifier/ans_data_io_helper.pyc | Bin 0 -> 4181 bytes .../answer_classifier/train_ans_classifier.py | 141 ++++++++++++++++++ .../#obj_data_io_helper.py# | 82 ++++++++++ .../.#obj_data_io_helper.py | 1 + .../train_obj_classifier.pyc | Bin 3318 -> 3318 bytes classifiers/region_ranker/__init__.py | 0 classifiers/region_ranker/__init__.pyc | Bin 0 -> 112 bytes classifiers/region_ranker/perfect_ranker.py | 53 +++++++ classifiers/region_ranker/perfect_ranker.pyc | Bin 0 -> 1767 bytes classifiers/saved_models/obj_atr_classifier-1 | Bin 0 -> 56054 bytes classifiers/tf_graph_creation_helper.py | 91 +++++++++-- classifiers/tf_graph_creation_helper.pyc | Bin 5656 -> 7351 bytes classifiers/train_classifiers.py | 10 +- 17 files changed, 491 insertions(+), 16 deletions(-) create mode 100644 classifiers/__init__.py create mode 100644 classifiers/answer_classifier/__init__.py create mode 100644 classifiers/answer_classifier/__init__.pyc create mode 100644 classifiers/answer_classifier/ans_data_io_helper.py create mode 100644 classifiers/answer_classifier/ans_data_io_helper.pyc create mode 100644 classifiers/answer_classifier/train_ans_classifier.py create mode 100644 classifiers/object_classifiers/#obj_data_io_helper.py# create mode 120000 classifiers/object_classifiers/.#obj_data_io_helper.py create mode 100644 classifiers/region_ranker/__init__.py create mode 100644 classifiers/region_ranker/__init__.pyc create mode 100644 classifiers/region_ranker/perfect_ranker.py create mode 100644 classifiers/region_ranker/perfect_ranker.pyc create mode 100644 classifiers/saved_models/obj_atr_classifier-1 diff --git a/classifiers/__init__.py b/classifiers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/classifiers/answer_classifier/__init__.py b/classifiers/answer_classifier/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/classifiers/answer_classifier/__init__.pyc b/classifiers/answer_classifier/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26ca6f25daa06ab1bd8e4f8ada822c375fc9f4e5 GIT binary patch literal 116 zcmZSn%*(}}{x&R`0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~ie-UfiFw84sYUV0If=!^ nnQ57+Mf&manR%Hd@$q^El_eZN6*jr~DWy57b|7<#ftUdRGJ+Ml literal 0 HcmV?d00001 diff --git a/classifiers/answer_classifier/ans_data_io_helper.py b/classifiers/answer_classifier/ans_data_io_helper.py new file mode 100644 index 0000000..71b3760 --- /dev/null +++ b/classifiers/answer_classifier/ans_data_io_helper.py @@ -0,0 +1,129 @@ +import json +import sys +import os +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +import numpy as np +import tensorflow as tf +from scipy import misc +from collections import namedtuple +import region_ranker.perfect_ranker as region_proposer + + +qa_tuple = namedtuple('qa_tuple','image_id question answer') + + +def create_ans_dict(): + ans_dict = { + 'yes' : 0, + 'no' : 1, + 'red' : 2, + 'green' : 3, + 'blue' : 4, + 'circle' : 5, + 'rectangle': 6, + 'triangle' : 7, + } + + for i in range(0,10): + ans_dict[str(i)] = 8+i + + inv_ans_dict = {v: k for k, v in ans_dict.items()} + + return ans_dict, inv_ans_dict + + +def parse_qa_anno(json_filename): + with open(json_filename,'r') as json_file: + raw_data = json.load(json_file) + + qa_dict = dict() + for entry in raw_data: + qa_dict[entry['question_id']] = qa_tuple(image_id = entry['image_id'], + question = entry['question'], + answer = entry['answer']) + return qa_dict + + +def get_vocab(qa_dict): + vocab = dict() + count = 0; + for key, value in qa_dict.items(): + for word in value.question[0:-1].split(): + if word.lower() not in vocab: + vocab[word.lower()] = count + count = count + 1 + + if value.answer.lower() not in vocab: + vocab[value.answer.lower()] = count + count = count + 1 + + vocab['unk'] = count + inv_vocab = {v: k for k, v in vocab.items()} + + return vocab, inv_vocab + +def ans_mini_batch_loader(qa_dict, region_anno_dict, ans_dict, vocab, + image_dir, mean_image, start_index, batch_size, + img_height=100, img_width=100, channels = 3): + + # compute the number of proposals + count = 0; + for i in xrange(start_index, start_index + batch_size): + count = count + len(region_anno_dict[qa_dict[i].image_id]) + + region_images = np.empty(shape=[count, img_height, + img_width, channels]) + + ans_labels = np.zeros(shape=[count, len(ans_dict)]) + question_encodings = np.zeros(shape=[count, len(vocab)]) + + counter = 0 + for i in xrange(start_index, start_index + batch_size): + image_id = qa_dict[i].image_id + question = qa_dict[i].question + answer = qa_dict[i].answer + region_coords = region_anno_dict[image_id] + image = mpimg.imread(os.path.join(image_dir, str(image_id) + '.jpg')) + regions = region_proposer.rank_regions(image, question, region_coords) + for _, proposal in regions.items(): + resized_region = misc.imresize(proposal.image, \ + (img_height, img_width)) + region_images[counter,:,:,:] = (resized_region / 254.0) - mean_image + ans_labels[counter, ans_dict[answer]] = 1 + + for word in question[0:-1].split(): + if word not in vocab: + word = 'unk' + question_encodings[counter, vocab[word]] += 1 + + counter = counter + 1 + + return region_images, ans_labels, question_encodings + + +if __name__=='__main__': + train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/train_anno.json' + + region_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/regions_anno.json' + + image_dir = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/images' + + + qa_anno_dict = parse_qa_anno(train_anno_filename) + region_anno_dict = region_proposer.parse_region_anno(region_anno_filename) + ans_dict, _ = create_ans_dict() + vocab, _ = get_vocab(qa_anno_dict) + + + region_images, ans_labels, question_encodings = \ + ans_mini_batch_loader(qa_anno_dict, region_anno_dict, ans_dict, vocab, + image_dir, None, 1, 2, 25, 25, 3) + + print(ans_labels.shape) + print(question_encodings.shape) + print(region_images.shape) + diff --git a/classifiers/answer_classifier/ans_data_io_helper.pyc b/classifiers/answer_classifier/ans_data_io_helper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d03abbe8c016b6f922bcc5fb29c71faa48cdc2b8 GIT binary patch literal 4181 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 F{{gVgVe$X~ literal 0 HcmV?d00001 diff --git a/classifiers/answer_classifier/train_ans_classifier.py b/classifiers/answer_classifier/train_ans_classifier.py new file mode 100644 index 0000000..10d7f9a --- /dev/null +++ b/classifiers/answer_classifier/train_ans_classifier.py @@ -0,0 +1,141 @@ +import sys +import os +import json +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +import numpy as np +import tensorflow as tf +import object_classifiers.obj_data_io_helper as obj_data_loader +import attribute_classifiers.atr_data_io_helper as atr_data_loader +import tf_graph_creation_helper as graph_creator +import plot_helper as plotter +import ans_data_io_helper as ans_io_helper +import region_ranker.perfect_ranker as region_proposer + +def train(train_params): + sess = tf.InteractiveSession() + + train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/train_anno.json' + + regions_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/regions_anno.json' + + image_dir = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/images' + + outdir = '/home/tanmay/Code/GenVQA/Exp_Results/Ans_Classifier' + if not os.path.exists(outdir): + os.mkdir(outdir) + + qa_anno_dict = ans_io_helper.parse_qa_anno(train_anno_filename) + region_anno_dict = region_proposer.parse_region_anno(regions_anno_filename) + ans_vocab, inv_ans_vocab = ans_io_helper.create_ans_dict() + vocab, inv_vocab = ans_io_helper.get_vocab(qa_anno_dict) + + # Create graph + image_regions, questions, keep_prob, y = \ + graph_creator.placeholder_inputs_ans(len(vocab), len(ans_vocab), + mode='gt') + y_pred_obj = graph_creator.obj_comp_graph(image_regions, keep_prob) + obj_feat = tf.get_collection('obj_feat', scope='obj/conv2') + y_pred_atr = graph_creator.atr_comp_graph(image_regions, keep_prob, obj_feat[0]) + atr_feat = tf.get_collection('atr_feat', scope='atr/conv2') + + # model restoration + obj_atr_saver = tf.train.Saver() + model_to_restore = '/home/tanmay/Code/GenVQA/GenVQA/classifiers/' + \ + 'saved_models/obj_atr_classifier-1' + obj_atr_saver.restore(sess, model_to_restore) + + y_pred = graph_creator.ans_comp_graph(image_regions, questions, keep_prob, \ + obj_feat[0], atr_feat[0], + vocab, inv_vocab, len(ans_vocab)) + cross_entropy = graph_creator.loss(y, y_pred) + accuracy = graph_creator.evaluation(y, y_pred) + + # Collect variables + vars_to_opt = tf.get_collection(tf.GraphKeys.VARIABLES, scope='ans') + train_step = tf.train.AdamOptimizer(train_params['adam_lr']) \ + .minimize(cross_entropy, var_list=vars_to_opt) + + vars_to_restore = [] + vars_to_restore.append(tf.get_collection(tf.GraphKeys.VARIABLES, + scope='obj')) + vars_to_restore.append(tf.get_collection(tf.GraphKeys.VARIABLES, + scope='atr')) + all_vars = tf.get_collection(tf.GraphKeys.VARIABLES) + vars_to_init = [var for var in all_vars if var not in vars_to_restore] + + # Session saver + saver = tf.train.Saver() + + # Initializing all variables except those restored + print('Initializing variables') + sess.run(tf.initialize_variables(vars_to_init)) + + # Load mean image + mean_image = np.load('/home/tanmay/Code/GenVQA/Exp_Results/' + \ + 'Obj_Classifier/mean_image.npy') + + # Val data + val_region_images, val_ans_labels, val_questions = \ + ans_io_helper.ans_mini_batch_loader(qa_anno_dict, region_anno_dict, + ans_vocab, vocab, image_dir, + mean_image, 9501, 499, + 25, 25, 3) + feed_dict_val = { + image_regions : val_region_images, + questions: val_questions, + keep_prob: 1.0, + y: val_ans_labels, + } + + + # Start Training + batch_size = 10 + max_epoch = 10 + max_iter = 950 + val_acc_array_epoch = np.zeros([max_epoch]) + train_acc_array_epoch = np.zeros([max_epoch]) + for epoch in range(max_epoch): + for i in range(max_iter): + if i%100==0: + print('Iter: ' + str(i)) + print('Val Acc: ' + str(accuracy.eval(feed_dict_val))) + + train_region_images, train_ans_labels, train_questions = \ + ans_io_helper.ans_mini_batch_loader(qa_anno_dict, region_anno_dict, + ans_vocab, vocab, image_dir, + mean_image, 1+i*batch_size, + batch_size, 25, 25, 3) + feed_dict_train = { + image_regions : train_region_images, + questions: train_questions, + keep_prob: 1.0, + y: train_ans_labels, + } + _, 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 + + train_acc_array_epoch[epoch] = train_acc_array_epoch[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, 'ans_classifier'), + global_step=epoch) + + sess.close() + tf.reset_default_graph() + +if __name__=='__main__': + train_params = { + 'adam_lr' : 0.001, + } + train(train_params) diff --git a/classifiers/object_classifiers/#obj_data_io_helper.py# b/classifiers/object_classifiers/#obj_data_io_helper.py# new file mode 100644 index 0000000..16280b4 --- /dev/null +++ b/classifiers/object_classifiers/#obj_data_io_helper.py# @@ -0,0 +1,82 @@ +import json +import sys +import os +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +import numpy as np +import tensorflow as tf +from scipy import misc + +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]) + + for i in range(start_index, start_index + batch_size): + 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 + grid_config = json_data[i] + + counter = 0 + for grid_row in range(0, 3): + for grid_col in range(0, 3): + 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_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_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_data, image_dir, 1 + i * batch_size, batch_size, img_height, img_width, channels) + + mean_image = mean_image / max_iter + return mean_image + + +class html_obj_table_writer: + + def __init__(self, filename): + self.filename = filename + self.html_file = open(self.filename, 'w') + self.html_file.write('<!DOCTYPE html>\n<html>\n<body>\n<table border="1" style="width:100%"> \n') + + def add_element(self, col_dict): + self.html_file.write(' <tr>\n') + for key in range(len(col_dict)): + self.html_file.write(' <td>{}</td>\n'.format(col_dict[key])) + + self.html_file.write(' </tr>\n') + + def image_tag(self, image_path, height, width): + return '<img src="{}" alt="IMAGE NOT FOUND!" height={} width={}>'.format(image_path, height, width) + + def close_file(self): + self.html_file.write('</table>\n</body>\n</html>') + self.html_file.close() + + +if __name__ == '__main__': + html_writer = html_obj_table_writer('/home/tanmay/Code/GenVQA/Exp_Results/Shape_Classifier_v_1/trial.html') + col_dict = {0: 'sam', + 1: html_writer.image_tag('something.png', 25, 25)} + html_writer.add_element(col_dict) + html_writer.close_file() diff --git a/classifiers/object_classifiers/.#obj_data_io_helper.py b/classifiers/object_classifiers/.#obj_data_io_helper.py new file mode 120000 index 0000000..8c52df0 --- /dev/null +++ b/classifiers/object_classifiers/.#obj_data_io_helper.py @@ -0,0 +1 @@ +tanmay@crunchy.15752:1450461082 \ No newline at end of file diff --git a/classifiers/object_classifiers/train_obj_classifier.pyc b/classifiers/object_classifiers/train_obj_classifier.pyc index ade9078d1c8faa943b94a78edd7d8a3f03589eaf..b03422c5963b73ccb531ea7d02982f1893120892 100644 GIT binary patch delta 15 Wcmew+`Aw3I`7<w9TIfc$4?F-b=>?zw delta 15 Wcmew+`Aw3I`7<w<vHwQ44?F-anFVJ6 diff --git a/classifiers/region_ranker/__init__.py b/classifiers/region_ranker/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/classifiers/region_ranker/__init__.pyc b/classifiers/region_ranker/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c2e503016fdd3a445acd9aaba36ac4fed1a1924 GIT binary patch literal 112 zcmZSn%*!R8{x&R`0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~iY0+!MXBkT`FZh0iFw(n jMf&manR%Hd@$q^El_eZNS)1Jal+v73JCGU0K+FID%u5s) literal 0 HcmV?d00001 diff --git a/classifiers/region_ranker/perfect_ranker.py b/classifiers/region_ranker/perfect_ranker.py new file mode 100644 index 0000000..737dfad --- /dev/null +++ b/classifiers/region_ranker/perfect_ranker.py @@ -0,0 +1,53 @@ +import json +import os +import numpy as np +from collections import namedtuple +import matplotlib.pyplot as plt +import matplotlib.image as mpimg +from scipy import misc +region = namedtuple('region','image score coord') + +def parse_region_anno(json_filename): + with open(json_filename,'r') as json_file: + raw_data = json.load(json_file) + + region_anno_dict = dict() + for entry in raw_data: + region_anno_dict[entry['image_id']] = entry['regions'] + + return region_anno_dict + + +def rank_regions(image, question, region_coords): + regions = dict() + count = 1; + for key in region_coords: + x1, y1, x2, y2 = region_coords[key] + cropped_image = image[y1-1:y2, x1-1:x2, :] + + if key in question: + score = 1 + else: + score = 0 + + regions[count] = region(image=cropped_image, score=score, + coord=region_coords[key]) + count = count + 1 + + return regions + + +if __name__=='__main__': + image_dir = '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/images/' + + json_filename = os.path.join('/home/tanmay/Code/GenVQA/GenVQA/', + 'shapes_dataset/regions_anno.json') + region_anno_dict = parse_region_anno(json_filename) + + image_id = 1 + question = 'Is there a blue triangle?' + region_coords = region_anno_dict[image_id] + image = mpimg.imread(os.path.join(image_dir, str(image_id) + '.jpg')) + regions = rank_regions(image, question, region_coords) + print(regions) + diff --git a/classifiers/region_ranker/perfect_ranker.pyc b/classifiers/region_ranker/perfect_ranker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04058d905a9d6519d32eafa0d15668d4dd4f9191 GIT binary patch literal 1767 zcmb7EOK&4Z5dM1nh+lbc9)=)%^o3aL0WJ{_Ez-gz(#}d7Gy;ug-5qC~d1bmSV##wd zoDoNU1;307`~aw`aW)aBWggYlJyq2;-&fU*zqflgfBpGpip|xc@hf`mfdVu=3JDOr z(-i{su<jvfi0&b2B5fgPL2Z26m~SEIJeYPd?;+^Rw1H%RbQ{4olxaaXp<7r}upQ_& zex}`ap|?cYgV~4f;MPOAqjVR+0gS@@5c6lyJ?OqT9>MIw9AQn_9YYTgoIukCr!dDb zCm04pm_FtoJUSZ+^dWyEAH9PU+Mm69FtjI0avfsbKyU_ghL_)F0>$g`E@2b@L)Yb) z0D|k0$fDF}w<r=*uQh2cjqTL6Nh!@N&NI7DYMe$hGqTgXG^1&rmwL(}7;!dyL9e|c z;eeIwMmha@j7q`LFMC)iPO<WEMHs*O-ZiiWss`>ySb6y7$5T{ItO!jH!&O7H28I`R zpW}+Aug9F$C557#+!o6^GuI(qQVU}(Mvg7>!epY%ZC)!$9%)(8@zjkuZMRK=zlYax zVi*S3eYzr{%jl<2M=o-E^r_x6jIt~bIgH~lv{AVnlL8U;<440X%5F_LDNK27rY@|f z=f%=7o<&qz6Fv#aWY_@-r~`H6b=9^y_NEP*^CG7vApb!Mfn1|U1x~Qt|6XJG8>$v- zs}_boG*PutZK3L*>M|#*E$)ZYRTsaINxPnOctVWOL&`NlUiH|Y=(=qa)NEDtk&(H_ z3NfIG9V%X8i#p=nerq&p+Af$xg%ir_?s!8USIA||<i+$ta1+u*lbRAu>T2wfiO>J* zvo_|x_Zfa6<ZfZCqnZ@<Ht30)^_lohm__EO!hl<|bR6XVQyG@^aR0oXJ(nQUGA|0F zLrKVIYW^pioFH?%A=4hw+@6wv>Z&%=s6O!qs_V7A1GTSqJo%9@OrtmpL;D#SPHytl zOk9+u(Q@)4*Jkq4WN%)5{V>>@s4!M4(Hb|ARPDr$-p7@V{^P%C9;xJWZUN!O4$1O6 zJ90OMdORAvO%`V4$~ekqiTTnpyyx>`HvWhdpL<YH%&lOaEmA6M#yTrppN46kBvkc$ zeE2kl6nz@GBFSA6zoj-{O-`AO%7hh(lU93TSo0zU!2OmMaXQ=7O<XK}t|}=MpHDac zjKl_CZs{<Trj{7gv!xsXMdWVk(;<&DpZm_|v%u%@{vnHJBqX&sEe#zUoSJo|l-Of+ vynn-Y$p0eE^&&A}aKe^d2a4}KwM#ciuiNh)4pf^<MGd?*l}=BM=`8pc&0}$` literal 0 HcmV?d00001 diff --git a/classifiers/saved_models/obj_atr_classifier-1 b/classifiers/saved_models/obj_atr_classifier-1 new file mode 100644 index 0000000000000000000000000000000000000000..42cdbdeee4258628b462858e974530aa66833168 GIT binary patch literal 56054 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 literal 0 HcmV?d00001 diff --git a/classifiers/tf_graph_creation_helper.py b/classifiers/tf_graph_creation_helper.py index 43d0c6e..71240aa 100644 --- a/classifiers/tf_graph_creation_helper.py +++ b/classifiers/tf_graph_creation_helper.py @@ -1,5 +1,6 @@ import numpy as np import tensorflow as tf +import answer_classifier.ans_data_io_helper as ans_io_helper def weight_variable(shape, var_name = 'W'): initial = tf.truncated_normal(shape, stddev=0.1) @@ -30,6 +31,18 @@ def placeholder_inputs(mode = 'gt'): print 'No placeholder for ground truth' return (x, keep_prob) +def placeholder_inputs_ans(total_vocab_size, ans_vocab_size, mode='gt'): + image_regions = tf.placeholder(tf.float32, shape=[None,25,25,3]) + keep_prob = tf.placeholder(tf.float32) + questions = tf.placeholder(tf.float32, shape=[None,total_vocab_size]) + if mode == 'gt': + print 'Creating placeholder for ground truth' + gt_answer = tf.placeholder(tf.float32, shape=[None, ans_vocab_size]) + return (image_regions, questions, keep_prob, gt_answer) + if mode == 'no_gt': + print 'No placeholder for ground truth' + return (image_regions, questions, keep_prob) + def obj_comp_graph(x, keep_prob): with tf.name_scope('obj') as obj_graph: @@ -77,6 +90,50 @@ def atr_comp_graph(x, keep_prob, obj_feat): tf.add_to_collection('atr_feat', h_pool2_drop_flat) return y_pred +def ans_comp_graph(image_regions, questions, keep_prob, \ + obj_feat, atr_feat, vocab, inv_vocab, ans_vocab_size): + with tf.name_scope('ans') as ans_graph: + + with tf.name_scope('word_embed') as word_embed: + initial = tf.random_uniform(shape=[len(vocab),100], minval=0, maxval=1) + word_vecs = tf.Variable(initial, name='word_vecs') + + with tf.name_scope('q_embed') as q_embed: + q_feat = tf.matmul(questions, word_vecs) + num_words = tf.reduce_sum(questions, 1, keep_dims=True) + q_feat = tf.truediv(q_feat, num_words) + + with tf.name_scope('conv1') as conv1: + W_conv1 = weight_variable([5,5,3,4]) + b_conv1 = bias_variable([4]) + h_conv1 = tf.nn.relu(conv2d(image_regions, W_conv1) + b_conv1, name='h') + h_pool1 = max_pool_2x2(h_conv1) + h_conv1_drop = tf.nn.dropout(h_pool1, keep_prob, name='h_pool_drop') + + with tf.name_scope('conv2') as conv2: + W_conv2 = weight_variable([3,3,4,8]) + b_conv2 = bias_variable([8]) + h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2, name='h') + h_pool2 = max_pool_2x2(h_conv2) + h_pool2_drop = tf.nn.dropout(h_pool2, keep_prob, name='h_pool_drop') + h_pool2_drop_flat = tf.reshape(h_pool2_drop, [-1, 392], name='h_pool_drop_flat') + + with tf.name_scope('fc1') as fc1: + W_region_fc1 = weight_variable([392, ans_vocab_size], var_name='W_region') + W_obj_fc1 = weight_variable([392, ans_vocab_size], var_name='W_obj') + W_atr_fc1 = weight_variable([392, ans_vocab_size], var_name='W_atr') + W_q_fc1 = weight_variable([100, ans_vocab_size], var_name='W_q') + b_fc1 = bias_variable([ans_vocab_size]) + + y_pred = tf.nn.softmax(tf.matmul(h_pool2_drop_flat, W_region_fc1) + \ + tf.matmul(obj_feat, W_obj_fc1) + \ + tf.matmul(atr_feat, W_atr_fc1) + \ + tf.matmul(q_feat, W_q_fc1) + b_fc1) + + tf.add_to_collection('region_feat', h_pool2_drop_flat) + tf.add_to_collection('q_feat', q_feat) + + return y_pred def evaluation(y, y_pred): correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_pred, 1), name='correct_prediction') @@ -91,19 +148,31 @@ def loss(y, y_pred): if __name__ == '__main__': lg_dir = '/home/tanmay/Code/GenVQA/Exp_Results/lg_files/' + + ans_vocab, _ = ans_io_helper.create_ans_dict() + + train_anno_filename = '/home/tanmay/Code/GenVQA/GenVQA/' + \ + 'shapes_dataset/train_anno.json' + + qa_dict = ans_io_helper.parse_qa_anno(train_anno_filename) + vocab, inv_vocab = ans_io_helper.get_vocab(qa_dict) + g = tf.Graph() with g.as_default(): - x, y, keep_prob = placeholder_inputs(mode='gt') - y_pred = obj_comp_graph(x, keep_prob) + image_regions, questions, keep_prob = \ + placeholder_inputs_ans(len(vocab), len(ans_vocab), mode='no_gt') + y_pred = obj_comp_graph(image_regions, keep_prob) obj_feat = tf.get_collection('obj_feat', scope='obj/conv2') - y_pred2 = atr_comp_graph(x, keep_prob, obj_feat[0]) - accuracy = evaluation(y, y_pred2) - accuracy_summary = tf.scalar_summary('accuracy', accuracy) + y_pred2 = atr_comp_graph(image_regions, keep_prob, obj_feat[0]) + atr_feat = tf.get_collection('atr_feat', scope='atr/conv2') + y_pred3 = ans_comp_graph(image_regions, questions, keep_prob, \ + obj_feat[0], atr_feat[0], + vocab, inv_vocab, len(ans_vocab)) +# accuracy = evaluation(y, y_pred2) sess = tf.Session() sess.run(tf.initialize_all_variables()) - merged = tf.merge_all_summaries() - summary_writer = tf.train.SummaryWriter(lg_dir, graph_def=g.as_graph_def()) - result = sess.run([merged, y_pred], feed_dict={x: np.random.rand(10, 25, 25, 3), - y: np.random.rand(10, 4), - keep_prob: 1.0}) - summary_writer.add_summary(result[0], 1) + # result = sess.run([merged, y_pred], feed_dict={x: np.random.rand(10, 25, 25, 3), + # y: np.random.rand(10, 4), + # keep_prob: 1.0}) + + diff --git a/classifiers/tf_graph_creation_helper.pyc b/classifiers/tf_graph_creation_helper.pyc index cc7087d41170050991a04ef6986c615efc6ba662..0a2ca99d6b8999cdfb57a84d3560b6204947ad8c 100644 GIT binary patch literal 7351 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 delta 1611 zcmai!&2Jk;6u{s3d+l9kZO7k^QzuU1gq8{ffubh#K<I%~YPV8@TqJAdnV5BLr`lap z<zyuHzyXPmx%3a<0vw2x1BYIEfHOrx{0|5usCwb!0Pl_CriYsDdVl-oea)MBv;OwN zy|d-uV<UdG{p*c3oLmOJFX7|;^jWzw3IGqnT?Wk%aQuap90rd1h>|0~qrhWIMnMA} zS8@z^0`3AdQKKs%4%|>e0(ephItT;!9NY?k`;c)Hnn@5r=+40y15FU-2)Zd6e6r4% zz?3PPVGQiOAT-m^%s_J<ga#rFVjji;Xl7M{9Pl*o3~*F3*35&5pZJJ8@GKO^7+(O9 z0FePvP?1FySpuE|QB;~Th!Iv(QPnJfSb%O-IW3ZA%z#m`XOy|73`@{m29X4gGn&w? zPyASOWg3ibS?J*A6~GCCV9;HK?i%nSaGV)`Wf+I3)Xj<Q(uomk2vDt?9P5~eO<Gk0 z#0qrRK{V8oc$IwE9%pdv-2ni;uQwLuKkP?#S$<z!*4sVX^PGK0xZZhbYZduhAj3kR z2fvtQ|1Owfn*2HV;Mor4h?T-~l9cyDKRnx`BEJfoEPZ@G{3)B|aVwh3<><Jj5y0v! z&2$!KRc0K2qx}_NHTk8!!|L*P{U%$L?-=K1CAw#%+0yaX#&%$<hMAl&AxH=ztN>w& zuuP~UoEYI>yqu31>Q>0GDp$={ZZt^L2s*(etP^O(7S(HQ5MCghC7dI?h-fG)t;Sj) ztP#!=YVy#mMAg*RtMbTPzy&=r&txx>aSK7SPT<XG*-k1QxqwdIhCDKs<%g++9OZv0 zQLyzk;qo+t$~7a+TpYc`2X=30`_94Onmj7Fulb~O1s}FW%NzE6+PdCBr$KM4N>H<0 zLFxH*4vI0hC+`$@qgI7N*JQp_dy9(mX;(Y0ef#|u7yD|oF9dIKr|mmbf>R_sX<P?K zc>VFFgDrx_hTJVRHlAwDX+sv#Zfz5G2)l%<^6yebeq3HORYTM=R9Cj-gK~b0dgDhC zhppSV^q1B4`AJlGZM$c?v=M#VJ@n}S*zNYvwcCeNrTnw}#>mg0r7zr$XxY8qiOCV3 zADQa8PbblLZD-)qf9v&0%01Wdh3nJtvc1;nhN#IWF0DHgA4=ug1Afr==_r$^(!0W| z4|~3!pd6e}>pJbu|DAy=F^sy{Kj6cj*ru)ZUPtIm59ndMLwM_2UMpx3Ev&N$ev}3) UusN1xIV63g8GNejB^(><KTO(Di~s-t diff --git a/classifiers/train_classifiers.py b/classifiers/train_classifiers.py index dc0d5aa..2600262 100644 --- a/classifiers/train_classifiers.py +++ b/classifiers/train_classifiers.py @@ -11,10 +11,10 @@ import attribute_classifiers.train_atr_classifier as atr_trainer import attribute_classifiers.eval_atr_classifier as atr_evaluator workflow = { - 'train_obj': True, - 'eval_obj': True, - 'train_atr': True, - 'eval_atr': True, + 'train_obj': False, + 'eval_obj': False, + 'train_atr': False, + 'eval_atr': False, } obj_classifier_train_params = { @@ -28,7 +28,7 @@ obj_classifier_train_params = { obj_classifier_eval_params = { 'out_dir': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier', - 'model_name': '/home/tanmay/Code/GenVQA/Exp_Results/Obj_Classifier/obj_classifier', + 'model_name': '/home/tanmay/Code/GenVQA/Exp_Results/Atr_Classifier/obj_atr_classifier', 'global_step': 1, 'test_json': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/test_anno.json', 'image_dir': '/home/tanmay/Code/GenVQA/GenVQA/shapes_dataset/images', -- GitLab