实战工具:python3.7+pycharm+opencv4.6
算法知识:HOG特征提取、SVM模型构建
实战目的:本次实战的目的是熟悉HOG+SVM工作流算法,初步掌握图像分类的传统算法。
实战记录:本以为在学习原理、算法应用、动手实操后会很顺利的完全自主实现行人检测项目,但实战过程却差强人意,所以结果嘛就马马虎虎了。实战过程中所爆露出的不足有以下几点:

  • 对opencv、numpy、python的基础知识掌握的不够全面、牢固;
  • 对HOG算法的输出数据形式理解不深刻;
  • 对SVM模型的相关参数、函数方法一知半解,特别是数据在svm中的作用、输出。

实战评价:虽然坎坎坷坷,但还过得去。

1. 准备工作

本次实战使用的数据是MIT行人数据库(有现成的资料,懒得收集啦),该数据库为较早公开的行人数据库,共924张行人图片(ppm格式,宽高为64x128),肩到脚的距离约80象素。该数据库只含正面和背面两个视角,无负样本,未区分训练集和测试集。Dalal等采用“HOG+SVM”,在该数据库上的检测准确率接近100%。该数据库的下载链接见这里

2. 实战代码

"""
加载并整理数据集-->图像的预处理-->图像的特征提取
-->设计分类器-->输出分类器准确率-->测试图像
"""
import cv2
import random
import glob
import numpy as np # 加载本地图像数据集,并将数据集全部添加到列表中,然后打乱数据顺序
def load_image(filename):
paths = glob.glob(filename)
persons, labels = [], []
for i in paths:
persons.append(cv2.imread(i))
labels.append(1)
random.seed(1)
random.shuffle(persons)
persons = np.array(persons)
return persons, labels # 图像预处理,将输入图像灰度化、高斯模糊
def image_preprocessing(image):
cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# image = cv2.resize(image, dsize=(32, 64))
image_preprocess = cv2.GaussianBlur(image, (3, 3), sigmaX=1, sigmaY=1)
return image_preprocess # 构建HOG检测器
def get_hog():
winSize = (64, 128)
cellSize = (8, 8)
blockSize = (16, 16)
blockStride = (16, 16)
nbins = 9
signedGradient = True
derivAperture = 1 # 默认参数
winSigma = -1. # 默认参数
histogramNormType = 0 # 默认参数
L2HysThreshold = 0.2 # 默认参数
gammaCorrection = 1 # 默认参数
nlevels = 64 # 默认参数
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins, derivAperture, winSigma,
histogramNormType, L2HysThreshold, gammaCorrection, nlevels, signedGradient)
return hog # 创建SVM模型并配置参数
def SVM_model():
model = cv2.ml.SVM_create()
model.setType(cv2.ml.SVM_ONE_CLASS)
model.setKernel(cv2.ml.SVM_POLY)
model.setC(1)
model.setNu(0.01)
model.setDegree(0.1)
model.setCoef0(0.5)
model.setGamma(0.6)
model.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, int(1e2), 1e-5))
return model # 训练模型
def SVM_train(model, samples, responses):
model.train(samples, cv2.ml.ROW_SAMPLE, responses)
return model # 计算分类器准确率
def accuracy(model, data_train, labels_train):
retval, result = model.predict(data_train)
temp = (np.array(labels_train) == result).mean()
print(f'该模型的准确率是:{temp * 100}') # 测试分类器
def image_predict(model, data_test, samples, labels_test):
retval, result = model.predict(samples)
counter = 0
for i in (labels_test == result.ravel()):
# 测试结果与实际结果不符合仅呈现红色通道
if not i:
data_test[counter][..., :2] = 0
counter += 1
h1 = data_test[0]
for i in data_test[1:12, ...]:
h1 = np.hstack((h1, i))
h2 = data_test[12]
for i in data_test[13:, ...]:
h2 = np.hstack((h2, i))
return np.vstack((h1, h2)) if __name__ == "__main__":
print('加载图片...')
datas, labels = load_image('image\\Pedestrian detection\\per*.ppm')
temp, data_test = np.split(datas, [900]) print('数据预处理...')
datas = list(map(image_preprocessing, datas)) print('提取训练数据的HOG特征向量...')
hog = get_hog()
hog_vector = list(map(hog.compute, datas)) print('将数据集分为两部分,900张用于训练,24张用于测试...')
data_train, temp = np.split(datas, [900])
labels_train, labels_test = np.split(np.array(labels), [900])
hog_vector_train, hog_vector_test = np.split(hog_vector, [900]) print('训练SVM模型...')
model = SVM_model()
model_svm = SVM_train(model, hog_vector_train, labels_train) print('输出分类模型的准确率...')
accuracy(model_svm, hog_vector_train, labels_train) print('测试分类模型...')
result = image_predict(model_svm, data_test, hog_vector_test, labels_test) cv2.imshow('result, press the q key to exit', result)
while 1:
if cv2.waitKey() == ord('q'):
break print('测试其他图像...')
class_name = {0: "不包含行人", 1: "包含行人"}
img = cv2.imread('image\\persontrain.png')
img = cv2.resize(img, dsize=(64, 128))
img2 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_preprocess = cv2.GaussianBlur(img2, (3, 3), sigmaX=1, sigmaY=1)
# vector = np.array([hog.compute(img_preprocess)])
vector = np.expand_dims(hog.compute(img_preprocess), 0)
ret = model_svm.predict(vector)[1].ravel()
print(f"图片img{class_name[int(ret)]}") cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows() '''
加载图片...
数据预处理...
提取训练数据的HOG特征向量...
将数据集分为两部分,900张用于训练,24张用于测试...
训练SVM模型...
输出分类模型的准确率...
该模型的准确率是:99.0
测试分类模型...
测试其他图像...
图片img包含行人
'''

