教你一步一步用python在图像上做物体检测

最近正要做一个人脸识别的门禁系统,所以打算抽出一些时间来做一个系列专题,讲解下我在系统中用到的一些技术来满足一下祖传的好为人师的愿望。

既然要识别人脸,那第一步当然要检测出人脸的位置。

刚好opencv提供了一些图像处理和识别的基本方法,提供了C++、python、java的接口,我个人比较喜欢用python来编程,所以接下来在本文中都会提供用python写的代码。

 

说一下编程的环境需求(Requirement):

  • 系统:windows / linux / macos

  • 解释器:python3

  • 依赖库:numpy >= 1.0、opencv-python 3、opencv-contrib-python 3(接下来的代码都是基于python3和opencv3写的,其他版本可能会不支持,需要稍作修改)

     

python解释器可以在python官网( https://www.python.org/ )下载安装包直接安装,这里不做赘述,下面来安装必须的依赖库,在命令行中输入:

pip3 install numpy==1.14.5

pip3 install opencv-python==3.4.1.15 

pip3 install opencv-contrib-python==3.4.2.17 

 

为了保证不出现版本不兼容问题,我把所有的库都规定了版本

关于IDE有很多选择,比较出名的有Pycharm、Spyder、Eclipse+pydev、Eric,和科学计算有关的建议用Spyder:

 

 

它提供了一个类似于MATLAB的变量显示菜单,可以清楚地看到创建的每一个变量的类型、数值、大小等,对于调试非常方便:

可以看到每个图片变量的矩阵原始值。

好了,基本的编程和运行环境已经搭建完了,下面开始设计代码,基本的思路是使用 Paul Viola 和 Michael Jones 的论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中的算法,opencv很好的实现了这个算法,并把它封装在了级联分类器中,所以接下来写代码的步骤就变成了:加载级联分类器人脸模型 -> 打开摄像头 -> 获取图片 -> 图片灰度化 -> 人脸检测 -> 画出矩形框 -> 图像显示 。

 

这里用的是Haar特征来描述人脸,它反映了图像的灰度变化情况。

 

下面开始撰写代码:

1. 引入opencv模块

import cv2 

2. 加载级联分类器模型:

faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

在opencv的‘\sources\data\haarcascades’目录下可以找到这个官方训练好的普适性模型,效果还过得去,如果想要更加的准确或者识别其他物体,可以自己用正负样本去训练(记得把模型放在和代码相同的目录下)

 

3. 打开摄像头

cap = cv2.VideoCapture(0) 

4. 获取图片

ret, image = cap.read()

5. 图像灰度化(降低运算强度)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

6. 人脸检测

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30),) 

detectMultiScale函数的第一个参数是灰度图像。

第二个参数是scaleFactor,不同人距离镜头不一样,有的脸比较大,有的小,scaleFactor用来对此进行补偿。

分类器使用滑动窗口来检测物体, minSize是每个窗口的大小,minNeighbors会定义其周围有多少物体。

detectMultiScale返回了一个numpy array:faces,检测出几个人脸列表的长度即为多少,faces中每一行中的元素分别表示检出的人脸在图中的(坐标x、坐标y、宽度、高度)

 

7. 在原先的彩图上画出包围框(绿色框,边框宽度为2)

for (x, y, width, height) in faces: 
    cv2.rectangle(image, (x, y), (x + width, y + height), (0, 255, 0), 2) 

8. 显示图片

cv2.imshow("Face",image)

cv2.waitKey(0)


看,它很完美的检测出了我的脸在图片中的位置:

再来个大合照:

需要把从摄像头获取数据改为从图片读取数据:

image = cv2.imread(image_path) 

Look, 并没有出现种族歧视的现象。

 

当然有时候也会出现一些误识别和漏识别的情况:

这个时候如果期望达到更好的识别效果,可能需要去自己训练模型(https://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)或者做一些图片的预处理使图片更容易识别、调节detectMultiScal函数中的各个参数来达到期望的效果。

 

Warning:由于级联分类器使用的是机器学习算法,所以不能期望它达到100%的正确率,但是大多数情况下是可以达到一个不错的效果。

 

当然,这个级联分类器并不是只可以检测人脸,加载不同的模型,就可以检测不同的物体, 比如说喵脸:

 

 

今天就先到这里,下次再详细讲解对检测到的人脸进行人脸识别,并在图上贴上姓名标签,也就是对人脸进行分类。

 

 

  • 15
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HOG(Histogram of Oriented Gradients)和SVM(Support Vector Machine)是一种常用的目标检测方法。在Python中实现HOG和SVM目标检测的步骤可以概括为以下几个方面。 首先,需要准备正负样本数据集,保证它们的尺寸一致。正样本数据集包含了被测试物体图片,例如行人、车牌等,而负样本则不包含被检测物体图像。 其次,使用滑动窗口进行图像的分割,以便对每个窗口进行特征提取和分类器的预测。滑动窗口是一种技术,它可以在图像上滑动一个固定尺寸的窗口,以获取窗口内的图像区域。这一步还涉及到非极大值抑制操作,用于过滤掉重叠的检测框。 然后,使用HOG算法对每个窗口提取特征。HOG算法是一种基于图像梯度方向的特征描述算法,它能够有效地表示图像中的形状和纹理信息。通过计算每个窗口内部的梯度直方图,可以得到该窗口的HOG特征向量。 接下来,使用训练好的SVM模型对提取的HOG特征向量进行分类预测。SVM是一种监督学习算法,可以通过训练样本学习到一个分类器,并用于对新的样本进行分类。在Python中,可以使用scikit-learn库中的SVM模块来构建和训练SVM模型。 最后,根据SVM模型的预测结果,对图像中的目标进行检测和定位。可以根据预测结果确定目标的位置,并在图像上画出检测框来表示目标的位置和边界。 综上所述,HOG-SVM目标检测Python实现主要涉及到准备样本数据集、滑动窗口操作、HOG特征提取、SVM模型训练和预测以及目标的检测和定位。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [hog+svm图像检测流程 --python](https://blog.csdn.net/qq_43757702/article/details/123713659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值