컴퓨터 비전 분야의 지속적인 발전과 함께 사물 인식에 대한 사람들의 연구도 점점 더 심화되고 있습니다. 그 중 흔히 사용되는 객체 인식 방법인 BoW(Bag of Visual Words)가 있다. 본 글에서는 Bag of Visual Words 방식의 원리와 장점, 단점을 소개하고 예시를 제시하겠습니다. 시각적 단어백 방법은 이미지의 국소적 특징을 기반으로 하는 객체 인식 방법입니다. 이미지를 여러 개의 작은 영역으로 나누고 각 영역에 대한 특징 설명자를 추출합니다. 그런 다음 이러한 기능 설명자는 클러스터링 알고리즘을 통해 시각적 단어 모음으로 그룹화됩니다. 여기서 각 단어 모음은 특정 로컬 기능을 나타냅니다. 객체 인식 단계에서 입력 이미지의 특징 기술자는 시각적 단어와 결합됩니다
시각적 단어 가방은 고전적인 이미지 분류 방법입니다. 이는 이미지에서 로컬 특징을 추출하고 클러스터링 알고리즘을 사용하여 이러한 특징을 일련의 시각적 단어로 클러스터링하는 방식으로 작동합니다. 그런 다음 이미지에 나타나는 각 시각적 단어의 빈도를 계산하여 이미지를 고정 길이 벡터, 즉 시각적 단어 표현의 가방으로 표현합니다. 마지막으로, 분류를 위해 시각적 단어 봉지가 분류기에 입력됩니다. 이 방법은 이미지의 중요한 특징을 캡처하고 분류기가 사용할 수 있는 벡터 형식으로 표현할 수 있기 때문에 이미지 인식 작업에 널리 사용됩니다.
장점:
(1) 시각적 워드백 방식은 구현이 간단하고 쉽습니다.
(2) 이미지의 로컬 특징을 추출할 수 있습니다. 객체 회전의 경우 크기 조정과 같은 변환은 어느 정도 견고성을 갖습니다.
(3)은 더 작은 데이터 세트에 대해 더 나은 분류 결과를 제공합니다.
단점:
(1) 시각적 단어 가방 방법은 특징 간의 공간 관계를 고려하지 않으며 객체의 자세 변화, 부분 폐색 등에 대한 분류 효과가 좋지 않습니다.
(2) 클러스터 수는 수동으로 설정해야 합니다. 다른 데이터 세트의 경우 클러스터 수를 재설정해야 하므로 다양성이 떨어집니다.
(3)의 우수한 기능 표현을 활용할 수 없습니다. 딥러닝이므로 분류 효과가 제한됩니다.
3. 예제
다음은 Bag of Visual Words의 적용을 설명하기 위해 MNIST 데이터 세트를 예로 들었습니다.
MNIST 데이터 세트는 60,000개의 훈련 세트 샘플과 10,000개의 테스트 세트 샘플을 포함하는 손으로 쓴 숫자 분류 데이터 세트입니다. 각 샘플은 손으로 쓴 숫자를 나타내는 28x28 회색조 이미지입니다. 코드는 다음과 같이 구현됩니다:
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)
위 내용은 사물 인식을 위한 시각적 단어 가방의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!