Example #1
0
def predict(batch_idx, test_imgs, shape, sub_df, backbone, TTA, model):
    h, w = shape
    test_generator = DataGenerator(batch_idx,
                                   df=test_imgs,
                                   shuffle=False,
                                   mode='predict',
                                   dim=(350, 525),
                                   reshape=shape,
                                   n_channels=3,
                                   base_path='../../dados/test_images/',
                                   target_df=sub_df,
                                   batch_size=43,
                                   n_classes=4,
                                   backbone=backbone)

    if TTA:
        test_generator.batch_size = 1
        tta_model = tta_segmentation(model,
                                     h_flip=True,
                                     v_flip=True,
                                     input_shape=(h, w, 3),
                                     merge='mean')

        batch_pred_masks = tta_model.predict_generator(test_generator,
                                                       workers=40,
                                                       verbose=1)
    else:
        batch_pred_masks = model.predict_generator(test_generator,
                                                   workers=40,
                                                   verbose=1)

    return batch_pred_masks
Example #2
0
def train_neural_net(ids_cat, mapping, use_finger_feature=True):
    ids = sorted(list(ids_cat.keys()))
    training_gen = DataGenerator(list_ids=ids[:-500],
                                 path='enhanced',
                                 look_up=ids_cat,
                                 mapping=mapping,
                                 finger_feature=use_finger_feature,
                                 binary_mode=True,
                                 batch_size=16,
                                 prop_image=0,
                                 prop_array=.5)
    valid_gen = DataGenerator(list_ids=ids[-500:],
                              path='enhanced',
                              look_up=ids_cat,
                              mapping=mapping,
                              finger_feature=use_finger_feature,
                              binary_mode=True,
                              batch_size=16,
                              prop_image=0,
                              prop_array=0)

    model = Neural_Net(img_size=(512, 512),
                       num_classes=len(mapping),
                       finger_feature=use_finger_feature)
    model.set_net(relative_size=.2)
    model.compile(metrics=['acc'])

    lower_lear = ReduceLROnPlateau(monitor='loss',
                                   factor=.33,
                                   patience=10,
                                   verbose=0,
                                   mode='auto',
                                   cooldown=10)
    callback_tb = keras.callbacks.TensorBoard()

    model.fit(training_generator=training_gen,
              validation_generator=valid_gen,
              epochs=56,
              callbacks=[callback_tb, lower_lear])

    model.store_model('logs/model_{}.h5'.format(int(time.time())))

    return model
def train(model, uuid, train_config, img_size, nslices, mode='generator'):
    cp_name = os.path.join(uuid + "{epoch:02d}.h5")
    csv_name = os.path.join(uuid + ".csv")

    # set up the metrics list
    csv_cb = CSVLogger(csv_name)
    # set up the checkpoint
    #ckpt_cb = ModelCheckpoint(cp_name, monitor='val_loss', save_best_only=False, save_weights_only=False, period = 1)

    time_callback = TimeHistory()
    callbacks = []
    #callbacks.append(ckpt_cb)
    callbacks.append(csv_cb)
    callbacks.append(time_callback)
    # running in the fit() mode
    if mode == "fit":
        tic = time.time()
        train_in, train_out = load_files(train_config["train_path"],
                                         train_config["ext"])
        valid_in, valid_out = load_files(train_config["valid_path"],
                                         train_config["ext"])
        logging.info("Time of the loading : " + str(time.time() - tic))

        logging.info("start to train")
        tic = time.time()
        model.fit(train_in,
                  train_out,
                  batch_size=train_config["batch_size"],
                  epochs=train_config["epochs"],
                  verbose=train_config["verbose"],
                  shuffle=train_config['shuffle'],
                  validation_data=(valid_in, valid_out),
                  callbacks=callbacks)

        toc = time.time() - tic
        logging.info("It takes " + str(toc) + " to train")
        logging.info(time_callback.times)

    elif mode == "generator":
        # running in the fit_generator mode
        logging.info("applying generator mode")

        tic = time.time()

        # generate a training generator
        training_generator = DataGenerator(
            dirpath=train_config["train_path"],
            img_size=img_size,
            batch_size=train_config['batch_size'],
            nslice=train_config["nslice"],
            ext=train_config["ext"])

        # generate a validation generator
        validation_generator = DataGenerator(
            dirpath=train_config["valid_path"],
            img_size=img_size,
            batch_size=train_config['batch_size'],
            nslice=train_config["nslice"],
            ext=train_config["ext"])

        logging.info("Time of the step to set up generator: " +
                     str(time.time() - tic))

        # set up the fit generator
        model.fit_generator(epochs=train_config["epochs"],
                            generator=training_generator,
                            validation_data=validation_generator,
                            callbacks=callbacks,
                            max_queue_size=train_config["queue_size"],
                            workers=train_config["workers"],
                            use_multiprocessing=train_config["multi_process"],
                            shuffle=train_config["shuffle"])

    return model
