Ejemplo n.º 1
0
    def load_model(self):
        tag = 'deeplab_' + self.model_name + '_' + self.dataset

        print('> Loading Model [%s] ' % (self.model_name))
        with self.sess.as_default():
            with tf.variable_scope('model'):
                self.model = Deeplabv3(weights=self.dataset,
                                       backbone=self.model_name,
                                       weights_path=auto_download(
                                           self.folder, tag))

                if self.save_and_reload:
                    # Save and reload the model to avoid batch normalization issues
                    model_weights = tf.compat.v1.get_collection(
                        tf.compat.v1.GraphKeys.TRAINABLE_VARIABLES,
                        scope='model')
                    print('> Saving Model')
                    tf.compat.v1.train.Saver(model_weights).save(
                        self.sess, 'tmp/')
                    print('> Reload Model')
                    tf.compat.v1.train.Saver(model_weights).restore(
                        self.sess, 'tmp/')

        self.model_in = self.model.layers[0].input
        self.model_out = self.model.layers[-1].output
        self.model_softmax = tf.compat.v1.nn.softmax(self.model_out, -1)
        self.model_label_out = tf.cast(
            tf.compat.v1.math.argmax(self.model_out, -1), tf.uint8)
Ejemplo n.º 2
0
def main(args):
    model = Deeplabv3(classes=21,
                      activation='softmax',
                      alpha=0.25,
                      weights=None)
    model.summary()
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    t = DataGenerator(args.train_data_dir)
    v = DataGenerator(args.val_data_dir)

    callbacks = [
        tf.keras.callbacks.TensorBoard(),
        tf.keras.callbacks.ModelCheckpoint(
            filepath='model-{epoch:02d}.h5',
            save_best_only=True,
            save_weights_only=True,
        ),
        tf.keras.callbacks.ReduceLROnPlateau(
            monitor='val_loss',
            patience=4,
            factor=0.1,
        ),
        tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=9),
    ]

    model.fit_generator(
        t,
        epochs=1000,
        validation_data=v,
        callbacks=callbacks,
    )
Ejemplo n.º 3
0
def main(args):
    import tensorflow as tf
    from deeplab.model import Deeplabv3

    deeplab_model = Deeplabv3(
        classes=2,
        activation='softmax',
        model_path=args.model_from,
    )
    deeplab_model.save(args.model_to)
Ejemplo n.º 4
0
def build_compile(optimizer,
                  input_height=360,
                  input_width=480,
                  extra_metrics=[]):
    """build and compile a Keras model.  deeplab was taken from https://github.com/bonlime/keras-deeplab-v3-plus"""
    model = Deeplabv3(input_shape=(input_height, input_width, 3), classes=2)
    model.compile(loss="categorical_crossentropy",
                  optimizer=optimizer,
                  metrics=['accuracy'] + extra_metrics)
    return model
Ejemplo n.º 5
0
 def load_model(self):
     tag = 'deeplab_' + self.model_name
     fn_weight = auto_download(self.folder,tag)
 
     print('> Loading Model [%s] ' % (self.model_name))
     with self.sess.as_default():
         with tf.variable_scope('model'):
             model = Deeplabv3(weights='pascal_voc', backbone=self.model_name, weights_path = fn_weight)
             self.model = model
             
             model_weights = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.TRAINABLE_VARIABLES, scope='model')
             print('> Saving Model')
             tf.compat.v1.train.Saver(model_weights).save(self.sess, 'tmp/')
             print('> Reload Model')
             tf.compat.v1.train.Saver(model_weights).restore(self.sess, 'tmp/')
     
     self.model_in = model.layers[0].input
     self.model_out = model.layers[-1].output
     self.model_softmax = tf.compat.v1.nn.softmax(self.model_out,-1)
     self.model_label_out = tf.cast(tf.compat.v1.math.argmax(self.model_out,-1),tf.uint8)
Ejemplo n.º 6
0
def main(args):
    from deeplab.model import Deeplabv3

    trained_image_width = args.dim
    mean_subtraction_value = 127.5
    image = np.array(Image.open(args.input_path))

    # resize to max dimension of images from training dataset
    w, h, _ = image.shape
    ratio = float(trained_image_width) / np.max([w, h])
    resized_image = np.array(
        Image.fromarray(image.astype('uint8')).resize(
            (int(ratio * h), int(ratio * w))))

    # apply normalization for trained dataset images
    resized_image = (resized_image / mean_subtraction_value) - 1.

    # pad array to square image to match training images
    pad_x = int(trained_image_width - resized_image.shape[0])
    pad_y = int(trained_image_width - resized_image.shape[1])
    resized_image = np.pad(resized_image, ((0, pad_x), (0, pad_y), (0, 0)),
                           mode='constant')

    # make prediction
    deeplab_model = Deeplabv3(classes=2,
                              activation='softmax',
                              model_path=args.model_path)
    res = deeplab_model.predict(np.expand_dims(resized_image, 0))
    labels = np.argmax(res.squeeze(), -1)

    # remove padding and resize back to original image
    if pad_x > 0:
        labels = labels[:-pad_x]
    if pad_y > 0:
        labels = labels[:, :-pad_y]
    labels = np.array(Image.fromarray(labels.astype('uint8')).resize((h, w)))

    img_result = np.ones_like(labels)
    img_result[labels == 1] = 0
    cv2.imwrite(args.output_path, img_result * 255)
