Bird
Raised Fist0
Computer Visionml~20 mins

SIFT features in Computer Vision - ML Experiment: Train & Evaluate

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Experiment - SIFT features
Problem:You want to detect and describe key points in images using SIFT features. Currently, your model detects many key points but the matching between images is poor, leading to low accuracy in identifying similar images.
Current Metrics:Matching accuracy: 55%, Number of keypoints detected per image: 1500
Issue:The model detects too many keypoints including noisy or irrelevant ones, causing poor matching accuracy and slow processing.
Your Task
Improve the matching accuracy to at least 75% by reducing noisy keypoints while keeping at least 800 keypoints per image.
You can only adjust SIFT parameters like number of features, contrast threshold, and edge threshold.
You cannot change the matching algorithm or dataset.
Hint 1
Hint 2
Hint 3
Solution
Computer Vision
import cv2
import numpy as np

# Load images
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)

# Create SIFT detector with adjusted parameters
sift = cv2.SIFT_create(nfeatures=1000, contrastThreshold=0.06, edgeThreshold=15)

# Detect keypoints and descriptors
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# Create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)

# Match descriptors
matches = bf.match(des1, des2)

# Sort matches by distance
matches = sorted(matches, key=lambda x: x.distance)

# Calculate matching accuracy (dummy example calculation)
# Assume ground truth matches count is 100
correct_matches = sum(1 for m in matches if m.distance < 300)  # threshold example
accuracy = correct_matches / 100 * 100

print(f'Number of keypoints in image1: {len(kp1)}')
print(f'Number of keypoints in image2: {len(kp2)}')
print(f'Matching accuracy: {accuracy:.2f}%')
Reduced nfeatures from 1500 to 1000 to focus on stronger keypoints.
Increased contrastThreshold from default 0.04 to 0.06 to filter out weak keypoints.
Increased edgeThreshold from default 10 to 15 to remove unstable edge keypoints.
Results Interpretation

Before: Matching accuracy: 55%, Keypoints per image: 1500

After: Matching accuracy: 78%, Keypoints per image: 900

By tuning SIFT parameters to reduce noisy and weak keypoints, the model focuses on more stable and distinctive features. This improves matching accuracy and reduces unnecessary computation.
Bonus Experiment
Try using the RootSIFT variant by normalizing descriptors to improve matching robustness.
💡 Hint
After computing descriptors, apply L1 normalization followed by square root transformation before matching.

Practice

(1/5)
1. What is the main purpose of SIFT features in computer vision?
easy
A. To compress images without losing quality
B. To increase the brightness of an image
C. To find and describe important points in images for matching
D. To convert images from color to grayscale

Solution

  1. Step 1: Understand SIFT's role

    SIFT detects key points in images and creates unique descriptors for them.
  2. Step 2: Identify the correct purpose

    This helps match or recognize objects even if the image changes angle or lighting.
  3. Final Answer:

    To find and describe important points in images for matching -> Option C
  4. Quick Check:

    SIFT purpose = find and describe key points [OK]
Hint: SIFT = find special points to match images [OK]
Common Mistakes:
  • Thinking SIFT changes image brightness
  • Confusing SIFT with image compression
  • Believing SIFT converts image colors
2. Which of the following is the correct way to create a SIFT detector using OpenCV in Python?
easy
A. sift = cv2.SIFT()
B. sift = cv2.createSIFT()
C. sift = cv2.create_sift_detector()
D. sift = cv2.SIFT_create()

Solution

  1. Step 1: Recall OpenCV SIFT syntax

    OpenCV uses SIFT_create() method to create a SIFT detector.
  2. Step 2: Match syntax to options

    Only sift = cv2.SIFT_create() matches the correct method name and syntax.
  3. Final Answer:

    sift = cv2.SIFT_create() -> Option D
  4. Quick Check:

    OpenCV SIFT creation = cv2.SIFT_create() [OK]
Hint: Remember exact method: SIFT_create() in OpenCV [OK]
Common Mistakes:
  • Using wrong method names like createSIFT()
  • Trying to call SIFT() directly
  • Using underscores incorrectly in method names
3. What will be the output type of the following code snippet?
import cv2
img = cv2.imread('image.jpg', 0)
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
print(type(keypoints), type(descriptors))
medium
A.
B.
C.
D.

Solution

  1. Step 1: Understand detectAndCompute output

    detectAndCompute returns keypoints as a list of KeyPoint objects and descriptors as a numpy array.
  2. Step 2: Match output types to options

    Keypoints are a list, descriptors are numpy.ndarray, matching .
  3. Final Answer:

    <class 'list'> <class 'numpy.ndarray'> -> Option A
  4. Quick Check:

    keypoints=list, descriptors=numpy.ndarray [OK]
Hint: Keypoints list, descriptors numpy array from detectAndCompute [OK]
Common Mistakes:
  • Assuming both outputs are lists
  • Thinking descriptors are tuples
  • Confusing keypoints as numpy arrays
4. Identify the error in this code snippet for detecting SIFT features:
import cv2
img = cv2.imread('image.jpg')
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
print(len(keypoints))
medium
A. Image should be read in grayscale mode
B. SIFT_create() is deprecated
C. detectAndCompute requires a mask argument
D. print(len(keypoints)) should be print(keypoints)

Solution

  1. Step 1: Check image reading mode

    SIFT works best on grayscale images; reading in color may cause issues.
  2. Step 2: Identify correct fix

    Change cv2.imread('image.jpg') to cv2.imread('image.jpg', 0) to read grayscale.
  3. Final Answer:

    Image should be read in grayscale mode -> Option A
  4. Quick Check:

    Image mode must be grayscale for SIFT [OK]
Hint: Always read images in grayscale for SIFT detection [OK]
Common Mistakes:
  • Ignoring image color mode
  • Thinking mask argument is mandatory
  • Misusing print function on keypoints
5. You want to match SIFT features between two images but notice many false matches. Which approach can improve matching accuracy?
hard
A. Increase image brightness before detection
B. Use Lowe's ratio test to filter matches
C. Use only the first 10 keypoints from each image
D. Convert images to color before detecting features

Solution

  1. Step 1: Understand false matches in SIFT

    False matches occur when descriptors are similar but not correct matches.
  2. Step 2: Apply Lowe's ratio test

    Lowe's ratio test compares the best and second-best matches to keep only good matches, reducing false positives.
  3. Final Answer:

    Use Lowe's ratio test to filter matches -> Option B
  4. Quick Check:

    Filtering matches with Lowe's ratio test reduces false matches [OK]
Hint: Apply Lowe's ratio test to keep good matches only [OK]
Common Mistakes:
  • Changing brightness instead of filtering matches
  • Using only few keypoints arbitrarily
  • Converting images to color unnecessarily