Recognition:基于HoG特征的最近邻分类器与SVM的人物检测器

实际运行结果:

  • 上面的为最近邻分类器,其中红框表示最近邻搜索的预测结果。
  • 下方的为SVM:橙色框表示SVM的预测结果。其中,最红的框表示SVM预测的最高得分的预测结果。
image-20240524103153318

使用经典图像处理的方法开发简单人物检测器,其大致步骤如下:

  1. 获取正样本训练数据,即包含人的图像块。获取负样本训练数据,即不包含(完整)人的图像块。
  2. 提取方向梯度直方图(HoG)特征,以获取比原始像素值更稳健的图像描述符。
  3. 使用这些训练数据训练我们选择的分类器。使用一个简单的最近邻搜索或支持向量机。
  4. 使用滑动窗口方法从我们的验证图像中提取图像块和HoG特征,并在每个图像块上评估分类器,以便在验证图像中检测出人。

1 获取训练图像块

通过已经有的图像及数据,我们可以获得正样本训练数据,即包含人的图像块,使用PIL库进行裁剪

assert isinstance(img, Image.Image), 'img needs to be PIL.Image.Image'
crop = img.crop(box)  
patch = crop.resize(patch_size)
return patch

再通过将给定大小的框放置在图像中的随机位置,获得负样本训练数据;

x = np.random.randint(0, W - boxsize[0])
y = np.random.randint(0, H - boxsize[1])
box = [x, y, x + boxsize[0], y + boxsize[1]]

为了包括更具挑战性的负样本,我们需要在已有的边界框基础上添加一个的随机偏移量,从而构建出与正样本训练数据相似的困难的负样本。

off_x = np.random.randint(min_offset, max(2, max_offset_w))
off_y = np.random.randint(min_offset, max(2, max_offset_h))
off_box = [box[0] + off_x, box[1] + off_y, box[2] + off_x, box[3] + off_y]
image-20240524091815978

2 提取 HoG 特征

为了构建一个更鲁棒的人体检测器,我们将使用方向梯度直方图(Histogram of Oriented Gradients,HoG)特征。HoG 特征在处理视角、光照变化以及小的形变(如平移、缩放、旋转、透视变换)时具有较强的鲁棒性。

基本思想:

HoG 的核心思想是通过梯度方向和梯度幅值来表示图像块。具体,我们将图像块的每个像素点的梯度角度(由梯度方向决定)和梯度幅值(由梯度大小决定)用直方图表示,从而得到该图像块的特征描述。

提取步骤:
  1. 梯度计算

    • 梯度幅值 (Gradient Magnitude):首先,对输入图像进行梯度计算,得到每个像素点的梯度幅值(强度)和梯度方向。梯度幅值描述了像素值变化的程度,梯度方向描述了变化的方向。

    • 梯度方向 (Gradient Angle):计算每个像素点的梯度方向,并将这些方向量化为若干个方向区间。例如,这里将方向区间划分为8个方向(每个方向45度),这样可以简化计算和后续处理。

  2. 图像划分

    将图像划分为多个较小的单元(cells),每个单元包含8x8个像素。

  3. 构建方向直方图

    方向量化和加权:将梯度方向映射到相应的方向区间,并将梯度幅值作为该区间的权重值加进去。

  4. 块归一化

    将若干个单元组合成一个块,例如2x2的单元构成一个块。然后,对块内的梯度方向直方图进行归一化处理,以增强特征的鲁棒性。

  5. 特征向量构建

    将所有块的归一化直方图拼接在一起,形成最终的HoG特征向量。

image-20240524092313289

我们可以使用 scikit-image 库来计算图像的HoG特征。

