【opencv】传统图像识别:hog+svm行人识别实战

这篇具有很好参考价值的文章主要介绍了【opencv】传统图像识别:hog+svm行人识别实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


实战工具: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包含行人
'''

测试图片集的结果:
【opencv】传统图像识别:hog+svm行人识别实战
测试的其他图片:
【opencv】传统图像识别:hog+svm行人识别实战
文章来源地址https://www.toymoban.com/news/detail-648710.html

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行人识别实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv-python学习笔记(十一):HOG+SVM进行行人检测全过程

    本次是接着python-opencv学习笔记(七):滑动窗口与图像金字塔 一起在实验楼所做实验,为啥中间隔了四篇才接着发出来,主因是我发文比较随意(懒),当时这部分并没有总结完,至少我感觉我看的相关资料还不够多,整体理解不深,另外就是项目需求,在做很多其它的东

    2024年02月05日
    浏览(58)
  • 【opencv】示例-peopledetect.cpp HOG(方向梯度直方图)描述子和SVM(支持向量机)进行行人检测...

    本段代码是一个使用OpenCV库的 HOG(Histogram of Oriented Gradients,方向梯度直方图)描述子和SVM(Support Vector Machines,支持向量机)进行行人检测的程序 。程序定义了Detector类来执行行人检测,可以在两种模式(默认模式和戴姆勒模式)之间切换。通过命令行参数,用户可以选择是

    2024年04月14日
    浏览(53)
  • 【机器学习】HOG+SVM实现行人检测

    任务:利用INRIA Person数据集,提取HOG特征并采用SVM方法实现图像中的行人检测。 本文将给出详细的操作步骤,以及可能会出现的坑点。 INRIA数据集含有直立或行走的人的图像,被Navneet Dalal用于训练发表在CVPR 2005的人类检测器。 坑点1 :官网http://pascal.inrialpes.fr/data/human/打开后

    2024年02月02日
    浏览(45)
  • HOG+SVM行人检测python实现

      HOG算法是在2005年由法国Dalal提出。HOG特征作为机器学习目标检测效果最好的特征,在其基础上发展来的DPM算法更是可以成为机器学习在目标检测领域的巅峰之作,连续三年横扫PASCAL VOC。HOG是一种在计算机视觉和图像处理中用来进行物体检测的描述子。通过计算和统计局部

    2023年04月20日
    浏览(41)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果 一、简单介绍 二、简单行人人体检测效果实现原理 三、简单行人人体检测效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月26日
    浏览(64)
  • Python+OpenCV+paddleocr基于传统图像处理技术实现车牌识别

    目录 一、前言 二、预处理-提取车牌         1. 转灰度图         2. 顶帽运算         3. Sobel算子提取y方向边缘         4. 自适应二值化         5. 开运算分割(纵向去噪,分隔)         6. 闭运算合并         7. 膨胀/腐蚀         8. 腐蚀

    2024年02月04日
    浏览(53)
  • opencv 案例实战02-停车场车牌识别SVM模型训练及验证

    1. 整个识别的流程图: 2. 车牌定位中分割流程图: 三、车牌识别中字符分割流程图: 下载车牌相关字符样本用于训练和测试,本文使用14个汉字样本和34个数字跟字母样本,每个字符样本数为40,样本尺寸为28*28。 数据集下载地址 https://download.csdn.net/download/hai411741962/88248392

    2024年02月11日
    浏览(37)
  • 计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

    该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。 该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪! 教程博客_传送门链接-------单目测

    2024年02月08日
    浏览(54)
  • 【OpenCV-Python】——机器学习kNN算法&SVM算法&k均值聚类算法&深度学习图像识别&对象检测

    目录 前言: 1、机器学习 1.1 kNN算法 1.2 SVM算法(支持向量机)  1.3 k均值聚类算

    2024年02月05日
    浏览(49)
  • OpenCV图像特征提取学习五,HOG特征检测算法

    一、HOG向梯度直方图概述   向梯度直方图(Histogram of Oriented Gradient, HOG)特征是基于对稠密网格中归一化的局部方向梯度直方图的计算。此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。在

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包