- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
实战工具:python3.7+pycharm+opencv4.6 算法知识:HOG特征提取、SVM模型构建 实战目的:本次实战的目的是熟悉HOG+SVM工作流算法,初步掌握图像分类的传统算法。 实战记录:本以为在学习原理、算法应用、动手实操后会很顺利的完全自主实现行人检测项目,但实战过程却差强人意,所以结果嘛就马马虎虎了。实战过程中所爆露出的不足有以下几点:
实战评价:虽然坎坎坷坷,但还过得去.
本次实战使用的数据是MIT行人数据库(有现成的资料,懒得收集啦),该数据库为较早公开的行人数据库,共924张行人图片(ppm格式,宽高为64x128),肩到脚的距离约80象素。该数据库只含正面和背面两个视角,无负样本,未区分训练集和测试集。Dalal等采用“HOG+SVM”,在该数据库上的检测准确率接近100%。该数据库的下载链接见 这里 .
"""
加载并整理数据集-->图像的预处理-->图像的特征提取
-->设计分类器-->输出分类器准确率-->测试图像
"""
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包含行人
'''
测试图片集的结果: 测试的其他图片:
ONE_CLASS
和非单分类 SVM_C_SVC
和 NU_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的值。该函数的返回值有两个 retval
和 result
,测试样本的标签值存储在 result.ravel()
中。 最后此篇关于【opencv】传统图像识别:hog+svm行人识别实战的文章就讲到这里了,如果你想了解更多关于【opencv】传统图像识别:hog+svm行人识别实战的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如果我在 lrge 训练集上训练 SVM,并且类变量是 True 或 False,那么与训练集中的 False 值数量相比,True 值很少会影响训练模型/结果吗?他们应该平等吗?如果我的训练集的 T
假设我的特征向量是 (x1, x2, ...xn) 谁能给我一个代码来使用 libSVM 训练一类 SVM? 我应该如何使用交叉验证来学习参数。 最佳答案 这可能会帮助你 label=ones(Num
我提前为这个问题的新颖性道歉,但我被卡住了。我正在尝试解决这个问题, 我可以做第 i)-1v) 部分,但我卡在了 v 上。我知道计算余量 y,你可以 y=2/||W|| 而且我知道W是超平面的法线,只
我有以下 R 配置: 操作系统:LinuxR 版本 3.0.1 (2013-05-16)rmr2 版本 2.2.1rhdfs 版本 1.0.6hadoop 版本 1.2.0 如何使用带 rmr2 包的
我想尝试不同的嵌入,例如 Word2Vec、ELMo 和 BERT,但我有点困惑是使用词嵌入还是句子嵌入,以及为什么。我将嵌入用作 SVM 分类器的特征输入。 谢谢。 最佳答案 虽然这两种方法都可以证
几乎所有的例子都是基于数字的。在文本文档中,我有文字而不是数字。 那么你能告诉我如何使用这些算法进行文本文档分类的简单示例吗? 我不需要代码示例,只需要逻辑 伪代码将有很大帮助 最佳答案 常用的方法是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我目前正处于语音识别的讨论阶段项目,我使用MFCC特征提取,但是从函数返回的MFCC特征是一个矩阵,例如每个语音文件(wav)的(20,38)特征矩阵。但是我如何将此功能传递给 SVM 分类器。对于
请我喜欢用 SIFT DESCRIPTOR 和 SVM 将一组图像分类为 4 类。现在,使用 SIFT 提取器,我得到了不同大小的关键点,例如 img1 有 100 个关键点,img2 有 55 个关
我有一组图像。我想学习一类支持向量机(OC-SVM)来模拟特定类(正)的分布,因为我没有足够的例子来代表其他类(负)。我对 OC-SVM 的理解是,它试图将数据与源分离,换句话说,它试图学习一个超球体
我正在使用 scikit-learn 使用 SVM 构建一些预测模型。我有一个包含大约 5000 个示例和大约 700 个特征的数据集。我在我的训练集上使用 18x17 网格搜索进行 5 折交叉验证,
这是我考试时提出的问题。我给出了以下答案,我的得分是0分。教授甚至不同意给予任何部分的认可,也没有告诉我我的答案有什么问题。谁能帮我找出我的答案有什么问题吗? 这是我在考试中给出的答案。缺点是:1)
tune.svm() 和 best.svm() 有什么区别。 当我们调整 svm 内核的参数时,我们不希望总是为我们的模型选择最佳值。 请原谅,因为我是 R 和机器学习的新手。 我注意到在调整 svm
我尝试使用 OpenCV2.3 实现基于 SVM 和 HOG 的人员检测系统。但是我卡住了。 我走到这一步:我可以从图像数据库计算 HOG 值,然后我用 LIBSVM 计算 SVM 向量,所以我得到例
Mahout(机器)中围绕 SVM(支持向量机)的任何新发展Learning With Hadoop) 使用 Hadoop?最近 SVM 实现被添加到 Mahout 中。我打算使用 SVM。有人尝试过
我使用 sklearn.svm.SVC 构建支持向量分类器,如下所示。 import numpy as np from sklearn.svm import SVC svc=SVC(proba
我想看看模型是否收敛于我的交叉验证。我如何增加或减少 sklearn.svm.SVC 中的时代? 目前: SVM_Model = SVC(gamma='auto') SVM_Model.fit(X_t
与在 SVM 的相同成本函数中使用 2-范数权重相比,我们如何通过在成本函数中使用 1-范数权重来提高稀疏性。 对于 1-范数:成本函数 - 最小化 ||w||_1 对于 2-范数:成本函数 - 最小
事实上,我不是一个经验丰富的 C++ 程序员,我是一个 C# 程序员,正如你所知道的,它有很大的不同,根据我的机器学习经验,我只使用了 matlab,所以如果我有一些,请原谅概念错误。 我正在尝试在
我正在尝试使用 OpenCV 中的 SVM 加载函数加载 .xml 文件,然后使用预测函数对交通标志进行分类。当到达预测函数的执行时抛出错误: Unhandled exception at 0x000
我是一名优秀的程序员,十分优秀!