Example #4
0
def main():
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    sess = tf.Session(config=config)
    K.tensorflow_backend.set_session(sess)

    args = parser.parse_args()
    MODEL = args.model
    EPOCH = args.epoch
    BATCH_SIZE = args.batch_size
    NUM_WORKER = args.num_worker

    db, paths, age_label, gender_label = load_data()
    n_fold = 1
    print('[K-FOLD] Started...')
    kf = KFold(n_splits=10, shuffle=True, random_state=1)
    kf_split = kf.split(age_label)
    for train_idx, test_idx in kf_split:
        model = None
        if MODEL == 'ssrnet':
            model = AgenderSSRNet(64, [3, 3, 3], 1.0, 1.0)
        elif MODEL == 'inceptionv3':
            model = AgenderNetInceptionV3()
        elif MODEL == 'mobilenetv1':
            model = AgenderNetMobileNetV1()
        else:
            model = AgenderNetMobileNetV2()
        train_db = db[train_idx]
        train_paths = paths[train_idx]
        train_age = age_label[train_idx]
        train_gender = gender_label[train_idx]

        test_db = db[test_idx]
        test_paths = paths[test_idx]
        test_age = age_label[test_idx]
        test_gender = gender_label[test_idx]

        losses = {
            "age_prediction": "categorical_crossentropy",
            "gender_prediction": "categorical_crossentropy",
        }
        metrics = {
            "age_prediction": mae,
            "gender_prediction": "acc",
        }
        if MODEL == 'ssrnet':
            losses = {
                "age_prediction": "mae",
                "gender_prediction": "mae",
            }
            metrics = {
                "age_prediction": "mae",
                "gender_prediction": "binary_accuracy",
            }

        callbacks = [
            ModelCheckpoint(
                "train_weight/{}-{epoch:02d}-{val_loss:.4f}-{val_gender_prediction_acc:.4f}-{val_age_prediction_mae:.4f}.h5"
                .format(MODEL),
                verbose=1,
                save_best_only=True,
                save_weights_only=True),
            CSVLogger('train_log/{}-{}.log'.format(MODEL, n_fold))
        ]
        if MODEL == 'ssrnet':
            callbacks = [
                ModelCheckpoint(
                    "train_weight/{}-{epoch:02d}-{val_loss:.4f}-{val_gender_prediction_binary_accuracy:.4f}-{val_age_prediction_mean_absolute_error:.4f}.h5"
                    .format(MODEL),
                    verbose=1,
                    save_best_only=True,
                    save_weights_only=True),
                CSVLogger('train_log/{}-{}.log'.format(MODEL, n_fold)),
                DecayLearningRate([30, 60])
            ]
        model.compile(optimizer='adam', loss=losses, metrics=metrics)
        model.fit_generator(DataGenerator(model, train_db, train_paths,
                                          train_age, train_gender, BATCH_SIZE),
                            validation_data=DataGenerator(
                                model, test_db, test_paths, test_age,
                                test_gender, BATCH_SIZE),
                            epochs=EPOCH,
                            verbose=2,
                            workers=NUM_WORKER,
                            use_multiprocessing=True,
                            max_queue_size=int(BATCH_SIZE * 2),
                            callbacks=callbacks)
        n_fold += 1
        del train_db, train_paths, train_age, train_gender
        del test_db, test_paths, test_age, test_gender
