Я использую учебник по OpenCV4 Python в качестве руководства.У меня есть набор изображений, которые я использую для обучения алгоритма машинного обучения, чтобы определить, светится ли светодиод красным, красным или выключен.Мои шаги:
- Использование
glob
до cv.imread
изображений из файла. - Дополнительные манипуляции с изображениями
- Создание меток
- Использование
KNN
или SVM
(или некоторые контролируемые алгоритмы обучения)
У меня есть всекроме алгоритма ML работает.Почему я не могу заставить этот алгоритм работать независимо от того, что я пытаюсь?
Я вставлю упрощенную версию своего кода.
Попробовал преобразовать ответы и образцы в np.float32
, переключился с KNN
на SVM
, преобразовал мои изображения в одноканальный, изменил массив numpy
, преобразовал сэмплы в UMat
.
Насколько я знаю:
Iзнаю, что образцы должны быть np.float32
& UMat
.Длина выборок должна совпадать с длиной ответов.
Я использую Ubuntu в Linux и PyCharm в качестве DE.Некоторые примеры тренировочных образов здесь: https://drive.google.com/drive/folders/1AQ2fmCdtpTiSQZNLiKLKXNm1VwvRUrUI?usp=sharing
import cv2 as cv
import numpy as np
import glob
def unpack(paths):
files = []
for path in paths:
for file in glob.glob(path + '/*.jpg'):
files.append(file)
return files
def grab(file_paths):
grabbed_imgs = []
for fl in file_paths:
grabbed_imgs.append(cv.imread(str(fl)))
return grabbed_imgs
def get(grabbed_imgs, position):
# pulls coordinates of LED, left out for simplicity.
# let xpt = (300, 350), ypt = (250, 300)
xpt, ypt = locate_squares()
xpt = np.squeeze(xpt)
ypt = ypt[position]
ypt = np.squeeze(ypt)
# set all values that aren't the LED location to black
masked = []
if len(grabbed_imgs) != 0:
for im in grabbed_imgs:
masked = np.zeros_like(im)
xpt = [int(x) for x in xpt]
ypt = [int(y) for y in ypt]
for x in range(xpt[0], xpt[1]):
for y in range(ypt[0], ypt[1]):
for d in range(2):
masked[y][x][d] = im[y][x][d]
return masked
g3 = ['/home/me/myFolderPath']
r3 = ['/home/me/otherFolderPath']
g3 = unpack(g3)
r3 = unpack(r3)
g3_images = grab(g3)
r3_images = grab(r3)
# g3 green r3 red. For simplicity, I am leaving the off state out
g3 = np.squeeze(get(g3_images, position=3))
r3 = np.squeeze(get(r3_images, position=3))
samples3 = np.concatenate((g3, r3), 0)
# labels: 1 stands for green 2 stands for red
a = [1] * len(g3)
b = [2] * len(r3)
responses = a + b
print(len(samples3), len(responses), responses) # is as expected
>>> 75 75 [1,1,1,1,1...,2,2,2,2,2,2,2,...]
# SVM Machine Learning
gamma = 0.50625
C = 12.5
model = cv.ml.SVM_create()
model.setGamma(gamma)
model.setC(C)
model.setKernel(cv.ml.SVM_C_SVC)
model.setType(cv.ml.SVM_C_SVC)
model.setTermCriteria((cv.TERM_CRITERIA_MAX_ITER, 100, 1e-6))
model.train(np.float32(samples3), cv.ml.ROW_SAMPLE, np.float32(responses))
# I also tried the KNN ML algorithm
knn = cv.ml.KNearest_create()
knn.train(samples3, cv.ml.ROW_SAMPLE, responses)
Я получаю сообщение об ошибке:
model.train(np.float32(samples3), cv.ml.ROW_SAMPLE, np.float32(responses))
cv2.error: OpenCV(4.1.0) /io/opencv/modules/core/src/matrix.cpp:235: error: (-215:Assertion failed) s >= 0 in function 'setSize'