Python基于HOG+SVM/RF/DT等模型实现目标人行检测功能
作者:Together_CZ 发布时间:2021-07-12 01:54:50
当下基本所有的目标检测类的任务都会选择基于深度学习的方式,诸如:YOLO、SSD、RCNN等等,这一领域不乏有很多出色的模型,而且还在持续地推陈出新,模型的迭代速度很快,其实最早实现检测的时候还是基于机器学习去做的,HOG+SVM就是非常经典有效的一套框架,今天这里并不是说要做出怎样的效果,而是基于HOG+SVM来实践机器学习检测的流程。
这里为了方便处理,我是从网上找的一个数据集,主要是行人检测方向的,当然了这个用车辆检测、火焰检测等等的数据集都是可以的,本质都是一样的。
首先看下数据集,数据集主要分为两个类别,一个类别是包含行人的,另一个类别是不包含行人的,首先看下不包含行人的:
接下来看下包含行人的:
看到这里,其实就不难理解,这里的SVM扮演的主要作用就是二分类模型了。
接下来我们需要对原始图像的数据集进行特征提取计算,这里是基于HOG的方式实现的,可以自行实现HOG特征向量提取方法,也可以直接使用skimage提供的HOG提取器来一步实现,这里为了方便,我是直接使用的skimage提供的HOG方法,核心实现如下:
def img2Feature(dataDir="data/",save_path="feature.json"):
"""
特征提取计算
"""
feature=[]
for one_label in os.listdir(dataDir):
print("one_label: ", one_label)
oneDir=dataDir+one_label+'/'
for one_pic in os.listdir(oneDir):
one_path=oneDir+one_pic
print("one_path: ", one_path)
#加载图像
one_img = imread(one_path, as_gray=True)
one_vec = hog(one_img, orientations=orientations, pixels_per_cell=pixels_per_cell, cells_per_block=cells_per_block,
visualize=visualize, block_norm=normalize)
one_vec=one_vec.tolist()
one_vec.append(one_label)
feature.append(one_vec)
print("feature_length: ", len(feature))
with open(save_path,"w") as f:
f.write(json.dumps(feature))
HOG提取得到的向量维度很大,这里就不进行展示了。
之后就可以训练模型了,核心实现如下:
resDir = "results/"
if not os.path.exists(resDir):
os.makedirs(resDir)
data = "feature.json"
dict1 = DTModel(data=data, rationum=0.25, model_path=resDir + "DT.model")
dict2 = RFModel(data=data, rationum=0.25, model_path=resDir + "RF.model")
dict3 = SVMModel(data=data, rationum=0.25, model_path=resDir + "SVM.model")
res_dict = {}
res_dict["DT"], res_dict["RF"], res_dict["SVM"] = dict1, dict2, dict3
with open(resDir + "res_dict.json", "w") as f:
f.write(json.dumps(res_dict))
comparePloter(dict1, dict2, dict3, save_path=resDir + "comparePloter.jpg")
这里,我是同时使用了决策树DT、随机森林RF、支持向量机SVM三种模型来进行分类和对比可视化,对比结果如下:
{
"DT": {
"precision": 0.7573482282561567,
"recall": 0.7597846737437716,
"F1": 0.7584933696379963,
"accuracy": 0.7584933696379963
},
"RF": {
"precision": 0.9156160607479066,
"recall": 0.8801773928046967,
"F1": 0.893107332148193,
"accuracy": 0.893107332148193
},
"SVM": {
"precision": 0.9281402443868877,
"recall": 0.9272928963585789,
"F1": 0.9277128372009962,
"accuracy": 0.9277128372009962
}
}
为了直观展示,这里对三种模型的性能进行可视化展示,如下所示:
接下来我们对训练好的模型调用进行测试,查看具体的效果,随机选取了几张网上的图像,测试结果如下:
整体看下来,效果表现一般,不过这个也只是主要以实践流程为目的,并不是实际做项目的,而且各个环节都有优化提升的空间,模型的参数也都没有调过。
来源:https://blog.csdn.net/Together_CZ/article/details/125079040


猜你喜欢
- 今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法。但是,我们都知道,在列表中删
- 贴代码:import os import sys iplist = list() ip = '192.168.1.11' #
- 一、安装MySQL下载MySQL的社区版的压缩包:https://dev.mysql.com/get/Downloads/MySQL-8.0
- 开发环境集成开发工具:jupyter notebook 6.5.2集成开发环境:Python 3.10.6第三方库:to
- 有助于效率的类型选择1、使你的数据尽可能小最基本的优化之一是使你的数据(和索引)在磁盘上(并且在内存中)占据的空间尽可能小。这能给出巨大的改
- 由于文件夹可能有多层目录,因此需要对其进行递归遍历。本文采取了简单的协议定制,定义了五条命令,指令Head如下:Sync:标识开始同步文件夹
- 天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看。这时候,是不是特别想电脑像讲故事一样,给我们念出来呢
- modelform是model衍生出来的form .modelform的用法非常死.首先在models.py里创建模型表.所有的form组件
- 本文实例讲述了Python设计模式之代理模式。分享给大家供大家参考,具体如下:代理模式(Proxy Pattern):为其他对象提供一种代理
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。JSON 函数使用 JSON
- mysql limit 分页的用法及注意事项:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,my
- 包含Contains(s,substr string) bool判断s是否包含substr true:包含 false:不包含例子: &nb
- 日常工作中需要对比两个Excel工作表中的数据差异是很不方便的,使用python来做就比较简单了!我们的思路是通过读取两个Excel的数据,
- 一台服务器上开启了3个mysql实例进程,占用不同的端口 3306、3307、3308原理说明:通过自动发现规则来获取MySQL实例的端口,
- 下载安装NodeJS后,在自己选择的路径下会有如下的文件:默认情况下NodeJS安装会同时安装npm(模块管理器:用于管理用户require
- 实现网页的键盘输入操作from selenium.webdriver.common.keys import Keys * 页有时需要将鼠标
- 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为字
- 如何显示一个等待或欢迎信息? <% Response.Buffer = True %
- 虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编
- 最近设计一个优惠券列表,有个属性是有效日期,因为空间有限,必须要把开始日期和结束日期在一行显示,这样就出现一排的数字,日期有好几种我们习惯的