def train(smmodel,
          backbone,
          batch_size,
          shape=(320, 480),
          nfold=0,
          pseudo_label=None):

    # if shape is None:
    #     shape = (1400,2100)

    train_df, mask_count_df = get_data_preprocessed(pseudo_label)
    ros = RandomOverSampler(random_state=random_seed)

    skf = StratifiedKFold(n_splits=n_fold_splits,
                          random_state=random_seed,
                          shuffle=True)

    for n_fold, (train_indices, val_indices) in enumerate(
            skf.split(mask_count_df.index, mask_count_df.hasMask)):
        # train_indices, _ = ros.fit_resample(train_indices.reshape(-1, 1),
        #                                            mask_count_df[mask_count_df.index.isin(train_indices)]['hasMask'])
        #
        # train_indices = list(itertools.chain.from_iterable(train_indices))
        # val_images = mask_count_df[mask_count_df.index.isin(val_indices)]['ImageId'].tolist()
        # train_images = mask_count_df[mask_count_df.index.isin(train_indices)]['ImageId'].tolist()
        # #
        # for classe in ['Fish','Flower','Gravel','Sugar']:
        #     train_df, mask_count_df = get_data_preprocessed(pseudo_label, classe=classe)
        #     val_indices = mask_count_df[mask_count_df['ImageId'].isin(val_images)].index
        #     train_indices = mask_count_df[mask_count_df['ImageId'].isin(train_images)].index
        #     print('Training class ', classe)
        if n_fold >= nfold:
            print('Training fold number ', str(n_fold))

            train_generator = DataGenerator(
                train_indices,
                df=mask_count_df,
                target_df=train_df,
                batch_size=batch_size,
                reshape=shape,
                augment=True,
                n_channels=3,
                n_classes=n_classes,
                backbone=backbone,
                randomcrop=False,
            )

            val_generator = DataGenerator(
                val_indices,
                df=mask_count_df,
                target_df=train_df,
                batch_size=batch_size,
                reshape=shape,
                augment=False,
                n_channels=3,
                n_classes=n_classes,
                backbone=backbone,
                randomcrop=False,
            )

            # opt = RAdam(lr=0.0003)
            opt = Nadam(lr=0.0003)
            # opt = RMSprop(lr=0.0003)
            # accum_iters = 64 // batch_size
            # opt = AdamAccumulate(lr=0.0003, accum_iters=accum_iters)
            # optimizer = GradientAccumulation(opt, accumulation_steps=4)

            dice_focal_loss = sm_loss()
            dice_metric = jaccard()

            metrics = [
                dice_coef, dice_coef_fish, dice_coef_flower, dice_coef_gravel,
                dice_coef_sugar
            ]
            model = get_model(smmodel, backbone, opt, dice_coef_loss_bce,
                              [dice_coef, dice_metric])
            filepath = '../models/best_' + str(smmodel) + '_' + str(
                backbone) + '_' + str(n_fold)
            # filepath = '../models/best_' + str(smmodel) + '_' + str(backbone) + '_' + str(n_fold) + '_' + classe

            ckp = ModelCheckpoint(filepath + '.h5',
                                  monitor='val_f1-score',
                                  verbose=1,
                                  save_best_only=True,
                                  mode='max',
                                  save_weights_only=True)

            es = EarlyStopping(monitor='val_f1-score',
                               min_delta=0.00001,
                               patience=5,
                               verbose=1,
                               mode='max')
            rlr = ReduceLROnPlateau(monitor='val_f1-score',
                                    factor=0.2,
                                    patience=3,
                                    verbose=1,
                                    mode='max',
                                    min_delta=0.0001)
            swa = SWA(
                '../models/best_' + str(smmodel) + '_' + str(backbone) + '_' +
                str(n_fold) + '_swa.h5', 10)

            history = model.fit_generator(train_generator,
                                          validation_data=val_generator,
                                          callbacks=[ckp, rlr, es, swa],
                                          epochs=epochs,
                                          use_multiprocessing=True,
                                          workers=42)
