将HOG + SVM培训应用于网络摄像头以进行对象检测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将HOG + SVM培训应用于网络摄像头以进行对象检测相关的知识,希望对你有一定的参考价值。
我通过从正负数据集中提取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列的2D数组返回,这意味着HOG描述符中的每个元素具有其自己的行。但是,您使用np.squeeze
删除单例列并将其替换为1D numpy数组,所以我们在这里很好。然后,您将使用list_to_matrix
将列表转换为numpy
数组。一旦你这样做,你可以使用svmClassify
来最终训练你的数据。这假设您已经在1D labels
阵列中拥有numpy
。在训练SVM之后,您将使用SVC.predict
方法,在给定输入HOG特征的情况下,它将分类图像是否属于椅子。
因此,您需要执行的步骤是:
- 使用
hoggify
创建HOG描述符列表,每个图像一个。它看起来像输入x
是你所谓的椅子图像的前缀,而z
表示你想要加载的图像的总数。请记住,range
不包括结束值,所以你可能想添加一个+ 1
在int(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
表示椅子,它是1Dnumpy
数组: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对训练数据的表现如何,所以既然你已经掌握了这一点,那么只需从步骤2再次使用data
: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 ms,因此我们不会使CPU过载。此外,您可以通过按键盘上的q键随时退出程序。否则,该程序将永远循环。完成后,我们将相机资源释放回计算机,以便可以将其用于其他进程。
以上是关于将HOG + SVM培训应用于网络摄像头以进行对象检测的主要内容,如果未能解决你的问题,请参考以下文章