DELF और TensorFlow हब का उपयोग करके छवियों का मिलान कैसे करें

TensorFlow.org पर देखें Google Colab में चलाएं गिटहब पर देखें नोटबुक डाउनलोड करें टीएफ हब मॉडल देखें

TensorFlow हब (TF-हब) शेयर मशीन सीखने विशेषज्ञता पुन: प्रयोज्य संसाधनों में पैक, विशेष रूप से पूर्व प्रशिक्षित मॉड्यूल के लिए एक मंच है।

इस colab में, हम एक मॉड्यूल है कि पैकेज का उपयोग करेगा मिट्टी का पात्र तंत्रिका नेटवर्क और छवियों प्रसंस्करण keypoints और उनके वर्णनकर्ता की पहचान करने के लिए तर्क। तंत्रिका नेटवर्क के वजन में वर्णित के रूप स्थलों की छवियों पर प्रशिक्षित किया गया इस पत्र

सेट अप

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

आंकड़ा

अगली सेल में, हम दो छवियों के यूआरएल निर्दिष्ट करते हैं जिन्हें हम मिलान और तुलना करने के लिए डीईएलएफ के साथ संसाधित करना चाहते हैं।

चित्र चुनें

छवियों को डाउनलोड, आकार बदलें, सहेजें और प्रदर्शित करें।

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

plt.subplot(1,2,1)
plt.imshow(image1)
plt.subplot(1,2,2)
plt.imshow(image2)
Downloading data from https://upload.wikimedia.org/wikipedia/commons/2/28/Bridge_of_Sighs%2C_Oxford.jpg
7020544/7013850 [==============================] - 0s 0us/step
7028736/7013850 [==============================] - 0s 0us/step
Downloading data from https://upload.wikimedia.org/wikipedia/commons/c/c3/The_Bridge_of_Sighs_and_Sheldonian_Theatre%2C_Oxford.jpg
14172160/14164194 [==============================] - 1s 0us/step
14180352/14164194 [==============================] - 1s 0us/step
<matplotlib.image.AxesImage at 0x7f333b5e2d10>

पीएनजी

डेटा पर DELF मॉड्यूल लागू करें

डीईएलएफ मॉड्यूल एक छवि को इनपुट के रूप में लेता है और वैक्टर के साथ उल्लेखनीय बिंदुओं का वर्णन करेगा। निम्नलिखित सेल में इस कोलाब के तर्क का मूल है।

delf = hub.load('https://tfhub.dev/google/delf/1').signatures['default']
def run_delf(image):
  np_image = np.array(image)
  float_image = tf.image.convert_image_dtype(np_image, tf.float32)

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

छवियों से मेल खाने के लिए स्थानों और विवरण वैक्टर का प्रयोग करें

इस पोस्ट-प्रोसेसिंग और विज़ुअलाइज़ेशन के लिए TensorFlow की आवश्यकता नहीं है

def match_images(image1, image2, result1, result2):
  distance_threshold = 0.8

  # Read features.
  num_features_1 = result1['locations'].shape[0]
  print("Loaded image 1's %d features" % num_features_1)

  num_features_2 = result2['locations'].shape[0]
  print("Loaded image 2's %d features" % num_features_2)

  # Find nearest-neighbor matches using a KD tree.
  d1_tree = cKDTree(result1['descriptors'])
  _, indices = d1_tree.query(
      result2['descriptors'],
      distance_upper_bound=distance_threshold)

  # Select feature locations for putative matches.
  locations_2_to_use = np.array([
      result2['locations'][i,]
      for i in range(num_features_2)
      if indices[i] != num_features_1
  ])
  locations_1_to_use = np.array([
      result1['locations'][indices[i],]
      for i in range(num_features_2)
      if indices[i] != num_features_1
  ])

  # Perform geometric verification using RANSAC.
  _, inliers = ransac(
      (locations_1_to_use, locations_2_to_use),
      AffineTransform,
      min_samples=3,
      residual_threshold=20,
      max_trials=1000)

  print('Found %d inliers' % sum(inliers))

  # Visualize correspondences.
  _, ax = plt.subplots()
  inlier_idxs = np.nonzero(inliers)[0]
  plot_matches(
      ax,
      image1,
      image2,
      locations_1_to_use,
      locations_2_to_use,
      np.column_stack((inlier_idxs, inlier_idxs)),
      matches_color='b')
  ax.axis('off')
  ax.set_title('DELF correspondences')
match_images(image1, image2, result1, result2)
Loaded image 1's 233 features
Loaded image 2's 262 features
Found 49 inliers

पीएनजी