66基于OpenCV的行人检测 实战:基于openCV的行人检测(三)

任务描述
在前面的任务中我们介绍了使用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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值