如何根据我的预测获得 ROI 坐标?
How do I get the ROI coordinates based on my prediction?
我正在使用 SVM 来预测我的投资回报率,我训练了 SVM,现在处于测试阶段,它给我输出带有 1 和 0 形式的标签。
我正在尝试如果 SVM 预测 1
平均图像包含眉毛,现在我希望它应该是眉毛周围的矩形,因为该算法是基于眉毛进行预测的。我怎样才能做到这一点?
下面是我用于预测的代码。
h_og = cv2.HOGDescriptor()
histogram = h_og.compute(photo)
arr.append(histogram)
arr = np.float32(arr)
result = svm.predict(arr)
现在结果是数字或标签的形式。我如何在测试图像的 ROI 上绘制一个矩形。
Positive data: image with eyebrows
Negative data: images not containing eyebrow
Testing data: Full face of the person
如果我必须使用 detectMultiScale()
,我将如何按照上述逻辑使用它。
代码用于训练目的
sam = []
lab = []
# Get positive samples
for filename in glob.glob('D:\*.png'):
im = cv2.imread(filename, 1)
h_og = cv2.HOGDescriptor()
hist = h_og.compute(im)
sam.append(hist)
lab.append(1)
# Get negative samples
for file in glob.glob('D:\*.png'):
im = cv2.imread(file, 1)
im = cv2.resize(img, (240, 160))
h_og = cv2.HOGDescriptor()
hist = h_og.compute(im)
sam.append(hist)
lab.append(0)
# Convert objects to Numpy Objects
sam = np.float32(sam)
lab = np.array(lab)
# Shuffle Samples
rand = np.random.RandomState(321)
shuffle = rand.permutation(len(sam))
sam = sam[shuffle]
lab = lab[shuffle]
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
#svm.setKernel(cv2.ml.SVM_RBF)
cv2.ml.SVM_LINEAR
# svm.setDegree(0.0)
svm.setGamma(5.383)
# svm.setCoef0(0.0)
svm.setC(2.67)
# svm.setNu(0.0)
# svm.setP(0.0)
# svm.setClassWeights(None)
svm.train(sam, cv2.ml.ROW_SAMPLE, lab)
svm.save('file.xml')
更多说明:
如果我的图像包含眉毛,我的 SVM 预测会成功返回我 1
但是在那之后我希望它以下面的方式显示该图像,矩形应该位于 SVM 预测的坐标上1
上图只是一个示例图,我是做眉毛的,经过预测,我想实现或试图实现上面的输出。
svm.predict(arr)
只能预测单张图片。
要获取坐标和 ROI,您需要使用此方法对不同比例的图像的不同部分进行处理。
所以是的,您需要使用 detectMultiScale()
。它是cv2.HOGDescriptor()
的方法,所以你首先需要设置h_og.setSVMDetector(array)
,你训练的SVM支持向量和rho。您可以使用 svm.getSupportVectors()
和 svm.getDecisionFunction(0)
.
获取它们
之后,使用 found, w = h_og.detectMultiScale(img)
你将得到一个矩形列表(已找到),其中包含可用于绘制方框的正数据。
尝试这样的事情,例如:
hog = cv2.HOGDescriptor()
svm = cv2.ml.SVM_load('svm.xml')
sv = svm.getSupportVectors()
rho, alpha, svidx = svm.getDecisionFunction(0)
svm_new = np.append(sv, -rho)
hog.setSVMDetector(svm_new)
for file in glob.glob("Testing\*.jpg"):
img = cv2.imread(file, 1)
img = cv2.resize(img, (240, 160))
found, w = hog.detectMultiScale(img)
for (x, y, w, h) in found:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey()
或者,尝试关注 this example。使用这个保存 SVM 的模型:
svm.save("svm.xml")
tree = ET.parse('svm.xml')
root = tree.getroot()
SVs = root.getchildren()[0].getchildren()[-2].getchildren()[0]
rho = float( root.getchildren()[0].getchildren()[-1].getchildren()[0].getchildren()[1].text )
svmvec = [float(x) for x in re.sub( '\s+', ' ', SVs.text ).strip().split(' ')]
svmvec.append(-rho)
pickle.dump(svmvec, open("svm.pickle", 'w'))
为此,您需要导入 XML:
的 pickle 和 ElementTree
import xml.etree.ElementTree as ET
import pickle
然后加载它并使用它:
svm = pickle.load(open("svm.pickle"))
hog.setSVMDetector( np.array(svm) )
found, w = hog.detectMultiScale(img)
我正在使用 SVM 来预测我的投资回报率,我训练了 SVM,现在处于测试阶段,它给我输出带有 1 和 0 形式的标签。
我正在尝试如果 SVM 预测 1
平均图像包含眉毛,现在我希望它应该是眉毛周围的矩形,因为该算法是基于眉毛进行预测的。我怎样才能做到这一点?
下面是我用于预测的代码。
h_og = cv2.HOGDescriptor()
histogram = h_og.compute(photo)
arr.append(histogram)
arr = np.float32(arr)
result = svm.predict(arr)
现在结果是数字或标签的形式。我如何在测试图像的 ROI 上绘制一个矩形。
Positive data: image with eyebrows
Negative data: images not containing eyebrow
Testing data: Full face of the person
如果我必须使用 detectMultiScale()
,我将如何按照上述逻辑使用它。
代码用于训练目的
sam = []
lab = []
# Get positive samples
for filename in glob.glob('D:\*.png'):
im = cv2.imread(filename, 1)
h_og = cv2.HOGDescriptor()
hist = h_og.compute(im)
sam.append(hist)
lab.append(1)
# Get negative samples
for file in glob.glob('D:\*.png'):
im = cv2.imread(file, 1)
im = cv2.resize(img, (240, 160))
h_og = cv2.HOGDescriptor()
hist = h_og.compute(im)
sam.append(hist)
lab.append(0)
# Convert objects to Numpy Objects
sam = np.float32(sam)
lab = np.array(lab)
# Shuffle Samples
rand = np.random.RandomState(321)
shuffle = rand.permutation(len(sam))
sam = sam[shuffle]
lab = lab[shuffle]
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
#svm.setKernel(cv2.ml.SVM_RBF)
cv2.ml.SVM_LINEAR
# svm.setDegree(0.0)
svm.setGamma(5.383)
# svm.setCoef0(0.0)
svm.setC(2.67)
# svm.setNu(0.0)
# svm.setP(0.0)
# svm.setClassWeights(None)
svm.train(sam, cv2.ml.ROW_SAMPLE, lab)
svm.save('file.xml')
更多说明:
如果我的图像包含眉毛,我的 SVM 预测会成功返回我 1
但是在那之后我希望它以下面的方式显示该图像,矩形应该位于 SVM 预测的坐标上1
上图只是一个示例图,我是做眉毛的,经过预测,我想实现或试图实现上面的输出。
svm.predict(arr)
只能预测单张图片。
要获取坐标和 ROI,您需要使用此方法对不同比例的图像的不同部分进行处理。
所以是的,您需要使用 detectMultiScale()
。它是cv2.HOGDescriptor()
的方法,所以你首先需要设置h_og.setSVMDetector(array)
,你训练的SVM支持向量和rho。您可以使用 svm.getSupportVectors()
和 svm.getDecisionFunction(0)
.
之后,使用 found, w = h_og.detectMultiScale(img)
你将得到一个矩形列表(已找到),其中包含可用于绘制方框的正数据。
尝试这样的事情,例如:
hog = cv2.HOGDescriptor()
svm = cv2.ml.SVM_load('svm.xml')
sv = svm.getSupportVectors()
rho, alpha, svidx = svm.getDecisionFunction(0)
svm_new = np.append(sv, -rho)
hog.setSVMDetector(svm_new)
for file in glob.glob("Testing\*.jpg"):
img = cv2.imread(file, 1)
img = cv2.resize(img, (240, 160))
found, w = hog.detectMultiScale(img)
for (x, y, w, h) in found:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey()
或者,尝试关注 this example。使用这个保存 SVM 的模型:
svm.save("svm.xml")
tree = ET.parse('svm.xml')
root = tree.getroot()
SVs = root.getchildren()[0].getchildren()[-2].getchildren()[0]
rho = float( root.getchildren()[0].getchildren()[-1].getchildren()[0].getchildren()[1].text )
svmvec = [float(x) for x in re.sub( '\s+', ' ', SVs.text ).strip().split(' ')]
svmvec.append(-rho)
pickle.dump(svmvec, open("svm.pickle", 'w'))
为此,您需要导入 XML:
的 pickle 和 ElementTreeimport xml.etree.ElementTree as ET
import pickle
然后加载它并使用它:
svm = pickle.load(open("svm.pickle"))
hog.setSVMDetector( np.array(svm) )
found, w = hog.detectMultiScale(img)