def multimodel_eval(smmodel,
                    backbone,
                    nfold,
                    maxfold,
                    shape=(320, 480),
                    swa=False,
                    tta=False,
                    fixshape=True):
    h, w = shape

    train_df, mask_count_df = get_data_preprocessed()
    opt = Nadam(lr=0.0002)

    skf = StratifiedKFold(n_splits=n_fold_splits,
                          random_state=random_seed,
                          shuffle=True)
    oof_data = np.zeros((len(mask_count_df.index), 350, 525, 4),
                        dtype=np.float16)
    oof_predicted_data = np.zeros((len(mask_count_df.index), 350, 525, 4),
                                  dtype=np.float16)
    oof_imgname = []

    oof_dice = []
    classes = ['Fish', 'Flower', 'Gravel', 'Sugar']
    cnt_position = 0

    for n_fold, (train_indices, val_indices) in enumerate(
            skf.split(mask_count_df.index, mask_count_df.hasMask)):
        final_pred = np.zeros((len(val_indices), h, w, 4), dtype=np.float32)
        y_true = []
        if n_fold >= nfold and n_fold <= maxfold:
            if n_fold >= 2:
                nclass = 4
                print(nclass)
            else:
                nclass = n_classes

            print('Evaluating fold number ', str(n_fold))

            val_generator = DataGenerator(val_indices,
                                          df=mask_count_df,
                                          shuffle=False,
                                          target_df=train_df,
                                          batch_size=len(val_indices),
                                          reshape=shape,
                                          augment=False,
                                          n_channels=3,
                                          n_classes=4,
                                          backbone=backbone)

            _, y_true = val_generator.__getitem__(0)
            img_true = val_generator.image_name
            oof_imgname.extend(img_true)
            val_generator.batch_size = 1

            for i, cls in enumerate(classes):

                model = get_model(smmodel,
                                  backbone,
                                  opt,
                                  dice_coef_loss_bce, [dice_coef],
                                  nclass=nclass)

                filepath = '../models/best_' + str(smmodel) + '_' + str(
                    backbone) + '_' + str(n_fold) + '_' + cls

                if swa:
                    filepath += '_swa.h5'
                else:
                    filepath += '.h5'

                model.load_weights(filepath)

                # results = model.evaluate_generator(
                #     val_generator,
                #     workers=40,
                #     verbose=1
                # )
                # print(results)

                if tta:
                    model = tta_segmentation(model,
                                             h_flip=True,
                                             v_flip=True,
                                             input_shape=(h, w, 3),
                                             merge='mean')

                y_pred = model.predict_generator(val_generator,
                                                 workers=40,
                                                 verbose=1)

                final_pred[:, :, :, i] = y_pred[:, :, :, 0]

                del y_pred
                gc.collect()

            print(y_true.shape)
            print(final_pred.shape)
            print(len(oof_imgname))
            d = np_dice_coef(y_true, final_pred)
            oof_dice.append(d)
            print("Dice: ", d)

            for i in range(y_true.shape[0]):
                oof_data[cnt_position, :, :, :] = np_resize(
                    y_true[i, :, :, :].astype(np.float32),
                    (350, 525)).astype(np.float16)
                oof_predicted_data[cnt_position, :, :, :] = np_resize(
                    final_pred[i, :, :, :].astype(np.float32),
                    (350, 525)).astype(np.float16)
                cnt_position += 1

        del y_true, final_pred
        gc.collect()

    del val_generator, model
    gc.collect()

    oof_imgname = np.asarray(oof_imgname)
    print(oof_data.shape)
    print(oof_predicted_data.shape)
    print(oof_imgname.shape)
    print("CV Final Dice: ", np.mean(oof_dice))

    np.save(
        '../validations/img_name_' + str(smmodel) + '_' + str(backbone) + '_' +
        str(n_fold_splits) + '.npy', oof_imgname)
    np.save('../validations/y_true_' + str(n_fold_splits) + '.npy', oof_data)
    np.save(
        '../validations/' + str(smmodel) + '_' + str(backbone) + '_' +
        str(n_fold_splits) + '.npy', oof_predicted_data)
