def data_aug(train_path, num_rois, hf=True, vf=False, rot_90=False, num_epoches=2000, output_weight_path='weights/{}faster_rcnn.hdf5'.format( time.localtime(time.time()))): C = config.Config() C.num_rois = int(num_rois) C.use_horizontal_flips = hf C.use_vertical_flips = vf C.rot_90 = rot_90 C.model_path = output_weight_path all_imgs, class_count, class_mapping = get_data(train_path) for img_data in all_imgs: img_aug, img = data_augment.augment(img_data, C, augment=True) if img_aug['filepath'] != img_data['filepath']: all_imgs.append(img_aug) else: pass
import math import os.path from model import config C = config.Config() def anchors(): return mk_anchors(C.TRAIN_SCALES[0], C.TRAIN_SCALES[1], C.SIZE_PATTERN, C.STEP_PATTERN) def reglayer_scale(size, num_layer, size_the): reg_layer_size = [] for i in range(num_layer + 1): size = math.ceil(size / 2.) if i >= 2: reg_layer_size += [size] if i == num_layer and size_the != 0: reg_layer_size += [size - size_the] return reg_layer_size def get_scales(size, size_pattern): size_list = [] for x in size_pattern: size_list += [round(x * size, 2)] return size_list def aspect_ratio(num):
transform_test) mdl = model.build_extractor_fpn(cfg) mdl.load_state_dict(torch.load(mdl_path)) if torch.cuda.is_available(): print "GPU is available, so the model will be trained on GPU" mdl.cuda() mdl.eval() total_test_step = len(test_loader) #TODO: could implmement 10 crops evaluation for i, (images, labels) in enumerate(test_loader): print 'Step [%d/%d]'.format(i, total_test_step) res, _ = mdl(images) pre = res[0] pred = torch.cat((pred, pre), 0) gt = torch.cat((gt, labels), 0) AUROCs = tools.compute_AUCs(gt, pred) AUROC_avg = np.array(AUROCs).mean() print('The average AUROC is {AUROC_avg:.3f}'.format(AUROC_avg=AUROC_avg)) for i in range(14): print('The AUROC of {} is {}'.format(CLASS_NAMES[i], AUROCs[i])) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--mdl_path', type=str, default='./checkpoints/', help='path for trained encoder') cfg = config.Config() args = parser.parse_args() test(cfg, args)
def main(): args = parser.parse_args() time_stamp = "{0:%Y%m%d-%H%M%S}".format(datetime.now()) save_name = os.path.join(args.save_dir, "train_{}".format(time_stamp)) if not(os.path.isdir(args.save_dir)): os.makedirs(args.save_dir) if args.path == None: raise OSError("path to annotation file must be required.") C = config.Config() C.config_filename = save_name + "_config.pickle" C.model_path = save_name + "_model.hdf5" C.use_horizontal_flips = bool(args.horizontal_flips) C.use_vertical_flips = bool(args.vertical_flips) C.rot_90 = bool(args.rot_90) all_imgs, classes_count, class_mapping = get_data(args.path) C.class_mapping = class_mapping with open(C.config_filename, 'wb') as config_f: pickle.dump(C,config_f) print("-------------------------------") print('path to config file : {}'.format(C.config_filename)) print("-------------------------------") train_imgs = [s for s in all_imgs if s['imageset'] == 'trainval'] val_imgs = [s for s in all_imgs if s['imageset'] == 'test'] data_gen_train = data_generators.get_anchor_gt(train_imgs, classes_count, C, K.image_dim_ordering(), mode='train') data_gen_val = data_generators.get_anchor_gt(val_imgs, classes_count, C, K.image_dim_ordering(), mode='val') model_rpn, model_classifier, model_all = faster_rcnn.get_model(C, classes_count) losses = np.zeros((args.n_iters, 5)) rpn_accuracy_rpn_monitor, rpn_accuracy_for_epoch = [], [] best_loss = np.Inf with open('out.csv', 'w') as f: f.write('Accuracy,RPN classifier,RPN regression,Detector classifier,Detector regression,Total') f.write('\t') iter_num = 0 t0 = start_time = time.time() try: for epoch_num in range(args.n_epochs): progbar = generic_utils.Progbar(args.n_iters) print('Epoch {}/{}'.format(epoch_num + 1, args.n_epochs)) while True: try: if len(rpn_accuracy_rpn_monitor) == args.n_iters and C.verbose: mean_overlapping_bboxes = float(sum(rpn_accuracy_rpn_monitor))/len(rpn_accuracy_rpn_monitor) rpn_accuracy_rpn_monitor = [] print('Average number of overlapping bounding boxes from RPN = {} for {} previous iterations'.format(mean_overlapping_bboxes, args.n_iters)) if mean_overlapping_bboxes == 0: print('RPN is not producing bounding boxes that overlap the ground truth boxes. Check RPN settings or keep training.') X, Y, img_data = next(data_gen_train) loss_rpn = model_rpn.train_on_batch(X, Y) P_rpn = model_rpn.predict_on_batch(X) R = roi_helpers.rpn_to_roi(P_rpn[0], P_rpn[1], C, K.image_dim_ordering(), use_regr=True, overlap_thresh=0.7, max_boxes=300) # note: calc_iou converts from (x1,y1,x2,y2) to (x,y,w,h) format X2, Y1, Y2 = roi_helpers.calc_iou(R, img_data, C, class_mapping) neg_samples = np.where(Y1[0, :, -1] == 1) pos_samples = np.where(Y1[0, :, -1] == 0) if len(neg_samples) > 0: neg_samples = neg_samples[0] else: neg_samples = [] if len(pos_samples) > 0: pos_samples = pos_samples[0] else: pos_samples = [] rpn_accuracy_rpn_monitor.append(len(pos_samples)) rpn_accuracy_for_epoch.append((len(pos_samples))) if len(pos_samples) < C.num_rois//2: selected_pos_samples = pos_samples.tolist() else: selected_pos_samples = np.random.choice(pos_samples, C.num_rois//2, replace=False).tolist() try: selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=False).tolist() except: selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=True).tolist() sel_samples = selected_pos_samples + selected_neg_samples loss_class = model_classifier.train_on_batch([X, X2[:, sel_samples, :]], [Y1[:, sel_samples, :], Y2[:, sel_samples, :]]) if iter_num == args.n_iters: loss_rpn_cls = np.mean(losses[:, 0]) loss_rpn_regr = np.mean(losses[:, 1]) loss_class_cls = np.mean(losses[:, 2]) loss_class_regr = np.mean(losses[:, 3]) class_acc = np.mean(losses[:, 4]) mean_overlapping_bboxes = float(sum(rpn_accuracy_for_epoch)) / len(rpn_accuracy_for_epoch) rpn_accuracy_for_epoch = [] if C.verbose: print('Mean number of bounding boxes from RPN overlapping ground truth boxes: {}'.format(mean_overlapping_bboxes)) print('Classifier accuracy for bounding boxes from RPN: {}'.format(class_acc)) print('Loss RPN classifier: {}'.format(loss_rpn_cls)) print('Loss RPN regression: {}'.format(loss_rpn_regr)) print('Loss Detector classifier: {}'.format(loss_class_cls)) print('Loss Detector regression: {}'.format(loss_class_regr)) print('Elapsed time: {}[s]'.format(time.time() - start_time)) target_text_file = open('out.csv', 'a') target_text_file.write('{},{},{},{},{},{}'.format(class_acc, loss_rpn_cls, loss_rpn_regr, loss_class_cls, loss_class_regr, loss_rpn_cls + loss_rpn_regr + loss_class_cls + loss_class_regr)) target_text_file.write('\t') curr_loss = loss_rpn_cls + loss_rpn_regr + loss_class_cls + loss_class_regr iter_num = 0 start_time = time.time() if curr_loss < best_loss: if C.verbose: print('Total loss decreased from {} to {}, saving weights'.format(best_loss,curr_loss)) best_loss = curr_loss model_all.save_weights(C.model_path) break losses[iter_num, 0] = loss_rpn[1] losses[iter_num, 1] = loss_rpn[2] losses[iter_num, 2] = loss_class[1] losses[iter_num, 3] = loss_class[2] losses[iter_num, 4] = loss_class[3] iter_num += 1 progbar.update(iter_num, [('rpn_cls', np.mean(losses[:iter_num, 0])), ('rpn_regr', np.mean(losses[:iter_num, 1])), ('detector_cls', np.mean(losses[:iter_num, 2])), ('detector_regr', np.mean(losses[:iter_num, 3]))]) except Exception as e: print('Exception: {}'.format(e)) continue except KeyboardInterrupt: t1 = time.time() print('\nIt took {:.2f}s'.format(t1-t0)) sys.exit('Keyboard Interrupt') print("training is done") print("-------------------------------") print('path to config file : {}'.format(C.config_filename)) print("-------------------------------")
def main(train_path, num_rois, hf=True, vf=False, rot_90=False, num_epoches=2000, output_weight_path='weights/{}faster_rcnn.hdf5'.format( time.localtime(time.time()))): C = config.Config() C.num_rois = int(num_rois) C.use_horizontal_flips = hf C.use_vertical_flips = vf C.rot_90 = rot_90 C.model_path = output_weight_path all_imgs, class_count, class_mapping = get_data(train_path) if 'bg' not in class_count: class_count['bg'] = 0 class_mapping['bg'] = len(class_mapping) C.class_mapping = class_mapping inv_map = {v: k for k, v in class_mapping.items()} print('classes_count:', class_count) print('class_mapping', class_mapping) train_imgs = [s for s in all_imgs if s['type'] == 'train'] val_imgs = [s for s in all_imgs if s['type'] == 'val'] test_imgs = [s for s in all_imgs if s['type'] == 'test'] print("the number of train", len(train_imgs)) print('the number of val', len(val_imgs)) print('the number of test', len(test_imgs)) data_gen_train = data_generators.get_anchor_gt(train_imgs, class_count, C, K.image_dim_ordering(), mode='train') data_gen_val = data_generators.get_anchor_gt(val_imgs, class_count, C, K.image_dim_ordering(), mode='val') input_shape_img = (None, None, 3) img_input = Input(shape=input_shape_img) roi_input = Input(shape=(C.num_rois, 4)) shared_layers = resnet.ResNet50(img_input, trainable=True) #RPN built on the base layers num_anchors = len(C.anchor_box_scales) * len(C.anchor_box_ratios) rpn = resnet.rpn(shared_layers, num_anchors) classifier = resnet.classifier(shared_layers, roi_input, C.num_rois, nb_classes=len(class_count), trainable=True) model_rpn = Model(img_input, rpn[:2]) model_classifier = Model([img_input, roi_input], classifier) model_all = Model([img_input, roi_input], rpn[:2] + classifier) try: print('loading weights') model_rpn.load_weights(C.base_net_weight) model_classifier.load_weights(C.base_net_weight) except Exception as e: print(e) optimizer = Adam(lr=1e-3) optimizer_classifier = Adam(lr=1e-3) model_rpn.compile(optimizer=optimizer, loss=[ model.losses.rpn_loss_cls(num_anchors), model.losses.rpn_loss_regr(num_anchors) ]) model_classifier.compile( optimizer=optimizer_classifier, loss=[ model.losses.class_loss_cls, model.losses.class_loss_regr(len(class_count) - 1) ], metrics={'dense_class_{}'.format(len(class_count)): 'accuracy'}) model_all.compile(optimizer='sgd', loss='mae') epoch_length = 1000 iter_num = 0 losses = np.zeros((epoch_length, 5)) rpn_accuracy_rpn_monitor = [] rpn_accuracy_for_epoch = [] start_time = time.time() best_loss = np.Inf class_mapping_inv = inv_map print('start training') for epoch_num in range(num_epoches): progbar = generic_utils.Progbar(epoch_length) print('Epoch {}/{}'.format(epoch_num + 1, num_epoches)) while True: try: if len(rpn_accuracy_rpn_monitor) == epoch_length and C.verbose: mean_overlapping_bboxes = float( sum(rpn_accuracy_rpn_monitor)) / len( rpn_accuracy_rpn_monitor) rpn_accuracy_rpn_monitor = [] print( 'Average number of overlapping bounding boxes from RPN = {} for {} previous iterations' .format(mean_overlapping_bboxes, epoch_length)) if mean_overlapping_bboxes == 0: print( 'RPN is not producing bounding boxes that overlap the ground truth boxes. Check RPN settings or keep training.' ) X, Y, img_data = data_gen_train.next() loss_rpn = model_rpn.train_on_batch(X, Y) P_rpn = model_rpn.predict_on_batch(X) R = model.roi_helpers.rpn_to_roi(P_rpn[0], P_rpn[1], C, K.image_dim_ordering(), use_regr=True, overlap_thresh=0.7, max_boxes=300) # note: calc_iou converts from (x1,y1,x2,y2) to (x,y,w,h) format X2, Y1, Y2 = model.roi_helpers.calc_iou( R, img_data, C, class_mapping) if X2 is None: rpn_accuracy_rpn_monitor.append(0) rpn_accuracy_for_epoch.append(0) continue neg_samples = np.where(Y1[0, :, -1] == 1) pos_samples = np.where(Y1[0, :, -1] == 0) if len(neg_samples) > 0: neg_samples = neg_samples[0] else: neg_samples = [] if len(pos_samples) > 0: pos_samples = pos_samples[0] else: pos_samples = [] rpn_accuracy_rpn_monitor.append(len(pos_samples)) rpn_accuracy_for_epoch.append((len(pos_samples))) if C.num_rois > 1: if len(pos_samples) < C.num_rois / 2: selected_pos_samples = pos_samples.tolist() else: selected_pos_samples = np.random.choice( pos_samples, C.num_rois / 2, replace=False).tolist() try: selected_neg_samples = np.random.choice( neg_samples, C.num_rois - len(selected_pos_samples), replace=False).tolist() except: selected_neg_samples = np.random.choice( neg_samples, C.num_rois - len(selected_pos_samples), replace=True).tolist() sel_samples = selected_pos_samples + selected_neg_samples else: # in the extreme case where num_rois = 1, we pick a random pos or neg sample selected_pos_samples = pos_samples.tolist() selected_neg_samples = neg_samples.tolist() if np.random.randint(0, 2): sel_samples = random.choice(neg_samples) else: sel_samples = random.choice(pos_samples) loss_class = model_classifier.train_on_batch( [X, X2[:, sel_samples, :]], [Y1[:, sel_samples, :], Y2[:, sel_samples, :]]) losses[iter_num, 0] = loss_rpn[1] losses[iter_num, 1] = loss_rpn[2] losses[iter_num, 2] = loss_class[1] losses[iter_num, 3] = loss_class[2] losses[iter_num, 4] = loss_class[3] iter_num += 1 progbar.update( iter_num, [('rpn_cls', np.mean(losses[:iter_num, 0])), ('rpn_regr', np.mean(losses[:iter_num, 1])), ('detector_cls', np.mean(losses[:iter_num, 2])), ('detector_regr', np.mean(losses[:iter_num, 0]))]) if iter_num == epoch_length: loss_rpn_cls = np.mean(losses[:, 0]) loss_rpn_regr = np.mean(losses[:, 1]) loss_class_cls = np.mean(losses[:, 2]) loss_class_regr = np.mean(losses[:, 3]) class_acc = np.mean(losses[:, 4]) mean_overlapping_bboxes = float(sum( rpn_accuracy_for_epoch)) / len(rpn_accuracy_for_epoch) rpn_accuracy_for_epoch = [] if C.verbose: print( 'Mean number of bounding boxes from RPN overlapping ground truth boxes: {}' .format(mean_overlapping_bboxes)) print( 'Classifier accuracy for bounding boxes from RPN: {}' .format(class_acc)) print('Loss RPN classifier: {}'.format(loss_rpn_cls)) print('Loss RPN regression: {}'.format(loss_rpn_regr)) print('Loss Detector classifier: {}'.format( loss_class_cls)) print('Loss Detector regression: {}'.format( loss_class_regr)) print('Elapsed time: {}'.format(time.time() - start_time)) curr_loss = loss_rpn_cls + loss_rpn_regr + loss_class_cls + loss_class_regr iter_num = 0 start_time = time.time() if curr_loss < best_loss: if C.verbose: print( 'Total loss decreased from {} to {}, saving weights' .format(best_loss, curr_loss)) best_loss = curr_loss model_all.save_weights(C.model_path) break except Exception as e: print('Exception: {}'.format(e)) continue print('Training complete, exiting.')