测试图片集的结果:

测试的其他图片:

3. 项目总结

  • HOG的特征提取的是图像的特征向量,该向量用于作为svm模型train()的"samples"输入变量。当然,在测试图像使用predict()函数时输入的也是图像的特征向量---"samples"。
  • 不同的SVMType有不同的作用,主要分为分类和回归两类。其中分类可分为单分类ONE_CLASS和非单分类SVM_C_SVCNU_SVC。本项目用的是单分类类型。
  • hog.conpute(img)model.train(samples, layout, responses)model.predict(samples)的关系:
    • hog.conpute(img)提取的是单张图像的一维特征向量,如果要提取图像集的特征向量可以使用map()或者for循环。hog.conpute(img)处理后的结果一般被用于训练、测试模型。
    • model.train(samples, layout, responses),该函数的三个参数分别是训练样本集的特征向量矩阵、每个样本特征向量在矩阵的形式、标签矩阵。layout---cv2.ml.ROW_SAMPLE,表示每个训练样本是行向量;cv2.ml.COL_SAMPLE,表示每个训练样本是列向量。layout的值决定了输入的samples中每个样本特征向量在矩阵中的形式。
    • model.predict(samples)中的samples矩阵形式取决于model.train(samples, layout, responses)中layout的值。该函数的返回值有两个retvalresult,测试样本的标签值存储在result.ravel()中。

