Sift algorithm and classify images——Learning notes 2

Sift algorithm

Sift,Scale-Invariant Feature Taransform,is established in the following steps:
1 、Image scale space
In order for to have a unified cognition to an objects at different scales, it is necessary to consider the characteristics of images at different scales. That means that we need to get the scale space of a image. Thus, We can use Gaussian Blur to solve this. And the larger the value of σ is, the fuzzier the image can be obtained.
在这里插入图片描述
在这里插入图片描述

2、Multiresolution pyramid
By applying Gaussian Blur to images of different sizes, we can obtain image scale space with different resolutions.
在这里插入图片描述

3、Difference of Gaussians(DoG operator)
By the following formula, we can obtain the differences between two adjacent scale spaces.
在这里插入图片描述
Pixel (x, y) will be compared with the field around it and the field of adjacent scale space to obtain the extreme value. For example, in the following image, pixels are compared with 26 values around and above it.
在这里插入图片描述

4、Accurate positioning of key points
Through curve fitting of the DoG function in the scale space, the extreme value points are calculated, so as to accurately locate the key points.
5、
By determining the main direction of this key point and calculating its gradient, we can get the feature vector of the key point. And then use all the gradients in the histogram statistics field, just like the Hog feature, we can complete the extraction of Sift features.

Opencv Sift function

The opencv library provides us with functions to calculate sift features, and it returns the key points of the input image.

sift = cv2.xfeatures2d.SIFT_create()

For example:

import cv2
import numpy as np

img = cv2.imread('cat.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)
img = cv2.drawKeypoints(gray, kp, img)
cv2.imshow('drawKeypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
kp, des = sift.compute(gray, kp)
print(des.shape)
print(des[0])

Result:
在这里插入图片描述

(1675,)
(1675, 128)
[  3.   0.   0.   2.  16.  47. 126.  85.  98.   2.   2.   1.   0.   1.
  76. 126.  96.  17.   2.   0.   2.   8.  14.  37.  11.   3.   0.   2.
  37.  39.  54.  13.   0.   0.   0.   5.  16.  27. 126.  67.  13.  11.
  16.  60.  69.  20.  69.  33. 126.  67.  19.  14.   3.   0.   1.  23.
  42.  12.   0.   3.  38.  34.  18.  16.   0.   0.   0.  51.  59.   5.
  22.  12.  26.  39.  24. 126. 126.   2.   1.   1. 126. 126.  13.  14.
   3.   0.   0.  27.  45.  30.   6.   6.   3.   9.  12.  19.   0.   0.
   0.  15.  12.   0.   0.   0.   9.  38.  21.  75.  26.   0.   0.   0.
 126. 126.  10.   5.   0.   0.   0.   7.  68.  44.   5.   2.   0.   0.
   5.  22.]

From this function, drawKeypoints, we can see the position of the key points on the image and the dimension of the features is 128.

Used SVM to classify images based on sift features

step 1: compute sift features.

# Compute sift features
def SiftFeature(img):
    sift = cv2.xfeatures2d.SURF_create()
    keypoints, features = sift.detectAndCompute(img, None)
    return features

step 2:use kmeans to classify features

# Use kmeans to classify features
def learnVocabulary(features):
    species = 2
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.1)
    flags = cv2.KMEANS_RANDOM_CENTERS
    compactness, labels, centers = cv2.kmeans(features, species, None,criteria, 20, flags)
    return centers

step 3: computes the eigenvectors of the class

# Compute features in all of classes
def calcFeatVec(features, centers):
    featVec = np.zeros((1, 2))
    for i in range(0, features.shape[0]):
        fi = features[i]
        diffMat = np.tile(fi, (2, 1)) - centers
        sqSum = (diffMat**2).sum(axis=1)
        dist = sqSum**0.5
        sortedIndices = dist.argsort()
        idx = sortedIndices[0]
        featVec[0][idx] += 1
    return featVec

step 4: create the training class and save its feature vectors

# Create the training class and save its feature vectors
def build_center(path):
    images = [plt.imread(path) for path in glob.glob('%s/*.jpg' % path)]
    features = np.float32([]).reshape(0, 64)
    img_f = list(map(SiftFeature, images))
    for folder in img_f:
        if folder is None:
            continue
        features = np.append(features, folder, axis=0)
    centers = learnVocabulary(features)
    filename = "f:/picture/svm/svm_centers.npy"
    np.save(filename, centers)
def cal_vec(train_path):
    centers = np.load("f:/picture/svm/svm_centers.npy")
    data_vec = np.float32([]).reshape(0, 2)
    labels = np.float32([])
    cate = [plt.imread(train_path) for path in glob.glob('%s/*.jpg' % train_path)]
    i = 0
    for idx, img in enumerate(cate):
        img_f = SiftFeature(img)
        if img_f is None:
            i += 1
            continue
        img_vec = calcFeatVec(img_f, centers)
        data_vec = np.append(data_vec,img_vec,axis=0)
        labels = np.append(labels, idx - i)
    print('data_vec:',data_vec.shape)
    print('image features vector done!')
    return data_vec,labels

step 5: train and test

def SVM_Train(data_vec,labels):
    clf = svm.SVC(decision_function_shape='ovo')
    clf.fit(data_vec,labels)
    joblib.dump(clf, "f:/picture/svm/svm_model.m")
def SVM_Test(test_path):
    clf = joblib.load("f:/picture/svm/svm_model.m")
    centers = np.load("f:/picture/svm/svm_centers.npy")
    data_vec,labels = cal_vec(test_path)
    res = clf.predict(data_vec)
    num_test = data_vec.shape[0]
    acc = 0
    for i in range(num_test):
        if labels[i] == res[i]:
            acc = acc+1
    return acc/num_test,res

After running, I found the classification results are not excellent.Thus, there are still some improvements to do.

Reference:

1、https://www.cnblogs.com/gzyc/p/11221963.html
2、https://blog.csdn.net/qq_31347869/article/details/88071930
3、https://blog.csdn.net/weixin_42486554/article/details/103732613

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值