//  [python]
def render_lm2d_circle_image(image, lm2d_batch_xy, h, w, color=2, radius=1, light=1.0):
    """
    :param image: (0, 1)
    :param lm2d_batch_xy:
    :param h:
    :param w:
    :param color:
    :param radius:
    :param light:
    :return:
    """
    # preprocess
    """
    row correspond to y
    column correspond to x
    (row, column) = (y, x)
    """
    x = lm2d_batch_xy[:, :, 0]
    y = lm2d_batch_xy[:, :, 1]
    x = tf.clip_by_value(x, 0, w-1)
    y = tf.clip_by_value(y, 0, h-1)
    lm2d_batch = tf.stack([y, x], axis=-1)

    """
    circle lm    
    """
    lm2d_batch = lm_expand_circle(lm2d_batch, h, w)

    #
    visual_lm2d = []
    for b_it in range(lm2d_batch.shape[0]):
        lm2d = lm2d_batch[b_it]
        lm2d = tf.cast(lm2d, dtype=tf.int64)
        if color == 1:
            r = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.linspace(light, 1.0, lm2d.shape[0]),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        else:
            r = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.zeros(shape=[lm2d.shape[0]], dtype=tf.float32),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        if color == 2:
            g = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.linspace(light, 1.0, lm2d.shape[0]),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        else:
            g = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.zeros(shape=[lm2d.shape[0]], dtype=tf.float32),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        if color == 3:
            b = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.linspace(light, 1.0, lm2d.shape[0]),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        else:
            b = tf.sparse_tensor_to_dense(
                tf.SparseTensor(indices=lm2d, values=tf.zeros(shape=[lm2d.shape[0]], dtype=tf.float32),
                                dense_shape=[h, w]),
                validate_indices=False
            )
        rgb = tf.stack([r, g, b], axis=-1)
        visual_lm2d.append(rgb)
    visual_lm2d = tf.stack(visual_lm2d)

    """
    assign image
    """
    # Mask
    mask_lm2d = []
    for b_it in range(lm2d_batch.shape[0]):
        lm2d = lm2d_batch[b_it]
        lm2d = tf.cast(lm2d, dtype=tf.int64)
        r = tf.sparse_tensor_to_dense(
            tf.SparseTensor(indices=lm2d, values=tf.ones(shape=[lm2d.shape[0]], dtype=tf.float32),
                            dense_shape=[h, w]),
            validate_indices=False
        )
        g = tf.sparse_tensor_to_dense(
            tf.SparseTensor(indices=lm2d, values=tf.ones(shape=[lm2d.shape[0]], dtype=tf.float32),
                            dense_shape=[h, w]),
            validate_indices=False
        )
        b = tf.sparse_tensor_to_dense(
            tf.SparseTensor(indices=lm2d, values=tf.ones(shape=[lm2d.shape[0]], dtype=tf.float32),
                            dense_shape=[h, w]),
            validate_indices=False
        )
        rgb = tf.stack([r, g, b], axis=-1)
        mask_lm2d.append(rgb)
    mask_lm2d = tf.stack(mask_lm2d)
    mask_lm2d = 1.0-mask_lm2d

    visual_image = image
    visual_image = visual_image * mask_lm2d

    visual_image = visual_image + visual_lm2d
    return visual_image