OpenCV附带一个预训练的猪线性SVM模型,可用于在图像和视频流中执行行人检测。本文我们将使用Opencv自带的模型实现对视频流中的行人检测。感兴趣的小伙伴可以跟随小编一起学习一下
您是否知道OpenCV具有执行行人检测的内置方法?
OpenCV附带一个预训练的猪线性SVM模型,可用于在图像和视频流中执行行人检测。
今天我们使用Opencv自带的模型实现对视频流中的行人检测,只需打开一个新文件,将其命名为detect.py,然后加入代码:
#导入必要的包
从__未来_ _导入打印_功能
将numpy作为铭牌导入
导入argparse
导入cv2
导入操作系统
导入需要的包,然后定义项目需要的方法。
定义NMS(box,probs=None,overlapThresh=0.3):
#如果没有框,则返回一个空列表
如果len(box)==0:
return []
#如果边界框是整数,将它们转换成浮点数-这
#很重要,因为我们将进行一系列的划分
if boxes.dtype.kind=='i ':
盒子=盒子。astype(' float ')
#初始化选取的索引列表
pick=[]
#获取边界框的坐标
x1=盒子[:0]
y1=框[:1]
x2=盒子[:2]
y2=盒子[:3]
#计算边界框的面积并抓取索引进行排序
#(在没有提供概率的情况下,只需按
#左下方y坐标)
面积=(x2 - x1 1) * (y2 - y1 1)
idxs=y2
#如果提供了概率,则按概率排序
如果问题不是无:
idxs=probs
#对索引进行排序
idxs=np.argsort(idxs)
#在某些索引仍保留在索引列表中时继续循环
而len(idxs) 0:
#获取索引列表中的最后一个索引,并添加索引值
#添加到挑选的索引列表中
last=len(idxs) - 1
i=idxs[last]
pick.append(i)
#找到边界起点的最大(x,y)坐标
#方框和边界终点的最小(x,y)坐标
#方框
xx1=np.maximum(x1[i],x1[idxs[:last]])
yy1=np.maximum(y1[i],y1[idxs[:last]])
xx2=np.minimum(x2[i],x2[idxs[:last]])
yy2=np.minimum(y2[i],y2[idxs[:last]])
#计算边界框的宽度和高度
w=np.maximum(0,xx2 - xx1 1)
h=np.maximum(0,yy2 - yy1 1)
#计算重叠率
overlap=(w * h)/area[idxs[:last]]
#从索引列表中删除重叠较大的所有索引
#超过提供的重叠阈值
idxs=np.delete(idxs,np.concatenate(([last],
NP。其中(overlap overlap thresh)[0])))
#仅返回已选取的边界框
退货箱[选择]。astype('int ')
image_types=(' .jpg ',' .jpeg ',' .png ',' .bmp ',' .' tif ',' .tiff’)
def list_images(basePath,contains=None):
#返回有效的文件集
返回list_files(basePath,validExts=image_types,contains=contains)
def list_files(basePath,validExts=None,contains=None):
#遍历目录结构
对于os.walk(基本路径)中的(根目录、目录名、文件名):
#遍历当前目录中的文件名
对于文件名中的文件名:
#如果包含字符串不为没有,并且文件名不包含
#提供的字符串,然后忽略该文件
如果包含不为没有人且filename.find(包含)==-1:
继续
#确定当前文件的文件扩展名
ext=filename[filename.rfind(' . '):].下部()
#检查文件是否是图像,是否应该进行处理
如果有效文本为没有人或ext.endswith(validExts):
#构建图像的路径并生成它
imagePath=os.path.join(根目录,文件名)
生成图像路径
def resize(image,width=None,height=None,inter=cv2 .区间_区域):
dim=无
(h,w)=image.shape[:2]
# 如果高和宽为没有人则直接返回
如果宽度为"无",高度为"无":
返回图像
# 检查宽是否是没有人
如果宽度为无:
# 计算高度的比例并并按照比例计算宽度
r=高度/浮动(h)
dim=(int(w * r),height)
# 高为没有人
否则:
# 计算宽度比例,并计算高度
r=宽度/浮动(w)
dim=(width,int(h * r))
resized=cv2.resize(image,dim,interpolation=inter)
#返回调整大小的图像
返回调整大小
新帕萨特函数:非极大值抑制。
列表_图像:读取图片。
调整大小:等比例改变大小。
#构造参数解析并解析参数
ap=argparse .ArgumentParser()
ap.add_argument('-i ','- images ',默认值='test1 ',帮助=' images目录的路径)
args=vars(ap.parse_args())
# 初始化猪描述符/人物检测器
hog=cv2 .全息描述符()
hog.setSVMDetector(cv2 .hog descriptor _ getdefaultpeopleconnect())
定义输入图片的文件夹路径。
初始化猪检测器。
#在图像路径上循环
对于list_images(参数['images'])中的图像路径:
# 加载图像并调整其大小以
# (1)减少检测时间
# (2)提高检测精度
image=cv2.imread(imagePath)
image=resize(image,width=min(400,image.shape[1]))
orig=image.copy()
打印(图像)
#检测图像中的人物
(rects,weights)=猪。检测多尺度(image,winStride=(4,4),
填充=(8,8),比例=1.05)
#绘制原始边界框
打印(矩形)
对于矩形中的(x,y,w,h):
cv2.rectangle(orig,(x,y),(x w,y h),(0,0,255),2)
# 使用相当大的重叠阈值对边界框应用非极大值抑制,以尝试保持仍然是人的重叠框
rects=np.array([[x,y,x w,y h] for (x,y,w,h) in rects])
pick=nms(rects,probs=None,overlapThresh=0.65)
#绘制最终的边界框
对于挑选中的(xA,yA,xB,yB):
cv2.rectangle(image,(xA,yA),(xB,yB),(0,255,0),2)
#显示一些关于边界框数量的信息
filename=图像路径[图像路径。rfind('/')1:]
打印('[信息] {}: {}原始框,{}隐藏后。格式(
文件名,len(rects),len(pick))
#显示输出图像
cv2。im显示(' NMS之前,原文)
cv2。im显示(' NMS之后,图片)
cv2.waitKey(0)
遍历-图像目录中的图像。
然后,将图像调整为最大宽度为400 像素。尝试减少图像尺寸的原因有两个:
减小图像大小可确保需要评估图像金字塔中的滑动窗口更少(即从线性SVM中提取猪特征,然后将其传递给线性SVM),从而减少检测时间(并提高整体检测吞吐量)。
调整我们的图像大小也提高了我们行人检测的整体准确性(即更少的误报)。
通过调用猪描述符的检测多尺度方法,检测图像中的行人检测多尺度方法构造了一个比例为1.05 的图像金字塔,滑动窗口步长分别为x和y方向的(4, 4) 个像素。
滑动窗口的大小固定为64 x 128像素,正如开创性的达拉勒和特里格斯论文《用于人体检测的定向梯度直方图》 所建议的那样检测多尺度函数返回rects的2元组,或图像中每个人的边界框(x,y)坐标和重量,SVM为每次检测返回的置信度值。
较大的比例大小将评估影像金字塔中较少的图层,这可以使算法运行得更快。然而,如果比例太大(即图像金字塔中的层数太小),则不能检测到行人。同样,太小的比例会显著增加要评估的影像金字塔图层的数量。这不仅会造成计算的浪费,还会显著增加行人检测器检测到的虚警数量。也就是说,比例是进行行人检测时要调整的最重要的参数之一。我将在以后的博客文章中更彻底地检查每个参数,以检测多尺度。
获取初始边界框,并在图像上绘制它们。
然而,对于一些图像,你会注意到每个人都检测到多个重叠的边界框。
在这种情况下,我们有两个选择。我们可以检查一个边界框是否完全包含在另一个边界框中。或者我们可以应用非最大值抑制,并抑制与重要阈值重叠的边界框。
应用非最大值抑制后,得到最终的包围盒,然后输出图像。
运行结果:
nms之前:
在nms之后:
结论:
与目前的深度学习方法相比,机器学习的准确率要低很多。
以上就是本文关于Python OpenCV内置方法实现行人检测的内容。有关Python OpenCV行人检测的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。