hog(img, orientations=8, pixels_per_cell=(16, 16), cells_per_block=(1, 1), channel_axis=-1, **kwargs)
  • img:输入图像,类型可以是2D灰度图或3D彩色图
  • orientations:方向区间的数量,即将梯度方向划分为多少个区间。默认值为8
  • pixels_per_cell:每个单元(cell)包含的像素数,通常为一个2元组,例如(16, 16),表示每个单元为16x16个像素
  • cells_per_block:每个块(block)包含的单元数,通常为一个2元组,例如(1, 1),表示每个块包含1x1个单元,即不进行块归一化
  • channel_axis:图像通道所在的轴,对于彩色图像,通常为-1表示最后一个轴

3 训练分类器

将之前获取的正和负训练图像块进行HoG特征提取后拼接在一起,得到训练使用的特征向量X

for p in positives:fds_pos.append(get_hog(p))
for n in negatives:fds_neg.append(get_hog(n))
X = np.stack(fds_pos + fds_neg)

再使用正样本(标签是1)创建了一个全为1的布尔数组,长度等于正样本的数量;负样本(标签是0)创建了一个全为0的布尔数组,长度等于负样本的数量。这两个数组被连接在一起,形成了目标向量y

y = np.concatenate([np.ones(len(positives), dtype=np.bool), np.zeros(len(negatives), dtype=np.bool)])
最近邻分类器:

使用Faiss库:

d = X.shape[1]
quantizer = faiss.IndexFlatL2(d) # measure L2 distance
index = faiss.IndexIVFFlat(quantizer, d, 100, faiss.METRIC_L2) # build the indexindex.train(X.astype(np.float32))
index.add(X.astype(np.float32)) # add vectors to the index
支持向量机SVM:

使用 sklearn.svm.SVC 训练支持向量机。

svm = SVC(class_weight='balanced') # use balanced weight since we have more negatives than positives
svm.fit(X, y)

4 Evaluate

为了评估分类器,我们需要从目标图像中提取图像块及其 HOG 特征,以便我们的目标数据与训练数据进行对比。我们使用滑动窗口方法:

  1. 在图像上滑动窗口

    • 从图像的左上角开始,将窗口放置在该位置。提取窗口覆盖的图像区域作为一个裁剪。
    • 根据步长在图像上移动窗口,提取新的裁剪。
    • 重复上述步骤,直到窗口覆盖完整个图像。
    for y in range(0, H - window_size[1], step_size):for x in range(0, W - window_size[0], step_size):window = (x, y, x + window_size[0], y + window_size[1])
    
  2. 特征提取与分类

    • 对每个裁剪提取HoG特征。
    • 使用预先训练好的分类器对每个裁剪进行分类,判断其是否包含目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P148--章节作业1

