Spaces:
Runtime error
Runtime error
| # Copyright 2016 The TensorFlow Authors All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # ============================================================================== | |
| """Code for setting up summaries for CMP. | |
| """ | |
| import sys, os, numpy as np | |
| import matplotlib.pyplot as plt | |
| import tensorflow as tf | |
| from tensorflow.contrib import slim | |
| from tensorflow.contrib.slim import arg_scope | |
| import logging | |
| from tensorflow.python.platform import app | |
| from tensorflow.python.platform import flags | |
| from src import utils | |
| import src.file_utils as fu | |
| import tfcode.nav_utils as nu | |
| def _vis_readout_maps(outputs, global_step, output_dir, metric_summary, N): | |
| # outputs is [gt_map, pred_map]: | |
| if N >= 0: | |
| outputs = outputs[:N] | |
| N = len(outputs) | |
| plt.set_cmap('jet') | |
| fig, axes = utils.subplot(plt, (N, outputs[0][0].shape[4]*2), (5,5)) | |
| axes = axes.ravel()[::-1].tolist() | |
| for i in range(N): | |
| gt_map, pred_map = outputs[i] | |
| for j in [0]: | |
| for k in range(gt_map.shape[4]): | |
| # Display something like the midpoint of the trajectory. | |
| id = np.int(gt_map.shape[1]/2) | |
| ax = axes.pop(); | |
| ax.imshow(gt_map[j,id,:,:,k], origin='lower', interpolation='none', | |
| vmin=0., vmax=1.) | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('gt_map') | |
| ax = axes.pop(); | |
| ax.imshow(pred_map[j,id,:,:,k], origin='lower', interpolation='none', | |
| vmin=0., vmax=1.) | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('pred_map') | |
| file_name = os.path.join(output_dir, 'readout_map_{:d}.png'.format(global_step)) | |
| with fu.fopen(file_name, 'w') as f: | |
| fig.savefig(f, bbox_inches='tight', transparent=True, pad_inches=0) | |
| plt.close(fig) | |
| def _vis(outputs, global_step, output_dir, metric_summary, N): | |
| # Plot the value map, goal for various maps to see what if the model is | |
| # learning anything useful. | |
| # | |
| # outputs is [values, goals, maps, occupancy, conf]. | |
| # | |
| if N >= 0: | |
| outputs = outputs[:N] | |
| N = len(outputs) | |
| plt.set_cmap('jet') | |
| fig, axes = utils.subplot(plt, (N, outputs[0][0].shape[4]*5), (5,5)) | |
| axes = axes.ravel()[::-1].tolist() | |
| for i in range(N): | |
| values, goals, maps, occupancy, conf = outputs[i] | |
| for j in [0]: | |
| for k in range(values.shape[4]): | |
| # Display something like the midpoint of the trajectory. | |
| id = np.int(values.shape[1]/2) | |
| ax = axes.pop(); | |
| ax.imshow(goals[j,id,:,:,k], origin='lower', interpolation='none') | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('goal') | |
| ax = axes.pop(); | |
| ax.imshow(occupancy[j,id,:,:,k], origin='lower', interpolation='none') | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('occupancy') | |
| ax = axes.pop(); | |
| ax.imshow(conf[j,id,:,:,k], origin='lower', interpolation='none', | |
| vmin=0., vmax=1.) | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('conf') | |
| ax = axes.pop(); | |
| ax.imshow(values[j,id,:,:,k], origin='lower', interpolation='none') | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('value') | |
| ax = axes.pop(); | |
| ax.imshow(maps[j,id,:,:,k], origin='lower', interpolation='none') | |
| ax.set_axis_off(); | |
| if i == 0: ax.set_title('incr map') | |
| file_name = os.path.join(output_dir, 'value_vis_{:d}.png'.format(global_step)) | |
| with fu.fopen(file_name, 'w') as f: | |
| fig.savefig(f, bbox_inches='tight', transparent=True, pad_inches=0) | |
| plt.close(fig) | |
| def _summary_vis(m, batch_size, num_steps, arop_full_summary_iters): | |
| arop = []; arop_summary_iters = []; arop_eval_fns = []; | |
| vis_value_ops = []; vis_goal_ops = []; vis_map_ops = []; | |
| vis_occupancy_ops = []; vis_conf_ops = []; | |
| for i, val_op in enumerate(m.value_ops): | |
| vis_value_op = tf.reduce_mean(tf.abs(val_op), axis=3, keep_dims=True) | |
| vis_value_ops.append(vis_value_op) | |
| vis_occupancy_op = tf.reduce_mean(tf.abs(m.occupancys[i]), 3, True) | |
| vis_occupancy_ops.append(vis_occupancy_op) | |
| vis_conf_op = tf.reduce_max(tf.abs(m.confs[i]), axis=3, keep_dims=True) | |
| vis_conf_ops.append(vis_conf_op) | |
| ego_goal_imgs_i_op = m.input_tensors['step']['ego_goal_imgs_{:d}'.format(i)] | |
| vis_goal_op = tf.reduce_max(ego_goal_imgs_i_op, 4, True) | |
| vis_goal_ops.append(vis_goal_op) | |
| vis_map_op = tf.reduce_mean(tf.abs(m.ego_map_ops[i]), 4, True) | |
| vis_map_ops.append(vis_map_op) | |
| vis_goal_ops = tf.concat(vis_goal_ops, 4) | |
| vis_map_ops = tf.concat(vis_map_ops, 4) | |
| vis_value_ops = tf.concat(vis_value_ops, 3) | |
| vis_occupancy_ops = tf.concat(vis_occupancy_ops, 3) | |
| vis_conf_ops = tf.concat(vis_conf_ops, 3) | |
| sh = tf.unstack(tf.shape(vis_value_ops))[1:] | |
| vis_value_ops = tf.reshape(vis_value_ops, shape=[batch_size, -1] + sh) | |
| sh = tf.unstack(tf.shape(vis_conf_ops))[1:] | |
| vis_conf_ops = tf.reshape(vis_conf_ops, shape=[batch_size, -1] + sh) | |
| sh = tf.unstack(tf.shape(vis_occupancy_ops))[1:] | |
| vis_occupancy_ops = tf.reshape(vis_occupancy_ops, shape=[batch_size,-1] + sh) | |
| # Save memory, only return time steps that need to be visualized, factor of | |
| # 32 CPU memory saving. | |
| id = np.int(num_steps/2) | |
| vis_goal_ops = tf.expand_dims(vis_goal_ops[:,id,:,:,:], axis=1) | |
| vis_map_ops = tf.expand_dims(vis_map_ops[:,id,:,:,:], axis=1) | |
| vis_value_ops = tf.expand_dims(vis_value_ops[:,id,:,:,:], axis=1) | |
| vis_conf_ops = tf.expand_dims(vis_conf_ops[:,id,:,:,:], axis=1) | |
| vis_occupancy_ops = tf.expand_dims(vis_occupancy_ops[:,id,:,:,:], axis=1) | |
| arop += [[vis_value_ops, vis_goal_ops, vis_map_ops, vis_occupancy_ops, | |
| vis_conf_ops]] | |
| arop_summary_iters += [arop_full_summary_iters] | |
| arop_eval_fns += [_vis] | |
| return arop, arop_summary_iters, arop_eval_fns | |
| def _summary_readout_maps(m, num_steps, arop_full_summary_iters): | |
| arop = []; arop_summary_iters = []; arop_eval_fns = []; | |
| id = np.int(num_steps-1) | |
| vis_readout_maps_gt = m.readout_maps_gt | |
| vis_readout_maps_prob = tf.reshape(m.readout_maps_probs, | |
| shape=tf.shape(vis_readout_maps_gt)) | |
| vis_readout_maps_gt = tf.expand_dims(vis_readout_maps_gt[:,id,:,:,:], 1) | |
| vis_readout_maps_prob = tf.expand_dims(vis_readout_maps_prob[:,id,:,:,:], 1) | |
| arop += [[vis_readout_maps_gt, vis_readout_maps_prob]] | |
| arop_summary_iters += [arop_full_summary_iters] | |
| arop_eval_fns += [_vis_readout_maps] | |
| return arop, arop_summary_iters, arop_eval_fns | |
| def _add_summaries(m, args, summary_mode, arop_full_summary_iters): | |
| task_params = args.navtask.task_params | |
| summarize_ops = [m.lr_op, m.global_step_op, m.sample_gt_prob_op] + \ | |
| m.loss_ops + m.acc_ops | |
| summarize_names = ['lr', 'global_step', 'sample_gt_prob_op'] + \ | |
| m.loss_ops_names + ['acc_{:d}'.format(i) for i in range(len(m.acc_ops))] | |
| to_aggregate = [0, 0, 0] + [1]*len(m.loss_ops_names) + [1]*len(m.acc_ops) | |
| scope_name = 'summary' | |
| with tf.name_scope(scope_name): | |
| s_ops = nu.add_default_summaries(summary_mode, arop_full_summary_iters, | |
| summarize_ops, summarize_names, | |
| to_aggregate, m.action_prob_op, | |
| m.input_tensors, scope_name=scope_name) | |
| if summary_mode == 'val': | |
| arop, arop_summary_iters, arop_eval_fns = _summary_vis( | |
| m, task_params.batch_size, task_params.num_steps, | |
| arop_full_summary_iters) | |
| s_ops.additional_return_ops += arop | |
| s_ops.arop_summary_iters += arop_summary_iters | |
| s_ops.arop_eval_fns += arop_eval_fns | |
| if args.arch.readout_maps: | |
| arop, arop_summary_iters, arop_eval_fns = _summary_readout_maps( | |
| m, task_params.num_steps, arop_full_summary_iters) | |
| s_ops.additional_return_ops += arop | |
| s_ops.arop_summary_iters += arop_summary_iters | |
| s_ops.arop_eval_fns += arop_eval_fns | |
| return s_ops | |