samples.cols == var_count && samples.type () == 5 в функции 'cv :: ml :: SVMImpl :: прогнозировать' ошибка метода svm.predict - PullRequest
0 голосов
/ 05 февраля 2019

Я создаю классификатор объектов в opencv python, используя svm.Набор обучающих данных состоит из 200 положительных и 200 отрицательных изображений.Для получения положительных изображений сначала взяли 200 изображений и обрезали целевой объект из изображений и изменили их размер до (64,128) для расчета HOG.Затем для негативных изображений сначала была создана Пирамида изображений, затем применено скользящее окно 64X128, а затем рассчитан HOG для положительных, а также для всех окон негативных изображений с метками 1 и 0. Обученная модель SVM на объектах свиней.Я получаю сообщение об ошибке " cv2.error: OpenCV (3.4.2) C: \ projects \ opencv-python \ opencv \ modules \ ml \ src \ svm.cpp: 2010: ошибка: (-215:Не удалось подтвердить(samples [0]). Метод ravel ().

import cv2
import os
import time
import numpy as np
import imutils

positive_path='C:\\Users\\Admin\\3D Objects\\datqaet with hog and svm\\ROI images'
negative_path='C:\\Users\\Admin\\3D Objects\\datqaet with hog and svm\\Negative images'

def pyramid(img):     #Create image Pyramid
    minSize=(30, 30)
    imgarr = []
    while True:
        scale = 2
        imgarr.append(img)
        w = int(img.shape[1] / scale)
        img = imutils.resize(img, width=w)
        if img.shape[0] < minSize[1] or img.shape[1] < minSize[0]:
            break

    return imgarr


def sliding_window(image, stepSize, windowSize):  #Sliding window for negative images
    sliding = []
    for y in range(0, image.shape[0], stepSize):
        for x in range(0, image.shape[1], stepSize):
             sliding.append((x, y, image[y:y + windowSize[1], x:x + windowSize[0]]))
    return sliding


def get_hog() : 
    winSize = (64,128)
    blockSize = (16,16)
    blockStride = (16,16)
    cellSize = (8,8)
    nbins = 9
    derivAperture = 1
    winSigma = 4.
    histogramNormType = 0
    L2HysThreshold = 0.2
    gammaCorrection = 0
    nlevels = 64
    signedGradient = True
    hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,histogramNormType,L2HysThreshold,gammaCorrection,nlevels, signedGradient)
    return hog

samples = []
labels = []
sam = []
hog = get_hog()
for filename in os.listdir(positive_path):
    img = cv2.imread(os.path.join(positive_path,filename),0)   #RGB image
    img = cv2.resize(img,(64,128))
    img = np.array(img)
    hist = hog.compute(img)
    hist = cv2.normalize(hist,None)
    sam.append(img)
    samples.append(hist)
    labels.append(1)
i=0
for filename in os.listdir(negative_path):
    img = cv2.imread(os.path.join(negative_path,filename),0)
    (winW, winH) = (64,128)
    pyr  = pyramid(img)
    for resized in pyr:
        sliding = sliding_window(resized, stepSize=32, windowSize=(winW, winH))
        for (x, y, window) in sliding:
            if window.shape[0] != winH or window.shape[1] != winW:
                continue      
            hist = hog.compute(window)
            hist = cv2.normalize(hist,None)
            sam.append(window)
            samples.append(hist)
            labels.append(0)
    print(i)
    i=i+1


samples = np.array(samples,dtype=np.float32)
labels =  np.array(labels,dtype=int)
samples = np.squeeze(samples)
print(len(samples))
print(samples.shape)
rand = np.random.RandomState(10)
shuffle = rand.permutation(len(samples))
sam = samples[shuffle]
samples = sam[shuffle]
labels =  labels[shuffle]

svm = cv2.ml.SVM_create()

svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.setC(2.67)
svm.setGamma(5.383)
svm_params = dict( kernel_type = cv2.ml.SVM_LINEAR,
                    svm_type = cv2.ml.SVM_C_SVC,
                    C=2.67, gamma=5.383 )


svm.train(samples,cv2.ml.ROW_SAMPLE,labels)
print("trained")
res = svm.predict(samples[0]).ravel()
print(res)
cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    img=cv2.resize(img,(400,400))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    (winW, winH) = (64,128)
    pyr  = pyramid(img)
    for resized in pyr:
        sliding = sliding_window(resized, stepSize=32, windowSize=(winW, winH))
        for (x, y, window) in sliding:
            if window.shape[0] != winH or window.shape[1] != winW:
                continue      
            hist = hog.compute(window)
            hist = cv2.normalize(hist,None)
            hist = np.reshape(hist,(1,hist.shape[0]))
            res = svm.predict(hist)[1].ravel()
            if res == 1:
                print("found")
            cv2.imshow('img',img)
            cv2.waitKey(10)
...