【opencv】传统图像识别:hog+svm行人识别实战的更多相关文章

  1. HOG + SVM(行人检测, opencv实现)

    HOG+SVM流程 1.提取HOG特征 灰度化 + Gamma变换(进行根号求解) 计算梯度map(计算梯度) 图像划分成小的cell,统计每个cell梯度直方图 多个cell组成一个block, 特 ...

  2. opencv hog+svm行人检测

    http://blog.csdn.net/masibuaa/article/details/16105073 http://blog.csdn.net/u011263315/article/detai ...

  3. OpenCV中基于HOG特征的行人检测

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

  4. HoG SVM 目标检测分析

    前一段时间开始了解HoG跟SVM行人识别,看了很多包括Dalal得前辈的文章及经验分享,对HoG理论有了些初步的认识. HoG 的全称是 Histogram of Oriented Gradient, ...

  5. OpenCV:OpenCV目标检测Hog+SWindow源代码分析

    参考文章:OpenCV中的HOG+SVM物体分类 此文主要描述出HOG分类的调用堆栈. 使用OpenCV作图像检测, 使用HOG检测过程,其中一部分源代码如下: 1.HOG 检测底层栈的检测计算代码: ...

  6. 第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)

    其实在深度学习中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象 ...

  7. Hog SVM 车辆 行人检测

    HOG SVM 车辆检测 近期需要对卡口车辆的车脸进行检测,首先选用一个常规的检测方法即是hog特征与SVM,Hog特征是由dalal在2005年提出的用于道路中行人检测的方法,并且取的了不错的识别效 ...

  8. 【目标检测】基于传统算法的目标检测方法总结概述 Viola-Jones | HOG+SVM | DPM | NMS

    "目标检测"是当前计算机视觉和机器学习领域的研究热点.从Viola-Jones Detector.DPM等冷兵器时代的智慧到当今RCNN.YOLO等深度学习土壤孕育下的GPU暴力美 ...

  9. 利用HOG+SVM实现行人检测

    利用HOG+SVM实现行人检测 很久以前做的行人检测,现在稍加温习,上传记录一下. 首先解析视频,提取视频的每一帧形成图片存到磁盘.代码如下 import os import cv2 videos_s ...

  10. 【从零学习openCV】IOS7人脸识别实战

    前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...

随机推荐

  1. 2020-11-04:java里,总体说一下集合框架。

    福哥答案2020-11-04: 福哥口诀法:收马李色坤(Collection.Map.List.Set.Queue).李矢数链写(List:Vector矢量.ArrayList数组.LinkedLis ...

  2. Djnago常用命令

    pip: bundle,创建包含多个包的pybundles:freeze,显示所有已安装的包:help,显示可用命令:install,安装包:search,搜索PyPi:uninstall,卸载包:u ...

  3. npm install报错node-sass@7.0.1 postinstall: `node scripts/build.js`

    在控制台执行 即可 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass

  4. 向量数据库Pinecone,治疗ChatGPT幻觉的药方?

    大白话了解新鲜事,今天讲讲以Pinecone为代表的向量数据库.向量数据库Pinecone一夜爆火,4月27日B轮拿到了1亿美元的融资,估值达到7.5亿美元,一个2021年刚刚推出的数据库产品,火爆背 ...

  5. 记一次处理挖矿程序引发的postgres 连接超时

    近一段时间内发现自己的服务器总是警告被挖矿,然处理挖矿程序中也引发了许多其他的问题,也从中学到了其他的知识,趁今天未加班梳理一下便于巩固,记录日常 文章目录 一.查找进程 1.使用 ll /proc/ ...

  6. 一步步教你如何搭建K8S集群

    一.环境配置 三台CentOS7虚拟机,默认配置,内存2GB.处理器2核心. 先更新下系统 1 sudo yum update 2 sudo yum upgrade 二.安装并启动 docker 1 ...

  7. Spring Boot实现高质量的CRUD-2

    (续前文) 5.Dao类 ​ ​ Dao类提供操作访问数据库表的接口方法.常规的CRUD,将考虑下列接口方法: ​ 1)插入单条对象记录: ​ 2)批量插入对象记录: ​ 3)修改单条对象记录: ​ ...

  8. 混沌演练状态下,如何降低应用的 MTTR(平均恢复时间)

    在企业业务领域,锦礼是针对福利.营销.激励等员工采购场景的一站式解决方案,包含面向员工.会员等弹性激励SAAS平台.由于其直接面向公司全体员工,其服务的高可用尤其重要,本文将介绍锦礼商城大促前夕,通过 ...

  9. 使用 InstructPix2Pix 对 Stable Diffusion 进行指令微调

    本文主要探讨如何使用指令微调的方法教会 Stable Diffusion 按照指令 PS 图像.这样,我们 Stable Diffusion 就能听得懂人话,并根据要求对输入图像进行相应操作,如: 将 ...

  10. NoSQL数据库系统原理:从概念到实现

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3.3. ...