HOG+SVM进行行人检测

代码参考+数据集来源:https://github.com/FrankMa123/-

注意使用的scikit-learn库的版本为0.22,高于该版本的scikit-learn库,代码会报出错误(joblib库无法正常使用)

本文:主要对原作者的代码进行注释,以便于理解HOG+SVM检测,并有利于将该模型应用到其他分类。

致敬原作者!!!

一、config.py

#包含人的图片数据集的路径
pos_im_path = '../data/images/pos_person'
#不包含人的图片数据集的路径
neg_im_path = '../data/images/neg_person'
min_wdw_sz = [68, 124]
step_size = [10, 10]
orientations = 9
#一个cell为6*6个像素点
pixels_per_cell = [6, 6]
#一个block包含2*2个cell
cells_per_block = [2, 2]
visualize = False
normalize = True
pos_feat_ph = '../data/features/pos'
neg_feat_ph = '../data/features/neg'
model_path = '../data/models/'
threshold = .3

二、extract_features.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 20 14:04:30 2019@author: maqianli
"""from skimage.feature import hog
from skimage.io import imread
import joblib
import glob
import os
from config import *def extract_features():if not os.path.isdir(pos_feat_ph):os.makedirs(pos_feat_ph)if not os.path.isdir(neg_feat_ph):os.makedirs(neg_feat_ph)for im_path in glob.glob(os.path.join(pos_im_path, "*")):#对每一张包含人的图片进行处理im = imread(im_path, as_grey=True)print(im.shape)#求取hog特征fd = hog(im, orientations=9, pixels_per_cell=[8,8], cells_per_block=[2,2], visualise=False, transform_sqrt=True)print(fd.shape)#将得到的特征进行存储fd_name = os.path.split(im_path)[1].split(".")[0] + ".feat"fd_path = os.path.join(pos_feat_ph, fd_name)joblib.dump(fd, fd_path)for im_path in glob.glob(os.path.join(neg_im_path, "*")):#对每一张不包含人的图片进行处理im = imread(im_path, as_grey=True)#求取hog特征fd = hog(im, orientations=9, pixels_per_cell=[8,8], cells_per_block=[2,2], visualise=False, transform_sqrt=True)#将得到的特征进行存储fd_name = os.path.split(im_path)[1].split(".")[0] + ".feat"fd_path = os.path.join(neg_feat_ph, fd_name)joblib.dump(fd, fd_path)print('completed')if __name__=='__main__':extract_features()

三、train_svm.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 20 14:56:42 2019@author: maqianli
"""#以上信息为原作者信息from sklearn.svm import LinearSVC
import joblib
import glob
import os
from config import *
import numpy as npdef train_svm():#利用hog特征训练SVMpos_feat_path = '../data/features/pos'neg_feat_path = '../data/features/neg'model_path = '../data/models/svm_model'#分别存放特征和标签fds, labels = [], []#对得到的特征进行打标签,分别包含有人和无人的情况for feat_path in glob.glob(os.path.join(pos_feat_path, "*.feat")):fd = joblib.load(feat_path)fds.append(fd)labels.append(1)for feat_path in glob.glob(os.path.join(neg_feat_path, "*.feat")):fd = joblib.load(feat_path)fds.append(fd)labels.append(0)#用线性SVMclf = LinearSVC()clf.fit(fds, labels)if not os.path.isdir(os.path.split(model_path)[0]):os.makedirs(os.path.split(model_path)[0])#print('Classifier save to {}'.format(model_path))#将训练好的模型存储到model_path下joblib.dump(clf, model_path)print('Classifier save to {}'.format(model_path))if __name__=='__main__':train_svm()

