позвольте мне привести более подробный пример:
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()
Есть две основные проблемы с вашим кодом.
Во-первых, вам не нужно классифицировать весь набор тестов в каждом взаимодействии цикла 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))