python - 将 HOG+SVM 训练应用于网络摄像头以进行目标检测

标签 python opencv machine-learning scikit-learn computer-vision

我通过从正面和负面数据集中提取 HOG 特征来训练我的 SVM 分类器

from sklearn.svm import SVC
import cv2
import numpy as np

hog = cv2.HOGDescriptor()


def hoggify(x,z):

    data=[]

    for i in range(1,int(z)):
        image = cv2.imread("/Users/munirmalik/cvprojek/cod/"+x+"/"+"file"+str(i)+".jpg", 0)
        dim = 128
        img = cv2.resize(image, (dim,dim), interpolation = cv2.INTER_AREA)
        img = hog.compute(img)
        img = np.squeeze(img)
        data.append(img)

    return data

def svmClassify(features,labels):
    clf=SVC(C=10000,kernel="linear",gamma=0.000001)
    clf.fit(features,labels)

    return clf

def list_to_matrix(lst):
    return np.stack(lst) 

我想应用该培训,以便程序能够检测我的自定义对象(椅子)。

我已经为每组添加了标签;接下来需要做什么?

最佳答案

您已经拥有三个最重要的部分可供您使用。 hoggify创建一个 HOG 描述符列表 - 每个图像一个。请注意,用于计算描述符的预期输入是灰度图像,并且描述符作为具有 1 列的二维数组返回,这意味着 HOG 描述符中的每个元素都有自己的行。但是,您正在使用 np.squeeze删除单例列并将其替换为一维 numpy 数组,所以我们在这里很好。然后您将使用 list_to_matrix将列表转换为 numpy大批。完成此操作后,您可以使用 svmClassify最终训练您的数据。这假设您已经拥有 labels在一维 numpy大批。训练 SVM 后,您将使用 SVC.predict 在给定输入 HOG 特征的方法中,它将对图像是否属于椅子进行分类。

因此,您需要执行的步骤是:

  • 使用 hoggify创建您的 HOG 描述符列表,每个图像一个。看起来像输入 x是您将椅子图像称为的前缀,而 z表示要加载的图像总数。请记住 range不包括结束值,因此您可能需要添加 + 1int(z) (即 int(z) + 1 )以确保包含结尾。我不确定是否是这种情况,但我想把它扔掉。
    x = '...' # Whatever prefix you called your chairs
    z = 100 # Load in 100 images for example
    lst = hoggify(x, z)
    
  • 将 HOG 描述符列表转换为实际矩阵:
    data = list_to_matrix(lst)
    
  • 训练你的 SVM 分类器。假设您已经将标签存储在 labels 中其中一个值 0表示不是椅子和 1表示椅子,它是一维 numpy大批:
    labels = ... # Define labels here as a numpy array
    clf = svmClassify(data, labels)
    
  • 使用您的 SVM 分类器进行预测。假设您有一个要使用分类器测试的测试图像,您将需要执行与处理训练数据相同的处理步骤。我假设这就是 hoggify在哪里可以指定不同的 x表示要使用的不同集合。指定一个新变量 xtest要指定这个不同的目录或前缀,以及您需要的图像数量,然后使用 hoggify结合list_to_matrix获取您的功能:
    xtest = '...' # Define new test prefix here
    ztest = 50 # 50 test images
    lst_test = hoggify(xtest, ztest)
    test_data = list_to_matrix(lst_test)
    pred = clf.predict(test_data)
    
    pred将包含一组预测标签,一个对应于您拥有的每个测试图像。如果您愿意,您可以查看您的 SVM 对训练数据的处理情况,因此既然您已经拥有这些数据,只需使用 data再次从第 2 步开始:
    pred_training = clf.predict(data)
    
    pred_training将包含一组预测标签,每个训练图像一个。


  • 如果您最终想将其与网络摄像头一起使用,则该过程将使用 VideoCapture 对象并指定连接到您的计算机的设备的 ID。通常只有一个网络摄像头连接到您的计算机,因此使用 ID 0。一旦您这样做,该过程将是使用循环,抓取帧,将其转换为灰度,因为 HOG 描述符需要灰度图像,计算描述符,然后对图像进行分类。

    假设你已经训练了你的模型并且你已经从之前创建了一个 HOG 描述符对象,这样的事情会起作用:
    cap = cv2.VideoCapture(0)
    dim = 128 # For HOG
    
    while True:
        # Capture the frame
        ret, frame = cap.read()
    
        # Show the image on the screen
        cv2.imshow('Webcam', frame)
    
        # Convert the image to grayscale
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
        # Convert the image into a HOG descriptor
        gray = cv2.resize(gray, (dim, dim), interpolation = cv2.INTER_AREA)
        features = hog.compute(gray)
        features = features.T # Transpose so that the feature is in a single row
    
        # Predict the label
        pred = clf.predict(features)
    
        # Show the label on the screen
        print("The label of the image is: " + str(pred))
    
        # Pause for 25 ms and keep going until you push q on the keyboard
        if cv2.waitKey(25) == ord('q'):
            break
    
    cap.release() # Release the camera resource
    cv2.destroyAllWindows() # Close the image window
    

    上述过程读取图像,将其显示在屏幕上,将图像转换为灰度,以便我们可以计算其 HOG 描述符,确保数据在与您训练的 SVM 兼容的单行中,然后我们预测其标签。我们将其打印到屏幕上,并在读取下一帧之前等待 25 毫秒,以免 CPU 过载。此外,您可以随时按键盘上的 q 键退出程序。否则,该程序将永远循环。完成后,我们将相机资源释放回计算机,以便它可用于其他进程。

    关于python - 将 HOG+SVM 训练应用于网络摄像头以进行目标检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45175222/

    相关文章:

    python - 如何将 numpy 数组作为 Catboost Python 中的分类特征传递

    python - OpenCV中Trackbar的负值范围

    python - OpenCV和Python:knnMatch参数问题

    Python 绘制两个变量之间的每月数据

    python - 将字符串中的最后一个数字逐一迭代

    python - 在 Python 中,有没有一种方法可以一致地对由列表和元组组成的列表进行排序?

    Opencv 和 AWS Lambda

    machine-learning - Scikit Learn 中小正样本集的机器学习实验设计

    python - 通过机器学习提取重叠类别

    python - Tensorflow:使用更多不同矩阵进行张量乘法