使用Python,Opencv检测图像,视频中的猫

使用Python,Opencv检测图像,视频中的猫🐱

这篇博客将介绍如何使用Python,OpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫·豪斯(Joseph Howse)训练并贡献给OpenCV项目。

虽然哈尔级联非常有用,但通常使用HOG+线性SVM,因为它更容易调整检测器参数,更重要的是可以享受更低的假阳性检测率。

在haarcscades目录中(OpenCV存储所有经过预训练的Haar分类器以检测各种对象、身体部位等模型)

  • haarcascade_frontalcatface.xml
  • haarcascade_frontalcatface_extended.xml
    这俩个模型用来检测图像中的“猫脸”;

1. 效果图

单猫检测图效果图如下:
在这里插入图片描述

多猫检测效果图如下:
可以看到有的并没有检测出来,优化可以用HOG+SVG检测模型;
在这里插入图片描述

2. 原理

2.1 opecv预置的模型

使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测

在这里插入图片描述

传奇人物约瑟夫·豪斯(Joseph Howse)对级联进行了培训,并将其贡献给了OpenCV存储库,他撰写了大量关于计算机视觉的教程、书籍和演讲。

2.2 cv2.CascadeClassifer & detector.detectMultiScale

  • cv2.CascadeClassifer从磁盘加载预先训练好的Haar级联检测器:
detector = cv2.CascadeClassifier(path)
  • detectMultiScale对其进行预测:
# gray 灰度图
# scaleFactor 检测猫脸时使用的图像金字塔的scaleFactor。更大的比例因子将提高检测器的速度,但可能会损害阳性检测精度。相反,较小的规模将减缓检测过程,但会增加阳性检测。然而,这种较小的尺度也会增加假阳性检测率。
# minNeighbors参数控制给定区域中检测到的边界框的最小数量,以将该区域视为“猫脸”。此参数在修剪假阳性检测时非常有用。
# minSize参数非常简单。该值确保每个检测到的边界框至少为宽度x高度像素(在本例中为75 x 75)。
# 返回值:矩形框列表,每一个是包含4个点的tuple
results = detector.detectMultiScale(
		   gray, scaleFactor=1.05, minNeighbors=5,
		   minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
  • 注意,Haar级联按照您可能不喜欢的顺序返回边界框。 在这种情况下,中间的猫实际上被标记为第三只猫。可以通过根据边界框的(x,y)坐标对边界框进行排序来解决这个“问题”,以实现一致的排序。

  • 关于准确性的简要说明:在.xml文件的注释部分,Joseph Howe详细介绍了猫检测器Haar cascades可以在有人脸的地方报告猫的脸。在这种情况下,他建议同时执行面部检测和猫检测,然后丢弃与面部边界框重叠的任何猫边界框。

2.3 haar级联模型详解

保罗·维奥拉(Paul Viola)和迈克尔·琼斯(Michael Jones)于2001年首次发表了 《使用简单特征的增强级联快速目标检测》(Rapid Object Detection using a Boosted Cascade of Simple Features),这部原创作品已成为计算机视觉领域被引用最多的论文之一。

  • 该算法能够检测图像中的对象,而不管它们的位置和大小。该探测器可以在现代硬件上实时运行。

  • 维奥拉和琼斯专注于训练人脸检测器;然而,该框架也可用于训练检测器以识别任意“物体”,如汽车、香蕉、路标等。

  • Haar级联的最大问题是正确获取detectMultiScale参数,特别是scaleFactor和minNeighbors。很多情况需要逐个图像调整这两个参数的情况,这在使用对象检测器时远远不够理想。

    scaleFactor变量控制用于检测图像不同比例对象的图像金字塔。如果scaleFactor太大,那么将只评估图像金字塔的几个层,这可能会导致丢失位于金字塔层之间的比例的对象。
    如果将scaleFactor设置得太低,则会计算许多金字塔层。这将有助于检测图像中的更多对象,但它(1)使检测过程变慢,(2)大大提高了假阳性检测率,这是哈尔级联的著名之处。

  • 为了优化它的问题:通常使用定向梯度直方图+线性SVM检测。
    HOG+线性SVM框架参数通常更容易调整,最重要的是,HOG+线型SVM具有更小的假阳性检测率。唯一的缺点是很难让HOG+线性SVM实时运行。

3. 源码

# 使用Python,OpenCV库中的猫脸检测器对图片进行猫脸检测
# USAGE
# python cat_detector.py --image images/cat_01.jpg

# 导入必要的包
import argparse
import cv2
import imutils

# 构建命令行参数及解析
# -image 猫脸照片
# -cascade 模型文件路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
                help="path to the input image")
ap.add_argument("-c", "--cascade",
                default="haarcascade_frontalcatface_extended.xml",
                help="path to cat detector haar cascade")
args = vars(ap.parse_args())

# 加载图片,转化为灰度图
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 加载猫脸级联检测器,然后检测猫脸
detector = cv2.CascadeClassifier(args["cascade"])
# gray 灰度图
# scaleFactor 检测猫脸时使用的图像金字塔的scaleFactor。更大的比例因子将提高检测器的速度,但可能会损害阳性检测精度。
# 相反,较小的规模将减缓检测过程,但会增加阳性检测。然而,这种较小的尺度也会增加假阳性检测率。
# minNeighbors参数控制给定区域中检测到的边界框的最小数量,以将该区域视为“猫脸”。此参数在修剪假阳性检测时非常有用。
# minSize参数非常简单。该值确保每个检测到的边界框至少为宽度x高度像素(在本例中为75 x 75)。
rects = detector.detectMultiScale(gray, scaleFactor=1.3,
                                  minNeighbors=10, minSize=(75, 75))
print(len(rects))

# 遍历猫脸,并绘制矩形框
for (i, (x, y, w, h)) in enumerate(rects):
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv2.putText(image, "Cat #{}".format(i + 1), (x, y - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)

# 展示检测到的猫脸🐱
cv2.imshow("Cat Faces", imutils.resize(image,width=600))
cv2.waitKey(0)

参考

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值