Ejemplo n.º 7
0
def main():

    h, w = map(int, args.input_size.split(','))
    input_size = (h, w)

    if args.gpu >= 0:
        cudnn.enabled = True

    if args.v3:
        model = Deeplabv3(num_classes=args.num_classes)
    else:
        model = Deeplab(num_classes=args.num_classes)

    model.train()

    if args.gpu >= 0:
        if args.distributed:
            model = nn.DataParallel(model).cuda()
        else:
            model.cuda(args.gpu)
        cudnn.benchmark = True

    if args.model is not None:
        saved_state_dict = torch.load(args.model)
        model.load_state_dict(saved_state_dict)

    if not os.path.exists(args.snapshot_dir):
        os.makedirs(args.snapshot_dir)

    trainloader = data.DataLoader(ImageDataSet(args.data_dir,
                                               args.data_list,
                                               max_iters=args.num_steps *
                                               args.batch_size,
                                               crop_size=input_size,
                                               scale=args.random_scale,
                                               mirror=args.random_mirror,
                                               mean=IMG_MEAN),
                                  batch_size=args.batch_size,
                                  shuffle=True,
                                  num_workers=5,
                                  pin_memory=False)

    optimizer = optim.SGD([{
        'params': get_1x_lr_params_NOscale(model, True),
        'lr': args.lr
    }, {
        'params': get_10x_lr_params(model, True),
        'lr': 10 * args.lr
    }],
                          lr=args.lr,
                          momentum=args.momentum,
                          weight_decay=args.weight_decay)
    optimizer.zero_grad()

    interp = nn.Upsample(size=input_size, mode='bilinear')

    for i_iter, batch in enumerate(trainloader):
        images, labels, _, _ = batch
        images = images.cuda(async=True)
        labels = labels.cuda(async=True)
        images = Variable(images)

        optimizer.zero_grad()
        adjust_lr(optimizer, i_iter)
        pred = interp(model(images))
        loss = loss_calc(pred, labels, args.gpu)

        print("Step: {}, Loss: {}".format(i_iter, float(loss.data)))
        loss.backward()
        optimizer.step()

        if i_iter >= args.num_steps - 1:
            torch.save(
                model.state_dict(),
                osp.join(args.snapshot_dir,
                         'model_' + str(args.num_steps) + '.pth'))
            break

        if i_iter % args.save_steps == 0 and i_iter != 0:
            torch.save(
                model.state_dict(),
                osp.join(args.snapshot_dir, 'model_' + str(i_iter) + '.pth'))
Ejemplo n.º 8
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--model")
    parser.add_argument("--data-dir", type=str, default="./datasets")
    parser.add_argument("--data-list", type=str, default="./datasets/val.txt")
    parser.add_argument("--ignore-label", type=int, default=255)
    parser.add_argument("--num-classes", type=int, default=2)
    parser.add_argument("--v3", action="store_true")
    parser.add_argument("--distributed", action="store_true")
    parser.add_argument("--gpu",
                        type=int,
                        default=0,
                        help="choose gpu device.")
    args = parser.parse_args()

    if args.v3:
        model = Deeplabv3(num_classes=args.num_classes)
    else:
        model = Deeplab(num_classes=args.num_classes)

    if args.gpu >= 0:
        if args.distributed:
            model = nn.DataParallel(model).cuda()
        else:
            model.cuda(args.gpu)

    saved_state_dict = torch.load(args.model)
    model.load_state_dict(saved_state_dict)

    model.eval()

    testloader = data.DataLoader(ImageDataSet(args.data_dir,
                                              args.data_list,
                                              crop_size=(720, 1280),
                                              mean=IMG_MEAN,
                                              scale=False,
                                              mirror=False),
                                 batch_size=1,
                                 shuffle=False,
                                 pin_memory=False)

    interp = nn.Upsample(size=(720, 1280), mode='bilinear')
    data_list = []

    for index, batch in enumerate(testloader):
        if index % 100 == 0:
            print('%d processd' % (index))
        image, label, size, name = batch
        image = image.cuda()
        label = label
        size = size[0].numpy()

        start = time.time()
        output = model(Variable(image, volatile=True))
        output = interp(output).cpu().data[0].numpy()

        #output = output[:, :size[0], :size[1]]

        gt = np.asarray(label[0].numpy()[:size[0], :size[1]], dtype=np.int)

        output = output.transpose(1, 2, 0)
        output = np.asarray(np.argmax(output, axis=2), dtype=np.int)

        target = np.where(output > 0)
        corner = get_corner(target)
        print(corner)
        rt, lb = get_rt_and_lb(corner[1], corner[2], target)
        corner = (corner[0], rt, lb, corner[3])

        elapsed_time = time.time() - start
        print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

        show_circle(corner,
                    os.path.join(args.data_dir, "images/" + name[0] + ".jpg"),
                    name[0], index)

        show_all(gt, output, index)
        data_list.append([gt.flatten(), output.flatten()])

    get_iou(data_list, args.num_classes)
Ejemplo n.º 9
0
def main():
    print(Deeplabv3)
    deeplab_model = Deeplabv3(input_shape=(None, None, 3), classes=4)