def evaluate(smmodel,
             backbone,
             nfold,
             maxfold,
             shape=(320, 480),
             swa=False,
             tta=False,
             fixshape=True):
    h, w = shape

    train_df, mask_count_df = get_data_preprocessed()
    opt = Nadam(lr=0.0002)

    skf = StratifiedKFold(n_splits=n_fold_splits,
                          random_state=random_seed,
                          shuffle=True)
    oof_data = np.zeros((len(mask_count_df.index), 350, 525, 4),
                        dtype=np.float16)
    oof_predicted_data = np.zeros((len(mask_count_df.index), 350, 525, 4),
                                  dtype=np.float16)
    oof_imgname = []
    # num_cpus = psutil.cpu_count(logical=False)
    # ray.init(num_cpus=4)
    oof_dice = []
    cnt_position = 0
    for n_fold, (train_indices, val_indices) in enumerate(
            skf.split(mask_count_df.index, mask_count_df.hasMask)):

        for i in range(0, len(val_indices), 480):
            batch_idx = list(range(i, min(len(val_indices), i + 480)))
            model = get_model(smmodel, backbone, opt, dice_coef_loss_bce,
                              [dice_coef])
            if n_fold >= nfold and n_fold <= maxfold:
                print('Evaluating fold number ', str(n_fold))

                val_generator = DataGenerator(val_indices[batch_idx],
                                              df=mask_count_df,
                                              shuffle=False,
                                              target_df=train_df,
                                              batch_size=len(
                                                  val_indices[batch_idx]),
                                              reshape=shape,
                                              augment=False,
                                              n_channels=3,
                                              n_classes=4,
                                              backbone=backbone)

                _, y_true = val_generator.__getitem__(0)
                img_true = val_generator.image_name
                oof_imgname.extend(img_true)
                val_generator.batch_size = 1

                filepath = '../models/best_' + str(smmodel) + '_' + str(
                    backbone) + '_' + str(n_fold)

                if swa:
                    filepath += '_swa.h5'
                else:
                    filepath += '.h5'

                model.load_weights(filepath)

                # results = model.evaluate_generator(
                #     val_generator,
                #     workers=40,
                #     verbose=1
                # )
                # print(results)

                if tta:
                    model = tta_segmentation(model,
                                             h_flip=True,
                                             v_flip=True,
                                             input_shape=(h, w, 3),
                                             merge='mean')

                y_pred = model.predict_generator(val_generator,
                                                 workers=40,
                                                 verbose=1)
                print(y_true.shape)
                print(y_pred.shape)
                print(len(oof_imgname))

                f = []
                for i in range(y_true.shape[0]):
                    for j in range(4):
                        d1 = np_dice_coef(y_true[i, :, :, j], y_pred[i, :, :,
                                                                     j])
                        f.append(d1)

                    oof_data[cnt_position, :, :, :] = np_resize(
                        y_true[i, :, :, :].astype(np.float32),
                        (350, 525)).astype(np.float16)
                    oof_predicted_data[cnt_position, :, :, :] = np_resize(
                        y_pred[i, :, :, :].astype(np.float32),
                        (350, 525)).astype(np.float16)
                    cnt_position += 1
                print("Dice: ", np.mean(f))
                oof_dice.append(np.mean(f))
                del y_true, y_pred, val_generator, model
                gc.collect()

    # oof_data = np.asarray(oof_data)
    # oof_predicted_data = np.asarray(oof_predicted_data)
    oof_imgname = np.asarray(oof_imgname)
    print(oof_data.shape)
    print(oof_predicted_data.shape)
    print(oof_imgname.shape)
    print("CV Final Dice: ", np.mean(oof_dice))

    np.save('../validations/img_name_' + str(n_fold_splits) + '.npy',
            oof_imgname)
    np.save('../validations/y_true_' + str(n_fold_splits) + '.npy', oof_data)
    np.save(
        '../validations/' + str(smmodel) + '_' + str(backbone) + '_' +
        str(n_fold_splits) + '.npy', oof_predicted_data)
