Exemple #1
0
def get_data_occ(im1, im2, flow_f, flow_b, name, cbn, occt, vmap_f, vmap_b):
    outsz = flow_f.get_shape()
    outsz = tf.stack([outsz[1], outsz[2]])
    vmap_f = tf.image.resize_images(
        vmap_f, size=outsz, method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
    vmap_b = tf.image.resize_images(
        vmap_b, size=outsz, method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
    im1_ = backwarp.backwarper(im2, flow_f, outsz, name=name + 'forward')
    im2_ = backwarp.backwarper(im1, flow_b, outsz, name=name + 'backward')
    occ_f, occ_b = occlusion(flow_f, flow_b)

    # get the robust difference
    loss_f = occ_weighted_diff(im1,
                               im1_,
                               occ_f,
                               vmap=vmap_f,
                               cbn=cbn,
                               occt=occt)
    loss_b = occ_weighted_diff(im2,
                               im2_,
                               occ_b,
                               vmap=vmap_b,
                               cbn=cbn,
                               occt=occt)
    loss = tf.add(loss_f, loss_b)
    return loss
def random_rotate_scale_translate_no_edge(img1s,
                                          img2s,
                                          flows,
                                          imsize,
                                          name='Rand_R_S_T',
                                          RMAX=17.0,
                                          SMIN=0.9,
                                          SMAX=2.0,
                                          TMAX=0.2,
                                          RMAX0=3.0,
                                          SMIN0=0.9,
                                          SMAX0=1.1,
                                          TMAX0=0.03):
    """
    flows : float, defined on img1, shape: [B, H, W, 2]
    imsize : [H, W], default in form of numpy array
    """
    with tf.variable_scope(name):
        batchsize = tf.shape(img1s)[0]
        W = imsize[1]
        A, A_ = rand_affine(minR=-RMAX,
                            maxR=RMAX,
                            minS=SMIN,
                            maxS=SMAX,
                            minT=-TMAX * W,
                            maxT=TMAX * W)
        A0, A0_ = rand_affine(minR=-RMAX0,
                              maxR=RMAX0,
                              minS=SMIN0,
                              maxS=SMAX0,
                              minT=-TMAX0 * W,
                              maxT=TMAX0 * W)

        ff1 = aff_flow(A_, imsize, batchsize)
        img1s_ = backwarp.backwarper(img1s, ff1, imsize, name='img1s_')
        #edge1s_= backwarp.backwarper( edge1s,ff1, imsize, name='edge1s_')
        valid_map = tf.ones(
            shape=tf.stack([batchsize, imsize[0], imsize[1], 1]))
        valid_map = backwarp.backwarper(valid_map,
                                        ff1,
                                        imsize,
                                        name='valid_map')
        gx = backwarp.backwarper(flows, ff1, imsize, name='warped_flow')
        flows_ = flow_transform(A0, A, gx, imsize)

        A_A0_ = tf.matmul(A_, A0_)
        ff2 = aff_flow(A_A0_, imsize, batchsize)
        img2s_ = backwarp.backwarper(img2s, ff2, imsize, name='img2s_')
        #edge2s_= backwarp.backwarper( edge2s,ff2, imsize, name='edge2s_')
        valid_map_b = tf.ones(
            shape=tf.stack([batchsize, imsize[0], imsize[1], 1]))
        valid_map_b = backwarp.backwarper(valid_map_b,
                                          ff2,
                                          imsize,
                                          name='valid_map_b')

        return img1s_, img2s_, flows_, valid_map, valid_map_b
def get_data_term(im1,
                  im2,
                  flow,
                  vmap,
                  name='data_term',
                  epsilon=0.001,
                  cbn=0.5):
    epsilon = tf.convert_to_tensor(epsilon)
    # get flow's size and resize im1, im2
    outsz = flow.get_shape()
    outsz = tf.stack([outsz[1], outsz[2]])
    #im1  = tf.image.resize_images( im1, size=outsz )
    #im2  = tf.image.resize_images( im2, size=outsz )
    vmap = tf.image.resize_images(vmap, size=outsz)
    im1_ = backwarp.backwarper(im2, flow, outsz, name=name)

    # get the robust difference
    diff = tf.subtract(im1, im1_)  # [B, H, W, 3]
    diff = tf.add(tf.square(diff), tf.square(epsilon))
    diff = tf.pow(diff, tf.convert_to_tensor(cbn), name='chamboneir')
    diff = tf.reduce_sum(diff, axis=3, keep_dims=True)  # [B, H, W, 1]
    # vmap is also                                       [B, H, W, 1]
    diff = tf.multiply(vmap, diff)
    loss = tf.reduce_sum(diff)
    return loss
Exemple #4
0
def occlusion(flow_f, flow_b):
    outsz = flow_f.get_shape()
    outsz = tf.stack([outsz[1], outsz[2]])
    flow_f_ = backwarp.backwarper(flow_b, flow_f, outsz, name='flow_b_to_f')
    flow_b_ = backwarp.backwarper(flow_f, flow_b, outsz, name='flow_f_to_b')
    mag_sq_f = length_sq(flow_f) + length_sq(flow_f_)
    mag_sq_b = length_sq(flow_b) + length_sq(flow_b_)
    flow_diff_f = flow_f + flow_f_
    flow_diff_b = flow_b + flow_b_
    occ_thresh_f = tf.add(tf.multiply(tf.constant(0.01 * 1), mag_sq_f),
                          tf.constant(0.5 * 10))
    occ_thresh_b = tf.add(tf.multiply(tf.constant(0.01 * 1), mag_sq_b),
                          tf.constant(0.5 * 10))
    occ_f = tf.cast(length_sq(flow_diff_f) > occ_thresh_f, tf.float32)
    occ_b = tf.cast(length_sq(flow_diff_b) > occ_thresh_b, tf.float32)
    return occ_f, occ_b  # occ=1, covisible=0
def sup_backwarp_target_image(flow, imH, imW, img2, ratio, name):
    with tf.variable_scope(name) as scope:
        flow_ = tf.multiply(flow, tf.constant(20.0))
        flow_ = tf.image.resize_images(flow_,
                                       size=[imH, imW],
                                       align_corners=True)
        flow_ = tf.multiply(flow_, tf.convert_to_tensor(ratio))
        img2_wp = backwarp.backwarper(img2,
                                      flow_,
                                      imsize=[imH, imW],
                                      name=name)
        return img2_wp
def backwarp_target_image(flow, imH, imW, img2, name):
    with tf.variable_scope(name) as scope:
        flow_ = tf.image.resize_images(flow,
                                       size=[imH, imW],
                                       align_corners=True)
        ratio = tf.cast(imH / tf.shape(flow)[1], 'float32')
        flow_ = tf.multiply(ratio, flow_)
        img2_wp = backwarp.backwarper(img2,
                                      flow_,
                                      imsize=[imH, imW],
                                      name=name)
        return img2_wp