Avec le développement continu du domaine de la vision par ordinateur, les recherches sur la reconnaissance d'objets deviennent de plus en plus approfondies. Parmi eux, Bag of Visual Words (BoW) est une méthode de reconnaissance d'objets couramment utilisée. Cet article présentera les principes, avantages et inconvénients de la méthode du sac de mots visuels, et donnera des exemples. La méthode du sac de mots visuels est une méthode de reconnaissance d'objets basée sur les caractéristiques locales de l'image. Il divise l'image en plusieurs petites régions et extrait des descripteurs de caractéristiques pour chaque région. Ensuite, ces descripteurs de caractéristiques sont regroupés dans un sac visuel de mots grâce à un algorithme de clustering, où chaque sac de mots représente une caractéristique locale spécifique. Au stade de la reconnaissance d'objets, le descripteur de caractéristiques de l'image d'entrée est combiné avec le mot visuel
Le sac de mots visuels est une méthode classique de classification d'images. Il fonctionne en extrayant les caractéristiques locales d'une image et en utilisant un algorithme de clustering pour regrouper ces caractéristiques dans un ensemble de mots visuels. Ensuite, en comptant la fréquence de chaque mot visuel apparaissant dans l’image, l’image est représentée comme un vecteur de longueur fixe, c’est-à-dire le sac de représentation des mots visuels. Enfin, le sac de mots visuels est introduit dans le classificateur pour classification. Cette méthode est largement utilisée dans les tâches de reconnaissance d’images car elle est capable de capturer les caractéristiques importantes de l’image et de les représenter sous une forme vectorielle pouvant être utilisée par le classificateur.
Avantages :
(1) La méthode du sac de mots visuel est simple et facile à mettre en œuvre
(2) Elle peut extraire les caractéristiques locales de l'image, pour la rotation des objets, les transformations telles que la mise à l'échelle ont un certain degré de robustesse ;
(3) a de meilleurs résultats de classification pour des ensembles de données plus petits ;
Inconvénients :
(1) La méthode du sac de mots visuels ne prend pas en compte la relation spatiale entre les caractéristiques et l'effet de classification est médiocre pour les changements de posture des objets, l'occlusion partielle, etc. ;
(2) Le nombre de clusters doit être défini manuellement pour différents ensembles de données, le nombre de clusters doit être réinitialisé, ce qui entraîne une mauvaise polyvalence ;
(3) ne peut pas profiter de l'excellente représentation des fonctionnalités dans. l'apprentissage profond, donc l'effet de classification est limité.
3. Exemples
Ce qui suit prend l'ensemble de données MNIST comme exemple pour illustrer l'application du sac de mots visuels.
L'ensemble de données MNIST est un ensemble de données de classification de chiffres manuscrit, contenant 60 000 échantillons d'ensembles d'apprentissage et 10 000 échantillons d'ensembles de test. Chaque échantillon est une image en niveaux de gris de 28 x 28 représentant un chiffre manuscrit. Le code est implémenté comme suit :
import numpy as np import cv2 from sklearn.cluster import KMeans from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 读取MNIST数据集 train_images = np.load('mnist_train_images.npy') train_labels = np.load('mnist_train_labels.npy') test_images = np.load('mnist_test_images.npy') test_labels = np.load('mnist_test_labels.npy') # 特征提取 features = [] sift = cv2.xfeatures2d.SIFT_create() for image in train_images: keypoints, descriptors = sift.detectAndCompute(image, None) features.append(descriptors) features = np.concatenate(features, axis=0) # 聚类 n_clusters = 100 kmeans = KMeans(n_clusters=n_clusters) kmeans.fit(features) # 计算视觉词袋 train_bow = [] for image in train_images: keypoints, descriptors = sift.detectAndCompute(image, None) hist = np.zeros(n_clusters) labels = kmeans.predict(descriptors) for label in labels: hist[label] += 1 train_bow.append(hist) train_bow = np.array(train_bow) test_bow = [] for image in test_images: keypoints, descriptors = sift.detectAndCompute(image, None) hist = np.zeros(n_clusters) labels = kmeans.predict(descriptors) for label in labels: hist[label] += 1 test_bow.append(hist) test_bow = np.array(test_bow) # 分类 knn = KNeighborsClassifier() knn.fit(train_bow, train_labels) pred_labels = knn.predict(test_bow) # 计算准确率 acc = accuracy_score(test_labels, pred_labels) print('Accuracy:', acc)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!