如何根据我的预测获得 ROI 坐标?

Posted

技术标签:

【中文标题】如何根据我的预测获得 ROI 坐标?【英文标题】:How do I get the ROI coordinates based on my prediction? 【发布时间】:2019-12-04 18:19:07 【问题描述】:

我正在使用 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 所基于的坐标上

上图只是一个示例图,我是为眉毛做的,经过预测,我想通过上述方式实现或尝试实现输出。

【问题讨论】:

How to crop an image in OpenCV using Python的可能重复 我的数据将其转换为浮点形式,我不只是简单地绘制矩形,它首先是我预测并希望根据该预测绘制一个矩形。 那你应该先问这样的问题:如何根据我的预测得到 ROI 坐标? 是的,这条评论可以更好地预测我正在尝试做什么或寻求帮助 举报我在聊天中说的话,负面标签应该是-1。 【参考方案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)

【讨论】:

我们需要在预测部分之后还是在训练部分使用h_og.setSVMDetector(svm) h_og.detectMultiScale(img)是实际的预测部分,所以在执行此命令之前需要设置SVM。 我已经编辑了帖子,您不能将 SVm 的实例放入 setSVMDetector();你必须把支持向量和 rho 放在那里。 svm = cv2.ml.SVM_load('svm.xml') sam = [] for file in glob.glob("Testing\\*.jpg"): img = cv2.imread(file, 1) img = cv2.resize(img, (240, 160)) hog = cv2.HOGDescriptor() hog = cv2.HOGDescriptor((32,64), (16,16), (8,8), (8,8), 9) hist = hog.compute(img) sample.append(hist) hog.setSVMDetector(array) sam = np.float32(sam) res = svm.predict(sam) del svm found, w = hog.detectMultiScale(img) print (res) 不,您没有在代码中初始化“数组”。您需要从 SVM 获取支持向量并将它们放入 HOGDescriptor,就像您使用预训练的人员检测器(即github.com/abhisharma7/FacePoseEstimation/blob/…)所做的那样。要获取它们,您可以使用 svm 实例的相关方法。

以上是关于如何根据我的预测获得 ROI 坐标?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 YOLOv5 预测中获取类和边界框坐标?

hbuilder如何根据Geolocation获得的坐标获取所在城市?

如何获得全长 GPS 坐标?

python基于图像的掩码mask信息获取病灶区域ROI最小外接矩形坐标位置opencv基于掩码最小外接矩形坐标剪裁原图(crop image by mask rectangle)

opencv 怎么把两张图片合并到一起?

ENVI中如何剪裁所需要的经纬度