Функция изменения размера HOG для классификатора Scikit-Learn

Я пытаюсь выполнить этот код, который обрабатывает 70 изображений и извлекает функции гистограммы ориентированных градиентов (HOG). Они передаются классификатору (Scikit-Learn).

Однако возникает ошибка:

hog_image = hog_image_rescaled.resize((200, 200), Image.ANTIALIAS)
TypeError: an integer is required

Не понимаю почему, ведь при попытке с одиночным изображением работает корректно.

#Hog Feature

from skimage.feature import hog
from skimage import data, color, exposure
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import os
import glob
import numpy as np
from numpy import array

listagrigie = []

path = 'img/'
for infile in glob.glob( os.path.join(path, '*.jpg') ):
    print("current file is: " + infile )
    colorato = Image.open(infile)
    greyscale = colorato.convert('1')

    #hog feature
    fd, hog_image = hog(greyscale, orientations=8, pixels_per_cell=(16, 16),
                    cells_per_block=(1, 1), visualise=True)

    plt.figure(figsize=(8, 4))
    print(type(fd))
    plt.subplot(121).set_axis_off()
    plt.imshow(grigiscala, cmap=plt.cm.gray)
    plt.title('Input image')

    # Rescale histogram for better display
    hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02))
    print("hog 1 immagine shape")
    print(hog_image_rescaled.shape)

    hog_image = hog_image_rescaled.resize((200, 200), Image.ANTIALIAS)    
    listagrigie.append(hog_image)
    target.append(i)

print("ARRAY of gray matrices")

print(len(listagrigie))
grigiume = np.dstack(listagrigie)
print(grigiume.shape)
grigiume = np.rollaxis(grigiume, -1)
print(grigiume.shape)

from sklearn import svm, metrics

n_samples = len(listagrigie)
data = grigiume.reshape((n_samples, -1))
# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples / 2], target[:n_samples / 2])

# Now predict the value of the digit on the second half:
expected = target[n_samples / 2:]
predicted = classifier.predict(data[n_samples / 2:])
print("expected")

print("predicted")

person postgres    schedule 05.01.2013    source источник


Ответы (1)


Вы должны масштабировать исходное изображение (названное colorato в вашем примере) до (200, 200), затем извлечь функции HOG, а затем передать список fd векторов в свои модели машинного обучения. hog_image предназначены только для визуализации дескрипторов функций в удобной для пользователя форме. Фактические функции возвращаются в переменной fd.

person ogrisel    schedule 05.01.2013
comment
возможно, что список fd состоит из: [ 0. 0. 0. ..., 0. 0. 0.] ? результаты измерения, очевидно, представляют собой последовательность 0 - person postgres; 06.01.2013
comment
Я не уверен, у вас есть однородно окрашенные области на вашем изображении? Вы пытались проверить значения numpy.max(fd) и numpy.mean(fd)? - person ogrisel; 06.01.2013
comment
хорошо, дайте мне это: макс: 0,999636109832 и носитель 0,104345580011, поэтому я думаю, что мне нужно что-то изменить, потому что результаты измерения точности, отзыва, f1-оценки и поддержки равны 0, а также среднее / общее, когда я печатаю это: print Classification отчет для классификатора %s:\n%s\n % ( классификатор, metrics.classification_report(ожидаемый, прогнозируемый)) - person postgres; 06.01.2013
comment
Вы пытались найти оптимальное значение для C и gamma? Пробовали ли вы более простую модель, такую ​​как LinearSVC? - person ogrisel; 06.01.2013
comment
Я пытался изменить значение гаммы, ядро ​​(линейное и rbf), но результаты те же. Я пытался запустить этот код (scikit-learn.org/stable/modules/svm.html) и покажите мне 4 изображения с красным фоном и только 1 точку. Я знаю только, что что-то идет не так. Я думаю, что svm не подходит для функции свиньи (у меня есть вектор функций длиной 40 000), я пробовал K-means, и когда я печатаю это. напечатайте k_means.labels_[::10] у меня есть этот результат: [2 2 2 0 0 0 0 2]. Я не знаю, что это значит. - person postgres; 08.01.2013
comment
Я думаю, что все это неправильно, мне нужен алгоритм, который, когда я даю образец изображения, распознает среди 150 изображений и более наиболее похожие изображения внутри этой группы, и я думал, что hog + svm был правильным. - person postgres; 08.01.2013
comment
Если вам просто нужно самое близкое изображение в пространстве признаков HOG, вы можете вычислить попарные евклидовы расстояния и взять наименьшее. Для этого вам не нужно машинное обучение. Кроме того, k-means — это не контролируемый алгоритм классификации, а неконтролируемый алгоритм кластеризации: он находит группы похожих вещей без меток. - person ogrisel; 09.01.2013
comment
да, но я подумал, что поскольку мое изображение - это не кошки, собаки, люди, а общие знаки, может быть полезна неконтролируемая классификация, которая находит группы знаков. - person postgres; 09.01.2013
comment
затем профессор расскажет мне о поиске экстрактора признаков для этих знаков и использовании обучающего набора для обучения и нового набора изображений для проверки машины. Итак, прежде всего, я думаю о контурных функциях, таких как canny, sobel и last hog, чтобы создать вектор признаков для каждого изображения и svm для обучения, но я новичок в этой области, и я понятия не имею, что ожидать от меня в результате результатов svm, я думал, что в учебных пособиях scikit я мог найти, как использовать svm и метрику, которая печатает мне процент наиболее похожих изображений и модифицирует параметры svm для улучшения результатов! - person postgres; 09.01.2013
comment
так ты уверен, что мне нужны только попарные евклидовы расстояния и выбрать наименьшее для моей цели? я подумал, что это надежность по сравнению с двумя изображениями с разным масштабом, если распознать изображение, которое было повернуто, если штрих тонкий или нет ... и что-то в этом роде - person postgres; 09.01.2013
comment
ах, извините, да, на моих фотографиях есть цветные области в форме! белая зона! Так правильно ли иметь так много нулей? - person postgres; 09.01.2013