hog.detectMultiScale过程学习

本文深入解析了HOG特征检测中的scale计算原理,包括如何根据用户输入的scale0参数生成一系列缩放级别,以及这些缩放级别如何影响图像处理和扫描窗口的设定。通过实例和图表展示,读者能够清晰地理解HOG检测中scale的作用及其实现方式。

1、弄清楚scale的过程

double scale = 1.;
    int levels = 0;

    vector<double> levelScale;
    for( levels = 0; levels < nlevels; levels++ )
    {
        levelScale.push_back(scale);
        if( cvRound(img.cols/scale) < winSize.width ||
            cvRound(img.rows/scale) < winSize.height ||
            scale0 <= 1 )
            break;
        scale *= scale0;
    }

由代码可以看出,hog会根据用户传递进来的scale0这个缩放参数,得到1到多个缩放级别,保存在levelScale这个vector里。计算的原理是:
第一个缩放参数固定等于1,
下一个缩放参数在上一个缩放参数的基础上乘于scale0,
直到原图像的宽或高除于这个最后的缩放参数的值,比扫描窗口小的时候,就停止。
如果用户指定的scale0<=1,就只有一级缩放参数:1,也就是不进行任何缩放,就将原图像进行处理。

从上面的scale的就算过程得到的缩放图片的过程可以由这张图表示:
这里写图片描述

最底下的就是原图,然后逐层往上缩小。这个图所设定的scale0=2。

我们也可以知道,扫描窗口的大小,最终决定了可以缩小的最小的图片,也就是不能检测到比扫描窗口更小的图片。

训练的时候有一个扫描窗口,测试时也有一个扫描窗口,是否要

import cv2 import numpy as np import random def load_images(dirname, amout = 9999): img_list = [] file = open(dirname) img_name = file.readline() while img_name != '': # 文件尾 img_name = dirname.rsplit(r'/', 1)[0] + r'/' + img_name.split('/', 1)[1].strip('\n') img_list.append(cv2.imread(img_name)) img_name = file.readline() amout -= 1 if amout <= 0: # 控制读取图片的数量 break return img_list # 从每一张没有人的原始图片中随机裁出10张64*128的图片作为负样本 def sample_neg(full_neg_lst, neg_list, size): random.seed(1) width, height = size[1], size[0] for i in range(len(full_neg_lst)): for j in range(10): y = int(random.random() * (len(full_neg_lst[i]) - height)) x = int(random.random() * (len(full_neg_lst[i][0]) - width)) neg_list.append(full_neg_lst[i][y:y + height, x:x + width]) return neg_list # wsize: 处理图片大小,通常64*128; 输入图片尺寸>= wsize def computeHOGs(img_lst, gradient_lst, wsize=(128, 64)): hog = cv2.HOGDescriptor() # hog.winSize = wsize for i in range(len(img_lst)): if img_lst[i].shape[1] >= wsize[1] and img_lst[i].shape[0] >= wsize[0]: roi = img_lst[i][(img_lst[i].shape[0] - wsize[0]) // 2: (img_lst[i].shape[0] - wsize[0]) // 2 + wsize[0], \ (img_lst[i].shape[1] - wsize[1]) // 2: (img_lst[i].shape[1] - wsize[1]) // 2 + wsize[1]] gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) gradient_lst.append(hog.compute(gray)) # return gradient_lst def get_svm_detector(svm): sv = svm.getSupportVectors() rho, _, _ = svm.getDecisionFunction(0) sv = np.transpose(sv) return np.append(sv, [[-rho]], 0) # 主程序 # 第一步:计算HOG特征 neg_list = [] pos_list = [] gradient_lst = [] labels = [] hard_neg_list = [] svm = cv2.ml.SVM_create() pos_list = load_images(r'G:/python_project/INRIAPerson/96X160H96/Train/pos.lst') full_neg_lst = load_images(r'G:/python_project/INRIAPerson/train_64x128_H96/neg.lst') sample_neg(full_neg_lst, neg_list, [128, 64]) print(len(neg_list)) computeHOGs(pos_list, gradient_lst) [labels.append(+1) for _ in range(len(pos_list))] computeHOGs(neg_list, gradient_lst) [labels.append(-1) for _ in range(len(neg_list))] # 第二步:训练SVM svm.setCoef0(0) svm.setCoef0(0.0) svm.setDegree(3) criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 1000, 1e-3) svm.setTermCriteria(criteria) svm.setGamma(0) svm.setKernel(cv2.ml.SVM_LINEAR) svm.setNu(0.5) svm.setP(0.1) # for EPSILON_SVR, epsilon in loss function? svm.setC(0.01) # From paper, soft classifier svm.setType(cv2.ml.SVM_EPS_SVR) # C_SVC # EPSILON_SVR # may be also NU_SVR # do regression task svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels)) # 第三步:加入识别错误的样本,进行第二轮训练 # 参考 http://masikkk.com/article/SVM-HOG-HardExample/ hog = cv2.HOGDescriptor() hard_neg_list.clear() hog.setSVMDetector(get_svm_detector(svm)) for i in range(len(full_neg_lst)): rects, wei = hog.detectMultiScale(full_neg_lst[i], winStride=(4, 4),padding=(8, 8), scale=1.05) for (x,y,w,h) in rects: hardExample = full_neg_lst[i][y:y+h, x:x+w] hard_neg_list.append(cv2.resize(hardExample,(64,128))) computeHOGs(hard_neg_list, gradient_lst) [labels.append(-1) for _ in range(len(hard_neg_list))] svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels)) # 第四步:保存训练结果 hog.setSVMDetector(get_svm_detector(svm)) hog.save('myHogDector.bin') ## 最后 ge(len(hard_neg_list))] svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels)) # 第四步:保存训练结果 hog.setSVMDetector(get_svm_detector(svm)) hog.save('myHogDector.bin')
最新发布
05-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值