Example #8
0
    def main(self):
        if self.model_type == 'age_gender':
            model = MTLAgeGender().model()

            loss = {
                'gender': 'binary_crossentropy',
                'age': 'categorical_crossentropy'
            }
            metrics = ['acc']
            opt = Adam(lr=self.learning_rate)

            age_drawer = DrawGraph(self.model_type, 'age')
            gender_drawer = DrawGraph(self.model_type, 'gender')
            early_stop_check = MultiOutputEarlyStoppingAndCheckpoint(
                ['val_gender_acc', 'val_age_acc'], self.model_type, 3)
            callbacks = [age_drawer, gender_drawer, early_stop_check]

        elif self.model_type == 'age_gender_emotion':
            model = MTLAgeGenderEmotion().model()

            loss = {
                'gender': 'binary_crossentropy',
                'age': 'categorical_crossentropy',
                'emotion': 'categorical_crossentropy'
            }
            metrics = ['acc']
            opt = Adam(lr=self.learning_rate)

            age_drawer = DrawGraph(self.model_type, 'age')
            gender_drawer = DrawGraph(self.model_type, 'gender')
            emotion_drawer = DrawGraph(self.model_type, 'emotion')
            early_stop_check = MultiOutputEarlyStoppingAndCheckpoint(
                ['val_gender_acc', 'val_age_acc', 'val_emotion_acc'],
                self.model_type, 5)
            callbacks = [
                age_drawer, gender_drawer, emotion_drawer, early_stop_check
            ]

        else:
            return None

        x_train, y_train = self.load_data()
        x_train, x_test, y_train, y_test = train_test_split(
            x_train, y_train, test_size=self.split_ratio)

        train_data = DataGenerator(x_train,
                                   y_train,
                                   self.model_type,
                                   self.batch_size,
                                   shuffle=True,
                                   augment=True)
        val_data = DataGenerator(x_test, y_test, self.model_type,
                                 self.batch_size)

        model.compile(optimizer=opt, loss=loss, metrics=metrics)

        _ = model.fit_generator(generator=train_data,
                                validation_data=val_data,
                                epochs=200,
                                steps_per_epoch=len(train_data),
                                validation_steps=len(val_data),
                                callbacks=callbacks,
                                verbose=1)
Example #9
0
def evaluate(smmodel, backbone, nfold, shape=(320, 480)):

    n_splits = 6
    # if shape is None:
    #     shape = (1400,2100)

    train_df, mask_count_df = get_data_preprocessed()

    skf = StratifiedKFold(n_splits=n_splits, random_state=133)
    oof_data = []
    oof_predicted_data = []
    # num_cpus = psutil.cpu_count(logical=False)
    # ray.init(num_cpus=4)
    oof_dice = []

    for n_fold, (train_indices, val_indices) in enumerate(skf.split(mask_count_df.index, mask_count_df.hasMask)):

        if n_fold >= nfold:
            print('Evaluating fold number ', str(n_fold))

            val_generator = DataGenerator(
                val_indices,
                df=mask_count_df,
                shuffle=False,
                target_df=train_df,
                batch_size=len(val_indices),
                reshape=shape,
                augment=False,
                n_channels=3,
                n_classes=4,
                backbone=backbone
            )

            _, y_true = val_generator.__getitem__(0)

            oof_data.extend(y_true.astype(np.float16))

            del y_true
            gc.collect()

    del val_generator
    gc.collect()

    oof_data = np.asarray(oof_data)
    oof_predicted_data = np.load('../predictions/' + str(smmodel) + '_' + str(backbone) + '_' + str(n_splits) + '_oof_tta.npy')
    print(oof_data.shape)
    print(oof_predicted_data.shape)
    print("CV Final Dice: ", np.mean(oof_dice))

    now = time.time()
    class_params = {}
    for class_id in range(4):
        print(class_id)
        attempts = []
        for t in tqdm(range(55, 80, 5)):
            t /= 100
            for ms in range(10000, 31000, 5000):
                d = parallel_post_process(oof_data, oof_predicted_data, class_id, t, ms, shape)

                # print(t, ms, np.mean(d))
                attempts.append((t, ms, np.mean(d)))

        attempts_df = pd.DataFrame(attempts, columns=['threshold', 'size', 'dice'])

        attempts_df = attempts_df.sort_values('dice', ascending=False)
        print(attempts_df.head())
        print('Time: ', time.time() - now)
        best_threshold = attempts_df['threshold'].values[0]
        best_size = attempts_df['size'].values[0]
        class_params[class_id] = (best_threshold, best_size)