编辑 编辑 public class Main {public static void main(String args[]){double yxq100000;int cishu0;while(true) {if(yxq > 50000) {yxq yxq - yxq * 0.05;cishucishu1;}else if(yxq > 1000){yxq yxq - 1000;cishucishu1;}else{break;}}System.out.print(cishu);} …

【分支控制】(switch) 详解

switch分支结构 基本语法 switch (表达式){case 常量1: //当...语句块1;break; //跳出switchcase 常量2:语句块2;break;...case 常量n;语句块n;break;default:default语句块;break;}switch 关键字, 表示switch分支表达式, 对应一个值case 常量1: 当表达式的值等于常量1, 就执行…

详解Spring MVC

目录 1.什么是Spring Web MVC MVC定义 2.学习Spring MVC 建立连接 RequestMapping 注解介绍及使用 获取单个参数 获取多个参数 获取普通对象 获取JSON对象 获取基础URL参数 获取上传文件 获取Header 获取Cookie 获取Session 总结 1.什么是Spring Web MVC 官⽅对于…

转型先锋!G7易流的数字化到底有多牛?

在供应链全球一体化进程中,国内外局势的改变,使得物流行业运力供大于求趋势愈加明显,国内供应链参与者面对内外发展需求和激烈的市场竞争,需要打破同质化竞争的局面,提供具有特色的服务,形成专业、高效、灵…

深度学习500问——Chapter09:图像分割(3)

文章目录 9.8 PSPNet 9.9 DeepLab系列 9.9.1 DeepLabv1 9.9.2 DeepLabv2 9.9.3 DeeoLabv3 9.9.4 DeepLabv3 9.8 PSPNet 场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的。本文使用文中的 pyramid pooling module 实现基于不同区域的上下文集成,提出了PS…

OrangePi AIpro初识及使用大模型GPT-Neo-1.3B测试

OrangePi AIpro介绍 1.1. 开发板简介 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板,其搭 载了昇腾AI 处理器,可提供8TOPS INT8 的计算能力,内存提供了8GB 和16GB 两种版本。可以实现图像、视频等多种数据分析与推理…

[xx点评完结]——白马点评完整代码+rabbitmq实现异步下单+资料,免费

项目所有功能已测,均可以跑通,Jmeter和RabbitMQ也都测了。 项目源码:dianpinghui: 仿黑马点评项目 资料: https://pan.baidu.com/s/1kTCn9PxgeIey90WgM4KRqA?pwdn66b 对佬有帮助可以给个star哈,感谢🌹🌹&#x1f3…

OpenHarmony 实战开发——内核IPC机制数据结构解析

一、前言 OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个…

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图…

玄机平台应急响应—webshell查杀

1、前言 这篇文章说一下应急响应的内容,webshell查杀呢是应急响应的一部分。那么什么是应急响应呢,所谓的应急响应指的是,当网站突然出现异常情况或者漏洞时,能够马上根据实际问题进行分析,然后及时解决问题。 2、应…

新增长100人研讨会:台州制造业企业共探数字驱动下的业绩增长策略

2024年5月17日,纷享销客联合鑫磊压缩机,在台州举办了一场主题为“数字化驱动下的业绩增长策略”的研讨会。本次会议汇聚台州多家制造行业的10余位数字化管理者,共同探讨在数字化转型浪潮中,制造业如何实现业绩的持续增长。 鑫磊压…

计算机二级Access操作题总结——基本操作

基础操作题 设置主键 例:将“线路”表中的“线路ID”字段设置为主键 ①右键单击“线路”表; ②单击【设计视图】; ③鼠标指到表的第一行→“线路ID”处,右键单击; ④单击【主键】 设置有效性规则 例:设…

【Linux】Linux基本指令1

1.软件,OS,驱动 我们看看计算机的结构层次 1.1.操作系统 操作系统是一款做 软硬件管理 的软件 操作系统(计算机管理控制程序)_百度百科 (baidu.com) 操作系统(英语:Operating System,缩写&a…

【全开源】景区手绘地图导览系统源码(ThinkPHP+FastAdmin)

一款基于ThinkPHPFastAdmin开发多地图手绘地图导览系统(仅支持H5),景区升4A5A必备系统,高级版支持全景。 ​打造个性化游览新体验 一、引言:景区导览系统的革新 在旅游业蓬勃发展的今天,景区导览系统成为了提升游客体验的关键。…

java方法负载问题

先介绍一下方法的重载 下面是例子 方法名都为sum而形参是不同的 记住! 是否为重载关系 1在同一个类里面 2形参不同(与返回值无关) 3方法名一样 第一个图为什么错? 答案:虽然在同一个类里面,并且方法名…

深度学习设计模式之组合模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式,将…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码:打造高效便捷的预定体验 一、引言:数字化预定时代的来临 …

【多态】(超级详细!)

【多态】(超级详细!) 前言一、 多态的概念二、重写1. 方法重写的规则2. 重写和重载的区别 三、多态实现的条件四、 向上转型五、动态绑定 前言 面向对象的三大特征:封装性、继承性、多态性。 extends继承或者implements实现&…

基于物联网技术的智能家居实训教学解决方案

引言 随着信息技术的飞速发展,,物联网(IoT)已深入至我们生活的每一个角落,从智能家居、智能健康、智能交通到智慧城市,无所不在。物联网技术已成为推动社会进步和产业升级的重要力量。智能家居作为物联网技…