任务描述
在前面的任务中我们介绍了使用OpenCV进行样本数据处理,以及使用HOG特征训练SVM,在本次任务中,我们将会基于OpenCV,使用训练好的SVM分类器来预测图片中行人的位置,并使用非极大值抑制来提升检测效果。
相关知识
为了完成本关任务,你需要了解:
保存训练好的模型;
加载训练好的模型对测试图像进行测试;
使用非极大值抑制优化检测结果。
保存和加载训练好的SVM模型
根据使用的OpenCV中的库的不同,有不同的加载方式,其中:
# 第一类:使用cv2.HOGDecriptor保存和加载模型
hog = cv2.HOGDescriptor()
hog.setSVMDetector(svm) #导入SVM模型参数
hog.save("HogDector.bin") #保存模型
hog1 = cv2.HOGDescriptor()
hog1.load("HogDector.bin") #加载模型
#第二类:使用ml库中的SVM类来保存和加载模型
svm = cv2.ml.SVM_create() #创建模型
svm.setKernel(cv2.ml.SVM_LINEAR) #设置参数
......
svm.save("svm.mat") #保存模型
svm1 = cv2.ml.SVM_load("svm.mat") #加载已有模型
这里我们使用的是第一种方式,使用cv2.HOGDecriptor保存和加载模型。
加载训练好的模型对测试图像进行测试
使用训练好的模型对图形进行预测,前期的准备工作和训练一致,都需要读取并处理图像数据,需要注意的一点是,在对图像进行预处理时,我们需要将测试图像的大小调整为与训练图像的大小一致,否则可能出现模型中参数的维度与测试样本数据的维度不匹配,从而无法正常进行预测。在任务九中我们有提到,OpenCV有封装好的行人检测器,但是为了更贴合我们自己的应用场景需求,我们使用自己训练的模型来进行预测,因此加载训练模型我们选择上一小节中的第一类方式,使用cv2.HOGDecriptor保存和加载模型,另外为了节省时间,这里我们不放取完整的训练预测数据集,仅仅放上其中的一小部分,以供同学们熟悉整个流程,测试的时候我们不使用这一小部分数据训练得到的模型,而是使用完整数据集离线训练好的模型来进行测试。
使用非极大值抑制优化检测结果
在第七个任务中,我们介绍并使用Python实现了非极大值抑制算法,用于对检测问题中产生的大量候选框进行后处理,去除冗余候选框,得到最具代表性结果,其具体流程如下:
根据候选框的类别分类概率进行排序A<B<C<D<E<F,保留最大概率候选框F;
遍历判断其他候选框与F框的重叠度IOU是否大于设定阈值,若大于则删除,直至所有候选框都被处理;
编程要求
本次任务主要实现使用已训练好的模型检测样本图像中行人的存在,并使用非极大值抑制提升检测效果。
根据提示,在右侧编辑器补充代码,针对给定的注释提示进行对应操作。具体要求如下:
加载已有模型“Detector.bin”;
使用非极大值抑制优化检测结果。
平台将以图像的形式显示您的行人检测结果。
测试说明
平台会对你编写的代码进行测试:
预期输出:
org_resutl_len 3
after_NMS_len = 2
import cv2
import numpy as np
import random
from NMS import *
from utils import *
######## Begin1 ########
# 创建并加载已训练好的模型:/data/workspace/myshixun/Dector.bin
hog = cv2.HOGDescriptor()
hog.load("/data/workspace/myshixun/Dector.bin")
######## End1 ########
image = cv2.imread("/data/workspace/myshixun/INRIA/Test/person_007.png")
#cv2.imshow("image", image)
#cv2.waitKey(0)
rects, scores = hog.detectMultiScale(image, winStride=(4, 4),padding=(8, 8), scale=1.05)
# fastNonMaxSuppression第一个参数
for i in range(len(rects)):
r = rects[i]
rects[i][2] = r[0] + r[2]
rects[i][3] = r[1] + r[3]
# fastNonMaxSuppression第二个参数
sc = [score[0] for score in scores]
sc = np.array(sc)
pick = []
######## Begin2 ########
# 使用非极大值抑制算法fastNonMaxSuppression优化检测结果
pick = fastNonMaxSuppression(rects, sc, overlapThresh=0.2)
######## End2 ########
test_task10(rects, pick)
image1 = image.copy()
# 在图像上显示检测结果
for (x, y, xx, yy) in pick:
#print (x, y, xx, yy)
cv2.rectangle(image1, (int(x), int(y)), (int(xx), int(yy)), (0, 0, 255), 2)
cv2.imwrite("/data/workspace/myshixun/step10_img/org_result.png",image)
cv2.imwrite("/data/workspace/myshixun/step10_out/after_nms_result.png",image1)