How to match images using DELF and TensorFlow Hub

View on Run in Google Colab View on GitHub Download notebook See TF Hub model

TensorFlow Hub (TF-Hub) is a platform to share machine learning expertise packaged in reusable resources, notably pre-trained modules.

In this colab, we will use a module that packages the DELF neural network and logic for processing images to identify keypoints and their descriptors. The weights of the neural network were trained on images of landmarks as described in this paper.


pip install scikit-image
from absl import logging

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image, ImageOps
from scipy.spatial import cKDTree
from skimage.feature import plot_matches
from skimage.measure import ransac
from skimage.transform import AffineTransform
from six import BytesIO

import tensorflow as tf

import tensorflow_hub as hub
from six.moves.urllib.request import urlopen

The data

In the next cell, we specify the URLs of two images we would like to process with DELF in order to match and compare them.

Choose images

Download, resize, save and display the images.

def download_and_resize(name, url, new_width=256, new_height=256):
  path = tf.keras.utils.get_file(url.split('/')[-1], url)
  image =
  image =, (new_width, new_height), Image.LANCZOS)
  return image
image1 = download_and_resize('image_1.jpg', IMAGE_1_URL)
image2 = download_and_resize('image_2.jpg', IMAGE_2_URL)

Downloading data from
7013850/7013850 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Downloading data from
14164194/14164194 ━━━━━━━━━━━━━━━━━━━━ 1s 0us/step
<matplotlib.image.AxesImage at 0x7f496c454c40>


Apply the DELF module to the data

The DELF module takes an image as input and will describe noteworthy points with vectors. The following cell contains the core of this colab's logic.

delf = hub.load('').signatures['default']
2024-03-09 14:59:22.756986: E external/local_xla/xla/stream_executor/cuda/] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
def run_delf(image):
  np_image = np.array(image)
  float_image = tf.image.convert_image_dtype(np_image, tf.float32)

  return delf(
      image_scales=tf.constant([0.25, 0.3536, 0.5, 0.7071, 1.0, 1.4142, 2.0]),
result1 = run_delf(image1)
result2 = run_delf(image2)

Use the locations and description vectors to match the images

TensorFlow is not needed for this post-processing and visualization

match_images(image1, image2, result1, result2)
Loaded image 1's 233 features
Loaded image 2's 262 features
Found 50 inliers