四、detector.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 20 15:33:30 2019@author: maqianli
"""import numpy as np
from skimage.transform import pyramid_gaussian
from imutils.object_detection import non_max_suppression
import imutils
from skimage.feature import hog
import joblib
import cv2
from config import *
from skimage import color
import matplotlib.pyplot as plt
import os
import globmodel_path = '../data/models/svm_model'#滑动窗口,即得到图片的一部分
def sliding_window(image, window_size, step_size):for y in range(0, image.shape[0], step_size[1]):for x in range(0, image.shape[1], step_size[0]):yield x, y, image[y: y + window_size[1], x:x + window_size[0]]def detector(filename):im = cv2.imread(filename)#对图片大小进行控制im = imutils.resize(im, width=min(400, im.shape[1]))#最小窗口大小min_wdw_sz = (64, 128)step_size = (10, 10)#图像金字塔缩放倍数downscale = 1.25#导入训练好的SVM模型clf = joblib.load(model_path)#detections存放图片中的人物detections = []#scale为缩放的次数scale = 0#对图片进行缩放for im_scaled in pyramid_gaussian(im, downscale=downscale):#如果图片比我们规定的图片小,那么就结束,不进行下面的hog检测if im_scaled.shape[0] < min_wdw_sz[1] or im_scaled.shape[1] < min_wdw_sz[0]:break#对滑动窗口进行hog特征检测for (x, y, im_window) in sliding_window(im_scaled, min_wdw_sz, step_size):if im_window.shape[0] != min_wdw_sz[1] or im_window.shape[1] != min_wdw_sz[0]:continue#将得到的图像进行灰度化im_window = color.rgb2gray(im_window)#hog特征检测fd = hog(im_window, orientations=9, pixels_per_cell=[8, 8], cells_per_block=[2, 2],transform_sqrt=True)#将fd特征转换成向量,并调用训练好的模型进行预测fd = fd.reshape(1, -1)pred = clf.predict(fd)#如果检测到图片中有人if pred == 1:if clf.decision_function(fd) > 0.5:#保存 包含人的矩形detections.append((int(x * (downscale ** scale)), int(y * (downscale ** scale)),clf.decision_function(fd),int(min_wdw_sz[0] * (downscale ** scale)),int(min_wdw_sz[1] * (downscale ** scale))))scale += 1#克隆一遍原图,画出矩形,进行输出clone = im.copy()for (x_t1, y_t1, _, w, h) in detections:cv2.rectangle(im, (x_t1, y_t1), (x_t1 + w, y_t1 + h), (0, 255, 0), thickness=2)rects = np.array([[x, y, x + w, y + h] for (x, y, _, w, h) in detections])sc = [score[0] for (x, y, score, w, h) in detections]print("sc: ", sc)sc = np.array(sc)pick = non_max_suppression(rects, probs=sc, overlapThresh=0.3)# print("shape, ",pick.shape)for (xA, yA, xB, yB) in pick:cv2.rectangle(clone, (xA, yA), (xB, yB), (0, 255, 0), 2)plt.axis("off")plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))plt.title('Raw Detection before NMS')plt.show()plt.axis("off")plt.imshow(cv2.cvtColor(clone, cv2.COLOR_BGR2RGB))plt.title("Final Detections after applying NMS")plt.show()def test_folder(foldername):filenames = glob.iglob(os.path.join(foldername, '*'))for filename in filenames:#对foldername下的每一张图片进行detectprint(filename)detector(filename)if __name__ == '__main__':#对test_image里面的图片进行预测foldername = 'test_image'test_folder(foldername)

HOG+SVM进行行人检测(github代码解读)相关推荐

  1. OpenCV实战【2】HOG+SVM实现行人检测

    目录 HOG是什么? HOG vs SIFT HOG步骤 HOG在检测行人中的方式 Opencv实现 HOGDescriptor的构造函数: 行人检测HOG+SVM步骤 简化版的HOG计算 HOG是什 ...

  2. OpenCV实战4: HOG+SVM实现行人检测

    目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图)HOG 特征是用于目标检测的特征描述子,它通过计算和统计图像 ...

  3. HOG+SVM实现行人检测

    一.概述 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测: 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是 ...

  4. CVPR2005【行人检测】HOG+SVM用于人体检测的梯度方向直方图

    目录 CVPR2005-用于人体检测的梯度方向直方图 Histograms of Oriented Gradients for Human Detection 使用的数据集 研究方法 数据 流程 双对 ...

  5. 行人检测方法代码汇总

    序号 文章简介 论文         出处 0 2012年PAMI登的行人检测的综述性文章: pedestrian detection an evaluation of the state of th ...

  6. 基于实例分割方法的端到端车道线检测 论文+代码解读

    Towards End-to-End Lane Detection: an Instance Segmentation Approach 论文原文 https://arxiv.org/pdf/1802 ...

  7. Opencv学习笔记 基于HOG和SVM的行人检测

    一.概述 OpenCV提供了一个基于HOG和SVM且经过训练的行人检测器.和级联分类器一样,可以用这个SVM分类器以不同尺度的窗口扫描图像,在完整的图像中检测特定物体. 1.代码参考 窗口步长决定了这 ...

  8. python svm 实战_opencv-python 入门实战:传统方法Hog+svm实现目标检测

    写在前面 相信大家学过语言的朋友们都有这样经验:学习编程语言最快的方式就是直接看别人的源代码.别人代码看通了,基本上这门编程语言也就入门了. 文末将附上我自己写的代码,比较初级,适合入门学习.大佬看到 ...

  9. 行人检测HOG+SVM:综述、INRIADATA数据集、线性SVM

    目录 1. 行人检测算法研究综述 2. 基于机器学习的方法:人工特征+分类器 2.1 HOG+SVM 2.2 HOG+Adaboost 2.3 ICF+AdaBoost 2.4 DPM+ latent ...

最新文章

  1. 爬虫之selenium标签页的切换
  2. 构建gitbook并基于gitlab自动发布~
  3. ue4 改变枢轴位置_UE4渲染模块概述(四)---反射
  4. Linux centosVMware Apache 配置防盗链、访问控制Directory、访问控制FilesMatch
  5. 腾讯正式加入OCP阵营,拥抱全球开源生态圈
  6. 【模拟】交换(jzoj 1518)
  7. 【渝粤教育】国家开放大学2018年秋季 1320T关系营销 参考试题
  8. python第一周心得_python第一周心得-Go语言中文社区
  9. vue-router(2.0)
  10. 如何屏蔽Tensorflow输出的调试和警告信息
  11. 使用粒子群PSO算法实现MPPT-M语言仿真
  12. Windows屏幕保护程序的制作
  13. react native 背景颜色渐变
  14. GEEM2引擎微端架设基本教程
  15. 解决IE浏览器打开,出现不能为“read”的问题
  16. 标志logo设计思路
  17. JAVA JSP javaweb 火车订票系统(订票系统 火车票预订系统
  18. robotstudio试用期延长总结
  19. 虚拟机客户端怎么连接服务器,虚拟机客户端连接服务器
  20. 计算机辅助英语,计算机辅助英语教学

热门文章

  1. Spring MVC【钢镚核恒】
  2. Git-02-分支使用
  3. python递归函数例题_Python练习题 022:用递归函数反转字符串
  4. Naive Bayes(朴素贝叶斯)
  5. 2008高考零分作文---天街小雨润如酥,草色遥看近却无
  6. 【Linux】vim在每行行首或行尾添加/删除内容
  7. ModelArts部署紫东太初大模型推理服务经验分享
  8. Java响应式编程框架
  9. 部编版是什么版本_部编版和人教版的区别是什么
  10. 【整理】RipCity