HOG+SVM进行行人检测(github代码解读)
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代码解读)相关推荐
- OpenCV实战【2】HOG+SVM实现行人检测
目录 HOG是什么? HOG vs SIFT HOG步骤 HOG在检测行人中的方式 Opencv实现 HOGDescriptor的构造函数: 行人检测HOG+SVM步骤 简化版的HOG计算 HOG是什 ...
- OpenCV实战4: HOG+SVM实现行人检测
目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图)HOG 特征是用于目标检测的特征描述子,它通过计算和统计图像 ...
- HOG+SVM实现行人检测
一.概述 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测: 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是 ...
- CVPR2005【行人检测】HOG+SVM用于人体检测的梯度方向直方图
目录 CVPR2005-用于人体检测的梯度方向直方图 Histograms of Oriented Gradients for Human Detection 使用的数据集 研究方法 数据 流程 双对 ...
- 行人检测方法代码汇总
序号 文章简介 论文 出处 0 2012年PAMI登的行人检测的综述性文章: pedestrian detection an evaluation of the state of th ...
- 基于实例分割方法的端到端车道线检测 论文+代码解读
Towards End-to-End Lane Detection: an Instance Segmentation Approach 论文原文 https://arxiv.org/pdf/1802 ...
- Opencv学习笔记 基于HOG和SVM的行人检测
一.概述 OpenCV提供了一个基于HOG和SVM且经过训练的行人检测器.和级联分类器一样,可以用这个SVM分类器以不同尺度的窗口扫描图像,在完整的图像中检测特定物体. 1.代码参考 窗口步长决定了这 ...
- python svm 实战_opencv-python 入门实战:传统方法Hog+svm实现目标检测
写在前面 相信大家学过语言的朋友们都有这样经验:学习编程语言最快的方式就是直接看别人的源代码.别人代码看通了,基本上这门编程语言也就入门了. 文末将附上我自己写的代码,比较初级,适合入门学习.大佬看到 ...
- 行人检测HOG+SVM:综述、INRIADATA数据集、线性SVM
目录 1. 行人检测算法研究综述 2. 基于机器学习的方法:人工特征+分类器 2.1 HOG+SVM 2.2 HOG+Adaboost 2.3 ICF+AdaBoost 2.4 DPM+ latent ...
最新文章
- 爬虫之selenium标签页的切换
- 构建gitbook并基于gitlab自动发布~
- ue4 改变枢轴位置_UE4渲染模块概述(四)---反射
- Linux centosVMware Apache 配置防盗链、访问控制Directory、访问控制FilesMatch
- 腾讯正式加入OCP阵营,拥抱全球开源生态圈
- 【模拟】交换(jzoj 1518)
- 【渝粤教育】国家开放大学2018年秋季 1320T关系营销 参考试题
- python第一周心得_python第一周心得-Go语言中文社区
- vue-router(2.0)
- 如何屏蔽Tensorflow输出的调试和警告信息
- 使用粒子群PSO算法实现MPPT-M语言仿真
- Windows屏幕保护程序的制作
- react native 背景颜色渐变
- GEEM2引擎微端架设基本教程
- 解决IE浏览器打开,出现不能为“read”的问题
- 标志logo设计思路
- JAVA JSP javaweb 火车订票系统(订票系统 火车票预订系统
- robotstudio试用期延长总结
- 虚拟机客户端怎么连接服务器,虚拟机客户端连接服务器
- 计算机辅助英语,计算机辅助英语教学