From 2020afd6e804bbd8b8410be0a605f34a388a03c3 Mon Sep 17 00:00:00 2001 From: chinan Date: Thu, 12 Oct 2017 22:20:30 +0800 Subject: [PATCH 1/9] version 1 --- results/extract_feature.py | 128 +++++++++++++++ results/obj_fc_align.py | 308 +++++++++++++++++++++++++++++++++++++ results/vgg19.py | 128 +++++++++++++++ 3 files changed, 564 insertions(+) create mode 100644 results/extract_feature.py create mode 100644 results/obj_fc_align.py create mode 100644 results/vgg19.py diff --git a/results/extract_feature.py b/results/extract_feature.py new file mode 100644 index 0000000..df2c3d3 --- /dev/null +++ b/results/extract_feature.py @@ -0,0 +1,128 @@ +import os +import sys +import argparse +import numpy as np +import vgg19 +import tensorflow as tf +import skimage.io +import skimage.transform + +def parse_args(): + parser = argparse.ArgumentParser(description='convert data to feature') + parser.add_argument('--source_path', dest='source_path', help='path of the data', + default='.', type=str) + parser.add_argument('--target_path', dest='target_path', help='path to store feature map', + default='./feature_fc', type=str) + parser.add_argument('--batch_size', dest='batch_size', help='batch_size', + default='32', type=int) + + if len(sys.argv) == 1: + parser.print_help() + sys.exit(1) + + args = parser.parse_args() + return args + +global args +args = parse_args() + +class Data: + def __init__(self): + self.frame_path = os.path.join(args.source_path, 'frames') + self.label_path = os.path.join(args.source_path, 'labels') + self.target_path = args.target_path + self.batch_size = args.batch_size + + if not os.path.exists(self.target_path): + os.makedirs(self.target_path) + + + def load_data(self): + batch_data = [] + batch_path = [] + total = 0 + num = 0 + for dirpath, dirnames, filenames in os.walk(self.frame_path): + for f in filenames: + total += 1 + for dirpath, dirnames, filenames in os.walk(self.frame_path): + for f in filenames: + num += 1 + filepath = os.path.join(dirpath, f) + img = self.load_image(filepath) + batch_data.append(img) + batch_path.append([dirpath, f]) + if len(batch_path) == self.batch_size: + batch_data = np.asarray(batch_data) + batch_path = np.asarray(batch_path) + feature_map_batch = self.extract_feature(batch_data, batch_size=self.batch_size) + for i in range(self.batch_size): + path_ = batch_path[i][0].split('/') + for l in path_: + if l.find('train') != -1: + target_dir_path = '/train/' + break + elif l.find('test') != -1: + target_dir_path = '/test/' + break + if not os.path.exists(self.target_path + target_dir_path): + os.makedirs(self.target_path + target_dir_path) + f_name = batch_path[i][0].replace(self.frame_path + target_dir_path, '') + f_name = f_name.replace('/', '_') + '_' + batch_path[i][1].replace('.png', '.npy') + target_dir_path = self.target_path + target_dir_path + target_path = os.path.join(target_dir_path, f_name) + print('saving feature:{0}' .format(target_path)) + np.save(target_path, feature_map_batch[i]) + batch_data = [] + batch_path = [] + elif num == total: + batch_data = np.asarray(batch_data) + batch_path = np.asarray(batch_path) + feature_map_batch = self.extract_feature(batch_data, batch_size=len(batch_data)) + for i in range(self.batch_size): + path_ = batch_path[i][0].split('/') + for l in path_: + if l.find('train') != -1: + target_dir_path = '/train/' + break + elif l.find('test') != -1: + target_dir_path = '/test/' + break + if not os.path.exists(self.target_path + target_dir_path): + os.makedirs(self.target_path + target_dir_path) + f_name = batch_path[i][0].replace(self.frame_path + target_dir_path, '') + f_name = f_name.replace('/', '_') + '_' + batch_path[i][1].replace('.png', '.npy') + target_dir_path = self.target_path + target_dir_path + target_path = os.path.join(target_dir_path, f_name) + print('saving feature:{0}' .format(target_path)) + np.save(target_path, feature_map_batch[i]) + + def load_image(self, path): + print('loading image:{0}' .format(path)) + img = skimage.io.imread(path) + img = img / 255.0 + assert (0 <= img).all() and (img <= 1.0).all() + short_edge = min(img.shape[:2]) + yy = int((img.shape[0] - short_edge) / 2) + xx = int((img.shape[1] - short_edge) / 2) + crop_img = img[yy: yy + short_edge, xx: xx + short_edge] + resized_img = skimage.transform.resize(crop_img, (224, 224)) + return resized_img + + + def extract_feature(self, batch, batch_size): + with tf.device('/gpu:0'): + with tf.Graph().as_default(): + with tf.Session() as sess: + images = tf.placeholder("float", [batch_size, 224, 224, 3]) + vgg = vgg19.Vgg19() + with tf.name_scope("content_vgg"): + vgg.build(images) + feature_map_batch = sess.run(vgg.fc6, feed_dict={images: batch}) + return feature_map_batch + + +if __name__ == "__main__": + print args + data = Data() + data.load_data() diff --git a/results/obj_fc_align.py b/results/obj_fc_align.py new file mode 100644 index 0000000..22da63c --- /dev/null +++ b/results/obj_fc_align.py @@ -0,0 +1,308 @@ +import tensorflow as tf +import os +import random +import time +import numpy as np +import argparse +import math +import sys + +def parse_args(): + parser = argparse.ArgumentParser(description='convert data to feature') + parser.add_argument('--source_path_feature', dest='source_path_feature', help='path of the feature map', + default='./feature_fc', type=str) + parser.add_argument('--source_path_label', dest='source_path_label', help='path of the label', + default='./labels', type=str) + parser.add_argument('--batch_size', dest='batch_size', help='batch_size', + default='64', type=int) + parser.add_argument('--mode', dest='mode', help='train/test', + default='train', type=str) + parser.add_argument('--model_path', dest='model_path', help='path of the model', + default='./model', type=str) + + if len(sys.argv) == 1: + parser.print_help() + sys.exit(1) + + args = parser.parse_args() + return args + +global args +args = parse_args() + +class Data: + def __init__(self, mode): + self.feature_path = args.source_path_feature + self.label_path = args.source_path_label + self.batch_size = args.batch_size + self.feature_list_train_ = [] + self.feature_list_validation_ = [] + self.feature_list_test = [] + self.mode = mode + #split validation set from training set (training : validation = 19 : 1) + self.feature_list = os.listdir(os.path.join(self.feature_path, self.mode)) + self.feature_list = [x for x in self.feature_list if x.find('Lhand') != -1] + if mode == 'train': + num = int(len(self.feature_list) * 0.95) + self.train_data_len = num + self.train_data_len = len(self.feature_list) + self.validation_data_len = len(self.feature_list) - num + self.feature_list_validation = self.feature_list[num:] + self.feature_list_train = self.feature_list[:num] + random.seed(time.time()) + random.shuffle(self.feature_list_train) + elif mode == 'test': + self.test_data_len = len(self.feature_list) + + def load_data(self, mode): + if mode == 'train': + if len(self.feature_list_train_) < self.batch_size: + self.feature_list_train_ = self.feature_list_train + random.seed(time.time()) + random.shuffle(self.feature_list_train_) + if len(self.feature_list_train_) >= self.batch_size: + batch_data_L = self.feature_list_train_[:self.batch_size] + self.feature_list_train_ = self.feature_list_train_[self.batch_size:] + elif mode == 'validation': + if len(self.feature_list_validation_) < self.batch_size: + self.feature_list_validation_ = self.feature_list_validation + if len(self.feature_list_validation_) >= self.batch_size: + batch_data_L = self.feature_list_validation_[:self.batch_size] + self.feature_list_validation_ = self.feature_list_validation_[self.batch_size:] + elif mode == 'test': + if len(self.feature_list_test) < self.batch_size: + self.feature_list_test = self.feature_list + if len(self.feature_list_test) >= self.batch_size: + batch_data_L = self.feature_list_test[:self.batch_size] + self.feature_list_test = self.feature_list_test[self.batch_size:] + + batch_data_head = [] + batch_label = [] + batch_data_R = [] + + for path in batch_data_L: + batch_data_head.append(path.replace('Lhand', 'head')) + batch_data_R.append(path.replace('Lhand', 'Rhand')) + for path_list in [batch_data_L, batch_data_R]: + for path in path_list: + path = path.split('_') + path_ = os.path.join(self.label_path, path[0]) + number = int(path[3].split('Image')[1].split('.npy')[0]) - 1 + if self.mode == 'test': + if path[0] == 'office' or path[0] == 'house': + path[1] = str(int(path[1]) + 3) #test office/house 1.2.3 => 4.5.6 + elif path[0] == 'lab': + path[1] = str(int(path[1]) + 4) #test lab 1.2.3.4 => 5.6.7.8 + if path[2].find('Rhand') != -1: + fa = np.load(os.path.join(path_, 'FA_right' + path[1] + '.npy')) #free/active + fa = int(fa[number]) + ges = np.load(os.path.join(path_, 'ges_right' + path[1] + '.npy')) #gesture + ges = int(ges[number]) + obj = np.load(os.path.join(path_, 'obj_right' + path[1] + '.npy')) #object + obj = int(obj[number]) + batch_label.append([fa, ges, obj]) + elif path[2].find('Lhand') != -1: + fa = np.load(os.path.join(path_, 'FA_left' + path[1] + '.npy')) + fa = int(fa[number]) + ges = np.load(os.path.join(path_, 'ges_left' + path[1] + '.npy')) + ges = int(ges[number]) + obj = np.load(os.path.join(path_, 'obj_left' + path[1] + '.npy')) + obj = int(obj[number]) + batch_label.append([fa, ges, obj]) + batch_label = np.asarray(batch_label) + batch_data_L = [np.load(os.path.join(self.feature_path, self.mode, x)) for x in batch_data_L] + batch_data_R = [np.load(os.path.join(self.feature_path, self.mode, x)) for x in batch_data_R] + batch_data_head = [np.load(os.path.join(self.feature_path, self.mode, x)) for x in batch_data_head] + batch_data_L = np.asarray(batch_data_L) + batch_data_R = np.asarray(batch_data_R) + batch_data_head = np.asarray(batch_data_head) + + return batch_data_L, batch_label, batch_data_head, batch_data_R + + def get_data_length(self): + if self.mode == 'train': + return self.train_data_len, self.validation_data_len + elif self.mode == 'test': + return self.test_data_len + +class Train: + def __init__(self): + self.batch_size = args.batch_size + self.model_path = args.model_path + self.epoch = 20 + self.start_learning_rate = 0.0001 + self.data_train = Data('train') + self.data_test = Data('test') + + def train(self): + model = Model() + best_accuracy =0.0 + with tf.device('/gpu:0'): + with tf.Graph().as_default(): + feature_Lhand, feature_Rhand, feature_head, label_fa, label_ges, label_obj, logits_fa, logits_ges, logits_obj, label_onehot_fa, label_onehot_ges, label_onehot_obj,_ = model.build(keep_prob=0.5) + cross_entropy_fa = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=label_onehot_fa, logits=logits_fa, name='softmax_loss_fa')) + tf.add_to_collection('losses_fa', cross_entropy_fa) + cross_entropy_ges = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=label_onehot_ges, logits=logits_ges, name='softmax_loss_ges')) + tf.add_to_collection('losses_ges', cross_entropy_ges) + cross_entropy_obj = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=label_onehot_obj, logits=logits_obj, name='softmax_loss_obj')) + tf.add_to_collection('losses_obj', cross_entropy_obj) + loss_fa = tf.reduce_sum(tf.get_collection('losses_fa')) + loss_ges = tf.reduce_sum(tf.get_collection('losses_ges')) + loss_obj = tf.reduce_sum(tf.get_collection('losses_obj')) + global_step = tf.Variable(0, trainable=False) + learning_rate = self.start_learning_rate + optimizer_1 = tf.train.AdamOptimizer(learning_rate=learning_rate) + optimizer_2 = tf.train.AdamOptimizer(learning_rate=learning_rate) + optimizer_3 = tf.train.AdamOptimizer(learning_rate=learning_rate) + train_optimizer_fa = optimizer_1.minimize(loss_fa) + train_optimizer_ges = optimizer_2.minimize(loss_ges) + train_optimizer_obj = optimizer_3.minimize(loss_obj, global_step=global_step) + tf.summary.scalar('loss_fa', loss_fa) + tf.summary.scalar('loss_ges', loss_ges) + tf.summary.scalar('loss_obj', loss_obj) + summary = tf.summary.merge_all() + with tf.Session() as sess: + if not os.path.exists(self.model_path): + os.makedirs(self.model_path) + summary_writer = tf.summary.FileWriter('./graph', sess.graph) + sess.run(tf.global_variables_initializer()) + with tf.device('/cpu:0'): + saver = tf.train.Saver(max_to_keep=5) + if len(os.listdir(self.model_path)) > 0: + saver.restore(sess, tf.train.latest_checkpoint(self.model_path)) + print('Start training ......') + data_len_train, data_len_validation = self.data_train.get_data_length() + for i in range(int(data_len_train * self.epoch / self.batch_size)): + features_Lhand, labels, features_head, features_Rhand = self.data_train.load_data('train') + labels_fa = labels[:,0] + labels_ges = labels[:,1] + labels_obj = labels[:,2] + _, _, _, _loss_fa, _loss_ges, _loss_obj, step, summary_ = sess.run([train_optimizer_fa, train_optimizer_ges, train_optimizer_obj, loss_fa, loss_ges, loss_obj, global_step, summary], feed_dict={feature_Lhand:features_Lhand, feature_Rhand:features_Rhand, feature_head:features_head, label_fa:labels_fa, label_ges:labels_ges, label_obj:labels_obj}) + summary_writer.add_summary(summary_, global_step=step) + if i % int(data_len_train/self.batch_size) == 0: + print 'epoch {0}' .format(math.floor(i*self.batch_size/data_len_train)+1) + if step % 10 == 0: + #print('Step: {0} Loss free/active: {1}' .format(step, _loss_fa)) + #print('Step: {0} Loss gesture: {1}' .format(step, _loss_ges)) + print('Step: {0} Loss object: {1}' .format(step, _loss_obj)) + if step % 100 == 0: + print('Saving models ......') + with tf.device('/cpu:0'): + saver.save(sess, os.path.join(self.model_path, 'model.ckpt'), global_step=step) + accuracy_fa_, accuracy_ges_, accuracy_obj_ = self.test(mode='validation', data_len=data_len_validation) + print('=> Validation accuracy free/active: {0}%' .format(accuracy_fa_ * 100)) + print('=> Validation accuracy gesture: {0}%' .format(accuracy_ges_ * 100)) + print('=> Validation accuracy object: {0}%' .format(accuracy_obj_ * 100)) + + def test(self, mode, data_len=512): + if args.mode == 'test': + data_len = self.data_test.get_data_length() + model = Model() + _accuracy = 0.0 + with tf.device('/gpu:0'): + with tf.Graph().as_default(): + feature_Lhand, feature_Rhand, feature_head, label_fa, label_ges, label_obj, logits_fa, logits_ges, logits_obj, label_onehot_fa, label_onehot_ges, label_onehot_obj = model.build(keep_prob=1) + prediction_fa = tf.argmax(logits_fa, axis=1) + prediction_ges = tf.argmax(logits_ges, axis=1) + prediction_obj = tf.argmax(logits_obj, axis=1) + accuracy_fa, update_accuracy_fa = tf.metrics.accuracy(labels=label_fa, predictions=prediction_fa) + tf.summary.scalar('accuracy_fa', accuracy_fa) + accuracy_ges, update_accuracy_ges = tf.metrics.accuracy(labels=label_ges, predictions=prediction_ges) + tf.summary.scalar('accuracy_ges', accuracy_ges) + accuracy_obj, update_accuracy_obj = tf.metrics.accuracy(labels=label_obj, predictions=prediction_obj) + tf.summary.scalar('accuracy_obj', accuracy_obj) + tf.summary.scalar('accuracy',accuracy_obj) + + with tf.Session() as sess: + sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()]) + with tf.device('/cpu:0'): + restorer = tf.train.Saver() + restorer.restore(sess, tf.train.latest_checkpoint(self.model_path)) + for _ in range(int(data_len / self.batch_size)): + if mode == 'test': + features_Lhand, labels, features_head, features_Rhand = self.data_test.load_data('test') + elif mode == 'train': + features_Lhand, labels, features_head, features_Rhand = self.data_train.load_data('train') + elif mode == 'validation': + features_Lhand, labels, features_head, features_Rhand = self.data_train.load_data('validation') + labels_fa = labels[:,0] + labels_ges = labels[:,1] + labels_obj = labels[:,2] + _, _, _ = sess.run([update_accuracy_fa, update_accuracy_ges, update_accuracy_obj], feed_dict={feature_Lhand:features_Lhand, feature_Rhand:features_Rhand, feature_head:features_head, label_fa:labels_fa, label_ges:labels_ges, label_obj:labels_obj}) + _accuracy_fa, _accuracy_ges, _accuracy_obj = sess.run([accuracy_fa, accuracy_ges, accuracy_obj]) + return _accuracy_fa, _accuracy_ges, _accuracy_obj + +class Model: + def __init__(self): + self.batch_size = args.batch_size + self.data_dict = np.load('./vgg19.npy', encoding='latin1').item() + + def build(self, keep_prob): + feature_Lhand = tf.placeholder(tf.float32, shape=[self.batch_size, 4096], name='feature_Lhand') + feature_Rhand = tf.placeholder(tf.float32, shape=[self.batch_size, 4096], name='feature_Rhand') + feature_head = tf.placeholder(tf.float32, shape=[self.batch_size, 4096], name='feature_head_input') + label_fa = tf.placeholder(tf.int32, shape=[2*self.batch_size], name='label_fa') + label_onehot_fa = tf.one_hot(label_fa, depth=2) + label_ges = tf.placeholder(tf.int32, shape=[2*self.batch_size], name='label_ges') + label_onehot_ges = tf.one_hot(label_ges, depth=13) + label_obj = tf.placeholder(tf.int32, shape=[2*self.batch_size], name='label_obj') + label_onehot_obj = tf.one_hot(label_obj, depth=24) + fc1 = tf.concat([feature_Lhand, feature_Rhand, feature_head], axis=1) + with tf.variable_scope('fc2'): + fc2 = self.fc_layer(fc1, [4096*3, 4096], [4096], wd=0.0, _class='all') + fc2 = tf.nn.relu(fc2) + with tf.variable_scope('dropout2'): + fc2 = tf.nn.dropout(fc2, keep_prob=keep_prob) + with tf.variable_scope('fc3_fa_L'): + fc3_fa_L = self.fc_layer(fc2, [4096, 2], [2], wd=0.0001, _class='fa') + with tf.variable_scope('fc3_ges_L'): + fc3_ges_L = self.fc_layer(fc2, [4096, 13], [13], wd=0.0001, _class='ges') + with tf.variable_scope('fc3_obj_L'): + fc3_obj_L = self.fc_layer(fc2, [4096, 24], [24], wd=0.0001, _class='obj') + with tf.variable_scope('fc3_fa_R'): + fc3_fa_R = self.fc_layer(fc2, [4096, 2], [2], wd=0.0001, _class='fa') + with tf.variable_scope('fc3_ges_R'): + fc3_ges_R = self.fc_layer(fc2, [4096, 13], [13], wd=0.0001, _class='ges') + with tf.variable_scope('fc3_obj_R'): + fc3_obj_R = self.fc_layer(fc2, [4096, 24], [24], wd=0.0001, _class='obj') + fc3_fa = tf.concat([fc3_fa_L, fc3_fa_R], 0) + fc3_ges = tf.concat([fc3_ges_L, fc3_ges_R], 0) + fc3_obj = tf.concat([fc3_obj_L, fc3_obj_R], 0) + + return feature_Lhand, feature_Rhand, feature_head, label_fa, label_ges, label_obj, fc3_fa, fc3_ges, fc3_obj, label_onehot_fa, label_onehot_ges, label_onehot_obj + + + + def fc_layer(self, _input, kernel_shape, bias_shape, wd, _class): + w = tf.get_variable('weights', shape=kernel_shape, initializer=tf.contrib.layers.xavier_initializer()) + b = tf.get_variable('bias', shape=bias_shape, initializer=tf.constant_initializer(0.0)) + weight_decay = tf.multiply(tf.nn.l2_loss(w), wd, name='weight_loss') + + if _class == 'all': + tf.add_to_collection('losses_fa', weight_decay) + tf.add_to_collection('losses_ges', weight_decay) + tf.add_to_collection('losses_obj', weight_decay) + elif _class == 'fa': + tf.add_to_collection('losses_fa', weight_decay) + elif _class == 'ges': + tf.add_to_collection('losses_ges', weight_decay) + elif _class == 'obj': + tf.add_to_collection('losses_obj', weight_decay) + + return tf.nn.xw_plus_b(x=_input, weights=w, biases=b) + + + + + +if __name__ == '__main__': + print args + train = Train() + if args.mode == 'train': + train.train() + elif args.mode == 'test': + accuracy_fa, accuracy_ges, accuracy_obj = train.test(mode='test') + #print('=>Testing accuracy free/active: {0}%' .format(accuracy_fa * 100)) + #print('=>Testing accuracy gesture: {0}%' .format(accuracy_ges * 100)) + print('=>Testing accuracy object: {0}%' .format(accuracy_obj * 100)) + diff --git a/results/vgg19.py b/results/vgg19.py new file mode 100644 index 0000000..1fb0d44 --- /dev/null +++ b/results/vgg19.py @@ -0,0 +1,128 @@ +import os +import tensorflow as tf + +import numpy as np +import time +import inspect + +VGG_MEAN = [103.939, 116.779, 123.68] + + +class Vgg19: + def __init__(self, vgg19_npy_path=None): + if vgg19_npy_path is None: + path = inspect.getfile(Vgg19) + path = os.path.abspath(os.path.join(path, os.pardir)) + path = os.path.join(path, "vgg19.npy") + vgg19_npy_path = path + print(vgg19_npy_path) + + self.data_dict = np.load(vgg19_npy_path, encoding='latin1').item() + print("npy file loaded") + + def build(self, rgb): + """ + load variable from npy to build the VGG + + :param rgb: rgb image [batch, height, width, 3] values scaled [0, 1] + """ + + start_time = time.time() + print("build model started") + rgb_scaled = rgb * 255.0 + + # Convert RGB to BGR + red, green, blue = tf.split(axis=3, num_or_size_splits=3, value=rgb_scaled) + assert red.get_shape().as_list()[1:] == [224, 224, 1] + assert green.get_shape().as_list()[1:] == [224, 224, 1] + assert blue.get_shape().as_list()[1:] == [224, 224, 1] + bgr = tf.concat(axis=3, values=[ + blue - VGG_MEAN[0], + green - VGG_MEAN[1], + red - VGG_MEAN[2], + ]) + assert bgr.get_shape().as_list()[1:] == [224, 224, 3] + + self.conv1_1 = self.conv_layer(bgr, "conv1_1") + self.conv1_2 = self.conv_layer(self.conv1_1, "conv1_2") + self.pool1 = self.max_pool(self.conv1_2, 'pool1') + + self.conv2_1 = self.conv_layer(self.pool1, "conv2_1") + self.conv2_2 = self.conv_layer(self.conv2_1, "conv2_2") + self.pool2 = self.max_pool(self.conv2_2, 'pool2') + + self.conv3_1 = self.conv_layer(self.pool2, "conv3_1") + self.conv3_2 = self.conv_layer(self.conv3_1, "conv3_2") + self.conv3_3 = self.conv_layer(self.conv3_2, "conv3_3") + self.conv3_4 = self.conv_layer(self.conv3_3, "conv3_4") + self.pool3 = self.max_pool(self.conv3_4, 'pool3') + + self.conv4_1 = self.conv_layer(self.pool3, "conv4_1") + self.conv4_2 = self.conv_layer(self.conv4_1, "conv4_2") + self.conv4_3 = self.conv_layer(self.conv4_2, "conv4_3") + self.conv4_4 = self.conv_layer(self.conv4_3, "conv4_4") + self.pool4 = self.max_pool(self.conv4_4, 'pool4') + + self.conv5_1 = self.conv_layer(self.pool4, "conv5_1") + self.conv5_2 = self.conv_layer(self.conv5_1, "conv5_2") + self.conv5_3 = self.conv_layer(self.conv5_2, "conv5_3") + self.conv5_4 = self.conv_layer(self.conv5_3, "conv5_4") + self.pool5 = self.max_pool(self.conv5_4, 'pool5') + + self.fc6 = self.fc_layer(self.pool5, "fc6") + assert self.fc6.get_shape().as_list()[1:] == [4096] + self.relu6 = tf.nn.relu(self.fc6) + + self.fc7 = self.fc_layer(self.relu6, "fc7") + self.relu7 = tf.nn.relu(self.fc7) + + self.fc8 = self.fc_layer(self.relu7, "fc8") + + self.prob = tf.nn.softmax(self.fc8, name="prob") + + self.data_dict = None + print(("build model finished: %ds" % (time.time() - start_time))) + + def avg_pool(self, bottom, name): + return tf.nn.avg_pool(bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name) + + def max_pool(self, bottom, name): + return tf.nn.max_pool(bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name) + + def conv_layer(self, bottom, name): + with tf.variable_scope(name): + filt = self.get_conv_filter(name) + + conv = tf.nn.conv2d(bottom, filt, [1, 1, 1, 1], padding='SAME') + + conv_biases = self.get_bias(name) + bias = tf.nn.bias_add(conv, conv_biases) + + relu = tf.nn.relu(bias) + return relu + + def fc_layer(self, bottom, name): + with tf.variable_scope(name): + shape = bottom.get_shape().as_list() + dim = 1 + for d in shape[1:]: + dim *= d + x = tf.reshape(bottom, [-1, dim]) + + weights = self.get_fc_weight(name) + biases = self.get_bias(name) + + # Fully connected layer. Note that the '+' operation automatically + # broadcasts the biases. + fc = tf.nn.bias_add(tf.matmul(x, weights), biases) + + return fc + + def get_conv_filter(self, name): + return tf.constant(self.data_dict[name][0], name="filter") + + def get_bias(self, name): + return tf.constant(self.data_dict[name][1], name="biases") + + def get_fc_weight(self, name): + return tf.constant(self.data_dict[name][0], name="weights") From a606391bb1ecca55c4747c56135193e0939d24e6 Mon Sep 17 00:00:00 2001 From: chinan Date: Thu, 12 Oct 2017 22:25:37 +0800 Subject: [PATCH 2/9] version 1 --- results/extract_feature.py => extract_feature.py | 0 results/obj_fc_align.py => obj_fc_align.py | 0 results/vgg19.py => vgg19.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename results/extract_feature.py => extract_feature.py (100%) rename results/obj_fc_align.py => obj_fc_align.py (100%) rename results/vgg19.py => vgg19.py (100%) diff --git a/results/extract_feature.py b/extract_feature.py similarity index 100% rename from results/extract_feature.py rename to extract_feature.py diff --git a/results/obj_fc_align.py b/obj_fc_align.py similarity index 100% rename from results/obj_fc_align.py rename to obj_fc_align.py diff --git a/results/vgg19.py b/vgg19.py similarity index 100% rename from results/vgg19.py rename to vgg19.py From 2925878426fe9b8fd3ad2a41c4908bd224fd2481 Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:27:34 +0800 Subject: [PATCH 3/9] Add files via upload --- README_files/model.png | Bin 0 -> 18236 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README_files/model.png diff --git a/README_files/model.png b/README_files/model.png new file mode 100644 index 0000000000000000000000000000000000000000..706f1ff687ff67b24bb4647290caf0f29e4773ab GIT binary patch literal 18236 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 YV_ZbQZ+^T5zIcP7gjAO+MOXy Date: Thu, 12 Oct 2017 23:30:21 +0800 Subject: [PATCH 4/9] Update index.md --- results/index.md | 76 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/results/index.md b/results/index.md index 96ce61c..e2a9354 100644 --- a/results/index.md +++ b/results/index.md @@ -1,47 +1,73 @@ -# Your Name (id) +# 鄭欽安  (103061148) -#Project 5: Deep Classification +# Homework 1: Deep Classification ## Overview -The project is related to -> quote +The project is related to Handcam dataset object classification ## Implementation -1. One - * item - * item -2. Two +1. It's inplemented in tensorflow 1.2.1 + +2. Use VGG-19 model pre-trained on ImageNet to extract features + +3. Model Architure + +model + +4. Use multi-task learning, because I think free/active, gesture labels can help training object labels and avoid overfitting + +5. Align lefthand ,righthand and head informations to share features and classify + +6. Detail +* learning rate = 0.0001 + +* add regularization hyperparameter (=0.0001) in latest fc layer + +* use one dropout + +* batch size = 128 + + + + -``` -Code highlights -``` ## Installation -* Other required packages. -* How to compile from source? +* Tensorflow + +* Pre-trained model [VGG-19 tensorflow](https://github.com/machrisaa/tensorflow-vgg), and download [vgg19.npy](https://mega.nz/#!xZ8glS6J!MAnE91ND_WyfZ_8mvkuSa2YcA7q-1ehfSm-Q1fxOvvs) + +* Skimage + +* Extract features of frames +``` +python extract_feature.py --source_path={data_path} --target_path={targe_feature_path} --batch_size={batch_size} +``` + +* Training +``` +python obj_fc_align.py --source_path_feature={targe_feature_path} --source_path_label={label_path} --mode=train --batch_size={batch_size} --model={model_path} +``` + +* Testing +``` +python obj_fc_align.py --source_path_feature={targe_feature_path} --source_path_label={label_path} --mode=testing --batch_size={batch_size} --model={model_path} +``` ### Results - +
- - - +
- - - - +testing accuracy
- - - - +65.84%
From b32f2de24b40ebbf8219ab01c4d6b0b05f8da515 Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:36:54 +0800 Subject: [PATCH 5/9] Update index.md --- results/index.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/results/index.md b/results/index.md index e2a9354..a378f99 100644 --- a/results/index.md +++ b/results/index.md @@ -13,20 +13,21 @@ The project is related to Handcam dataset object classification 3. Model Architure -model + 4. Use multi-task learning, because I think free/active, gesture labels can help training object labels and avoid overfitting 5. Align lefthand ,righthand and head informations to share features and classify 6. Detail -* learning rate = 0.0001 + * learning rate = 0.0001 -* add regularization hyperparameter (=0.0001) in latest fc layer + * add regularization hyperparameter (=0.0001) in latest fc layer -* use one dropout + * use one dropout -* batch size = 128 + * batch size = 128 + From 76fc5e473c67d0e90185e5ae4a96ed68fc4bdd70 Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:52:06 +0800 Subject: [PATCH 6/9] Add files via upload --- README_files/loss.png | Bin 0 -> 59357 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README_files/loss.png diff --git a/README_files/loss.png b/README_files/loss.png new file mode 100644 index 0000000000000000000000000000000000000000..f89420acdabd15bc128c6654bb5accef8ff2cd6f GIT binary patch literal 59357 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 SF!tAs;l?%7tMB#iJ^n8^B?qSf literal 0 HcmV?d00001 From d5be1312cc34edae825ad27c618ef7aa44f37277 Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:53:56 +0800 Subject: [PATCH 7/9] Update index.md --- results/index.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/results/index.md b/results/index.md index a378f99..41191d1 100644 --- a/results/index.md +++ b/results/index.md @@ -55,9 +55,17 @@ python obj_fc_align.py --source_path_feature={targe_feature_path} --source_path_ ``` python obj_fc_align.py --source_path_feature={targe_feature_path} --source_path_label={label_path} --mode=testing --batch_size={batch_size} --model={model_path} ``` +* Tensorboard +``` +tensorboard --logdir=./graph +``` + +### Results -### Results +* loss + +* accuracy
From 3ce3674fc0d07ea18961f5990afa322a1f68ecc0 Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:55:24 +0800 Subject: [PATCH 8/9] Update index.md --- results/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/results/index.md b/results/index.md index 41191d1..90fc42c 100644 --- a/results/index.md +++ b/results/index.md @@ -22,7 +22,7 @@ The project is related to Handcam dataset object classification 6. Detail * learning rate = 0.0001 - * add regularization hyperparameter (=0.0001) in latest fc layer + * add regularization hyperparameter (=0.0001) in last fc layer * use one dropout From 118d75903e9e485ab911ec092c919be4ee2d2f5c Mon Sep 17 00:00:00 2001 From: chinancheng Date: Thu, 12 Oct 2017 23:56:16 +0800 Subject: [PATCH 9/9] Update index.md --- results/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/results/index.md b/results/index.md index 90fc42c..9a274db 100644 --- a/results/index.md +++ b/results/index.md @@ -15,7 +15,7 @@ The project is related to Handcam dataset object classification -4. Use multi-task learning, because I think free/active, gesture labels can help training object labels and avoid overfitting +4. Use multi-task learning, because I think free/active, gesture labels can help train object labels and avoid overfitting 5. Align lefthand ,righthand and head informations to share features and classify