SVM прогнозирование изображений Python

позвольте мне привести более подробный пример:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __name__ == '__main__':
    test_draw()

1
задан MOA 28 February 2019 в 10:39
поделиться

1 ответ

Есть две основные проблемы с вашим кодом.

Во-первых, вам не нужно классифицировать весь набор тестов в каждом взаимодействии цикла for. Предсказания метки класса для одного изображения за раз будет достаточно:

    prediction = svm.clf.predict([testDataGlobal[index, :]])

Обратите внимание, что testDataGlobal[index, :] необходимо заключить в квадратные скобки [ ], так как метод predict() ожидает двухмерную переменную в виде массива.

Во-вторых, и самое главное, допустим, что функция glob выдает список из трех файлов изображений, а именно imgA.jpg, imgB.jpg и imgC.jpg, и обозначим их соответствующие векторы признаков как featsA, featsB и featsC. Для правильной работы вашего кода важно, чтобы testDataGlobal был организован следующим образом:

[featsA, 
 featsB, 
 featsC]

Если векторы элементов расположены в другом порядке, вы, вероятно, получите неправильные результаты.

Вы можете правильно пометить изображения с помощью следующего фрагмента (не тестировался):

test_images = glob.glob("dataset/test/*.jpg")

for filename in test_images:
    img = cv2.imread(filename)
    img = cv2.resize(img, fixed_size)
    feature_vector = your_feature_extraction_method(img)
    prediction = svm.clf.predict([feature_vector])
    cv2.putText(img, prediction[0], (20, 30), 
                cv2.FONT_HERSHEY_TRIPLEX, .7 , (0, 255, 255), 2)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.show()    

где your_feature_extraction_method() обозначает функцию, которая использует изображение и возвращает его вектор признаков (в виде массива 1D). . [1 125]

Примечание : не забудьте заключить feature_vector в квадратные скобки [ ]. Вы также можете использовать любой из следующих подходов, чтобы увеличить измерение feature_vector в еще одном измерении:

    prediction = svm.clf.predict(feature_vector[None, :])
    prediction = svm.clf.predict(feature_vector[np.newaxis, :])
    prediction = svm.clf.predict(np.atleast_2d(feature_vector))
0
ответ дан Tonechas 28 February 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: