logger.info(q_heat) logger.info(q_vect) # define model for multi-gpu q_inp_split, q_heat_split, q_vect_split = tf.split(q_inp, args.gpus), tf.split(q_heat, args.gpus), tf.split(q_vect, args.gpus) output_vectmap = [] output_heatmap = [] losses = [] last_losses_l1 = [] last_losses_l2 = [] outputs = [] for gpu_id in range(args.gpus): with tf.device(tf.DeviceSpec(device_type="GPU", device_index=gpu_id)): with tf.variable_scope(tf.get_variable_scope(), reuse=(gpu_id > 0)): net, pretrain_path, last_layer = get_network(args.model, q_inp_split[gpu_id]) vect, heat = net.loss_last() output_vectmap.append(vect) output_heatmap.append(heat) outputs.append(net.get_output()) l1s, l2s = net.loss_l1_l2() for idx, (l1, l2) in enumerate(zip(l1s, l2s)): loss_l1 = tf.nn.l2_loss(tf.concat(l1, axis=0) - q_vect_split[gpu_id], name='loss_l1_stage%d_tower%d' % (idx, gpu_id)) loss_l2 = tf.nn.l2_loss(tf.concat(l2, axis=0) - q_heat_split[gpu_id], name='loss_l2_stage%d_tower%d' % (idx, gpu_id)) losses.append(tf.reduce_mean([loss_l1, loss_l2])) last_losses_l1.append(loss_l1) last_losses_l2.append(loss_l2) outputs = tf.concat(outputs, axis=0)
config.gpu_options.allocator_type = 'BFC' config.gpu_options.per_process_gpu_memory_fraction = 0.95 config.gpu_options.allow_growth = True if __name__ == '__main__': """ Use this script to just save graph and checkpoint. While training, checkpoints are saved. You can test them with this python code. """ parser = argparse.ArgumentParser(description='Tensorflow Pose Estimation Graph Extractor') parser.add_argument('--model', type=str, default='cmu', help='cmu / mobilenet / mobilenet_thin') args = parser.parse_args() input_node = tf.placeholder(tf.float32, shape=(1, 368, 432, 3), name='image') with tf.Session(config=config) as sess: net, _, last_layer = get_network(args.model, input_node, sess, trainable=False) tf.train.write_graph(sess.graph_def, './tmp', 'graph.pb', as_text=True) graph = tf.get_default_graph() dir(graph) for n in tf.get_default_graph().as_graph_def().node: if 'concat_stage' not in n.name: continue print(n.name) saver = tf.train.Saver(max_to_keep=100) saver.save(sess, '/Users/ildoonet/repos/tf-openpose/tmp/chk', global_step=1)
def train_with_ignite(networks, dataset, data_dir, batch_size, img_size, epochs, lr, momentum, num_workers, optimizer, logger): from ignite.engine import Events, create_supervised_trainer, create_supervised_evaluator from ignite.metrics import Loss from utils.metrics import MultiThresholdMeasures, Accuracy, IoU, F1score # device device = 'cuda' if torch.cuda.is_available() else 'cpu' # build model model = get_network(networks) # log model summary input_size = (3, img_size, img_size) summarize_model(model.to(device), input_size, logger, batch_size, device) # build loss loss = torch.nn.BCEWithLogitsLoss() # build optimizer and scheduler model_optimizer = get_optimizer(optimizer, model, lr, momentum) lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(model_optimizer) # transforms on both image and mask train_joint_transforms = jnt_trnsf.Compose([ jnt_trnsf.RandomCrop(img_size), jnt_trnsf.RandomRotate(5), jnt_trnsf.RandomHorizontallyFlip() ]) # transforms only on images train_image_transforms = std_trnsf.Compose([ std_trnsf.ColorJitter(0.05, 0.05, 0.05, 0.05), std_trnsf.ToTensor(), std_trnsf.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) test_joint_transforms = jnt_trnsf.Compose([ jnt_trnsf.Safe32Padding() ]) test_image_transforms = std_trnsf.Compose([ std_trnsf.ToTensor(), std_trnsf.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # transforms only on mask mask_transforms = std_trnsf.Compose([ std_trnsf.ToTensor() ]) # build train / test loader train_loader = get_loader(dataset=dataset, data_dir=data_dir, train=True, joint_transforms=train_joint_transforms, image_transforms=train_image_transforms, mask_transforms=mask_transforms, batch_size=batch_size, shuffle=False, num_workers=num_workers) test_loader = get_loader(dataset=dataset, data_dir=data_dir, train=False, joint_transforms=test_joint_transforms, image_transforms=test_image_transforms, mask_transforms=mask_transforms, batch_size=1, shuffle=False, num_workers=num_workers) # build trainer / evaluator with ignite trainer = create_supervised_trainer(model, model_optimizer, loss, device=device) measure = MultiThresholdMeasures() evaluator = create_supervised_evaluator(model, metrics={ '': measure, 'pix-acc': Accuracy(measure), 'iou': IoU(measure), 'loss': Loss(loss), 'f1': F1score(measure), }, device=device) # initialize state variable for checkpoint state = update_state(model.state_dict(), 0, 0, 0, 0, 0) # make ckpt path ckpt_root = './ckpt/' filename = '{network}_{optimizer}_lr_{lr}_epoch_{epoch}.pth' ckpt_path = os.path.join(ckpt_root, filename) # execution after every training iteration @trainer.on(Events.ITERATION_COMPLETED) def log_training_loss(trainer): num_iter = (trainer.state.iteration - 1) % len(train_loader) + 1 if num_iter % 20 == 0: logger.info("Epoch[{}] Iter[{:03d}] Loss: {:.2f}".format( trainer.state.epoch, num_iter, trainer.state.output)) # execution after every training epoch @trainer.on(Events.EPOCH_COMPLETED) def log_training_results(trainer): # evaluate on training set evaluator.run(train_loader) metrics = evaluator.state.metrics logger.info("Training Results - Epoch: {} Avg-loss: {:.3f}\n Pix-acc: {}\n IoU: {}\n F1: {}\n".format( trainer.state.epoch, metrics['loss'], str(metrics['pix-acc']), str(metrics['iou']), str(metrics['f1']))) # update state update_state(weight=model.state_dict(), train_loss=metrics['loss'], val_loss=state['val_loss'], val_pix_acc=state['val_pix_acc'], val_iou=state['val_iou'], val_f1=state['val_f1']) # execution after every epoch @trainer.on(Events.EPOCH_COMPLETED) def log_validation_results(trainer): # evaluate test(validation) set evaluator.run(test_loader) metrics = evaluator.state.metrics logger.info("Validation Results - Epoch: {} Avg-loss: {:.3f}\n Pix-acc: {}\n IoU: {}\n F1: {}\n".format( trainer.state.epoch, metrics['loss'], str(metrics['pix-acc']), str(metrics['iou']), str(metrics['f1']))) # update scheduler lr_scheduler.step(metrics['loss']) # update and save state update_state(weight=model.state_dict(), train_loss=state['train_loss'], val_loss=metrics['loss'], val_pix_acc=metrics['pix-acc'], val_iou=metrics['iou'], val_f1=metrics['f1']) path = ckpt_path.format(network=networks, optimizer=optimizer, lr=lr, epoch=trainer.state.epoch) save_ckpt_file(path, state) trainer.run(train_loader, max_epochs=epochs)
keys = list(cocoGt.imgs.keys()) catIds = cocoGt.getCatIds(catNms=['person']) imgIds = cocoGt.getImgIds(catIds=catIds) keys = list(cocoGt.imgs.keys()) if not os.path.exists(write_json): input_node = tf.placeholder(tf.float32, shape=(1, args.input_height, args.input_width, 3), name='image') fp = open(write_json, 'w') result = [] with tf.Session(config=config) as sess: if not args.use_tensorrt: net, _, last_layer = get_network(args.model, input_node, sess) context = None else: net, last_layer = None, None engine = create_engine(args.engine, args.graph, args.input_height, args.input_width, 'image', 'Openpose/concat_stage7', args.half16) context = engine.create_execution_context() for i, image_id in enumerate(tqdm(keys)): #image_id = int(getLastName(img)) img_meta = cocoGt.imgs[image_id] img_idx = img_meta['id'] ann_idx = cocoGt.getAnnIds(imgIds=image_id) anns = cocoGt.loadAnns(ann_idx)
parser.add_argument('--stage-level', type=int, default=6) parser.add_argument( '--model', type=str, default='mobilenet', help='cmu / mobilenet / mobilenet_accurate / mobilenet_fast') args = parser.parse_args() input_node = tf.placeholder(tf.float32, shape=(1, args.input_height, args.input_width, 3), name='image') with tf.Session(config=config) as sess: net, _, last_layer = get_network(args.model, input_node, sess, trainable=False) logging.debug('read image+') image = read_imgfile(args.imgpath, args.input_width, args.input_height) vec = sess.run(net.get_output(name='concat_stage7'), feed_dict={'image:0': [image]}) a = time.time() run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata = tf.RunMetadata() pafMat, heatMat = sess.run([ net.get_output( name=last_layer.format(stage=args.stage_level, aux=1)), net.get_output( name=last_layer.format(stage=args.stage_level, aux=2))
def build_net(self, config): # customize your build_net function # should return the built network return get_network(config)