前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快乐学AI系列——计算机视觉(3)目标检测

快乐学AI系列——计算机视觉(3)目标检测

原创
作者头像
MATRIX.矩阵之芯
发布2023-03-30 22:02:43
6330
发布2023-03-30 22:02:43
举报
文章被收录于专栏:快乐学AI系列快乐学AI系列

本系列是由“MATRIX.矩阵之芯”精炼的AI快速入门系列,特色是内容简洁,学习快速。

相关要求:学员需要掌握Python编程基础,另外还需要有一定的线性代数、概率论基础。

第三章 目标检测

目标检测是计算机视觉领域中的一个重要问题,它旨在识别图像中的特定物体并确定其位置。目标检测在许多应用领域中都有广泛的应用,如智能交通、安全监控、医学影像分析等。

目标检测基础知识

目标检测和目标识别都是计算机视觉领域中的重要问题,但它们之间有着明显的区别。

目标识别是指在给定的图像中找到特定物体的位置并对其进行分类,例如在一张图片中找到猫的位置并判断它是否是一只猫。目标检测则更进一步,不仅要找到物体的位置和类别,还要确定该物体在图像中的具体位置和大小,例如在一张图片中找到多只猫的位置和大小。

代码语言:javascript
复制
import cv2

# 加载Haar级联分类器
'''
Haar级联分类器是一种基于Haar特征的对象检测算法,由Paul Viola和Michael Jones在2001年提出。
它通过训练一个多层级联的分类器来检测图像中的目标物体。
每一层级联中包含多个分类器,每个分类器都是由若干个Haar-like特征组成的,这些特征可以描述
目标物体的形状和纹理等特征。级联的分类器能够在快速准确地检测目标物体的同时,保证运行速度
的效率。
Haar级联分类器在目标检测领域有着广泛的应用,例如人脸检测、车辆检测等。
本案例中识别猫的分类器文件是haarcascade_frontalcatface.xml,该文件可以在OpenCV官方GitHub仓库中获取:
具体操作步骤如下:
1、访问OpenCV官方GitHub仓库 https://github.com/opencv/opencv
2、进入/data/haarcascades目录
3、找到名为haarcascade_frontalcatface.xml的文件并下载到本地即可
注意:如果您使用的是Windows操作系统,也可以在OpenCV安装目录下的\data\haarcascades目录中找到该文件。
'''
cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')

# 加载图像
img = cv2.imread('cat.jpg')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测猫的位置和大小
cats = cat_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

# 在图像中绘制矩形框表示猫的位置和大小
for (x, y, w, h) in cats:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果图像
cv2.imshow('Cat Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

目标检测任务通常可以分为两类:两阶段目标检测和单阶段目标检测。

两阶段目标检测指的是先利用一些方法生成一些候选框,再对这些候选框进行分类和回归。常见的两阶段目标检测算法包括R-CNN系列、Fast R-CNN、Faster R-CNN等。

单阶段目标检测则是直接对图像进行分类和回归,不需要生成候选框。常见的单阶段目标检测算法包括YOLO系列、SSD、RetinaNet等。

目标检测算法的评价指标通常包括精度和速度两个方面。精度方面的指标包括准确率(Precision)、召回率(Recall)、平均精度(mAP)等。速度方面的指标包括算法的运行时间和帧率等。

基于传统机器学习的目标检测算法

  • 滑动窗口法

滑动窗口法是一种常见的目标检测方法。其基本思想是将一个固定大小的窗口在图像上以一定的步长进行滑动,并在每个窗口位置处使用分类器判断窗口中是否包含目标物体。如果是,就返回该窗口的位置和大小作为目标的检测结果。

滑动窗口法的优点在于实现简单,可以用于检测各种不同种类的目标物体,但是其缺点也比较明显,例如计算量大、容易出现误检和漏检等问题。因此,滑动窗口法常常被用作目标检测算法的一部分,而不是完整的算法。

下图案例就是一个一个格子去找猫:

代码语言:javascript
复制
import cv2

# 读入图像
img = cv2.imread('cat.jpg')

# 加载Haar级联分类器
cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')

# 设置滑动窗口大小和步长
win_size = (100, 100)
step_size = 20

# 复制原图像用于绘制矩形框和虚线框
draw_img = img.copy()

# 记录窗口编号
win_num = 0

# 滑动窗口遍历图像
for y in range(0, img.shape[0] - win_size[1], step_size):
    for x in range(0, img.shape[1] - win_size[0], step_size):
        # 定义滑动窗口区域
        window = (x, y, win_size[0], win_size[1])

        # 绘制矩形框和虚线框
        cv2.rectangle(draw_img, (x, y), (x + win_size[0], y + win_size[1]), (255, 255, 255), 1, cv2.LINE_8)
        cv2.rectangle(draw_img, (x, y), (x + win_size[0], y + win_size[1]), (0, 255, 0), 2, cv2.LINE_8)
        cv2.putText(draw_img, str(win_num), (x + 10, y + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv2.LINE_AA)

        # 对滑动窗口区域进行目标检测
        cat_rects = cat_cascade.detectMultiScale(img[y:y+win_size[1], x:x+win_size[0]], scaleFactor=1.05, minNeighbors=3)

        # 如果检测到猫,则在原图像和绘制图像中绘制矩形框
        if len(cat_rects) > 0:
            cat_rect = cat_rects[0]
            cat_x, cat_y, cat_w, cat_h = cat_rect
            cv2.rectangle(img, (x+cat_x, y+cat_y), (x+cat_x+cat_w, y+cat_y+cat_h), (0, 0, 255), 2, cv2.LINE_8)
            cv2.rectangle(draw_img, (x+cat_x, y+cat_y), (x+cat_x+cat_w, y+cat_y+cat_h), (0, 255, 0), 2, cv2.LINE_8)

        # 更新窗口编号
        win_num += 1

# 显示结果图像
cv2.imshow('result', draw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 图像金字塔

在目标检测中,物体的大小、形状和方向等都是不确定的,因此需要对不同尺度和旋转的物体进行检测。而图像金字塔则是解决这个问题的重要方法之一。

图像金字塔是一种多分辨率表示方法,它采用了类似于自然界中金字塔的层次结构。在计算机视觉中,图像金字塔是由同一幅图像不同尺度的副本组成的。高斯金字塔是最常用的图像金字塔类型之一,它是通过对原始图像进行逐级下采样得到的,每一层的尺度比上一层小一倍。另外还有拉普拉斯金字塔、DoG(差分金字塔)等其他类型的图像金字塔。

使用图像金字塔可以在不同尺度上搜索目标物体,具体的流程是:首先在高斯金字塔的最底层对图像进行检测,然后在逐层上采样的金字塔上搜索,直到找到目标物体或者搜索到金字塔的最顶层。

在目标检测中,图像金字塔的应用可以通过对图像金字塔上的每个尺度进行滑动窗口来实现对目标物体的检测。与单一尺度下的检测相比,图像金字塔能够提高物体的检测率,同时也会增加计算量和检测时间。

理解图像金字塔的参考代码:

代码语言:javascript
复制
import cv2

img = cv2.imread('cat.jpg')

# 创建一个空列表来保存图像金字塔
pyramid = []

# 加入原图像
pyramid.append(img)

# 生成图像金字塔
while True:
    # 缩小图像
    img = cv2.pyrDown(img)
    # 如果图像大小小于30*30,停止金字塔生成
    if img.shape[0] < 30 or img.shape[1] < 30:
        break
    # 加入金字塔
    pyramid.append(img)

# 叠加图像金字塔
for i in range(len(pyramid)):
    # 缩放金字塔中的图像
    resized = cv2.resize(pyramid[i], (500, 500), interpolation=cv2.INTER_NEAREST)
    # 绘制边框和标号
    cv2.rectangle(resized, (0, 0), (499, 499), (0, 255, 0), 2)
    cv2.putText(resized, f"{i}", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    # 叠加图像
    if i == 0:
        result = resized
    else:
        result = cv2.addWeighted(result, 0.5, resized, 0.5, 0)

# 显示结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Haar、HOG、LBP等特征的应用

特征是目标检测中非常重要的一环。Haar、HOG和LBP都是常用的特征描述方法,它们的应用广泛,具有很高的准确性和效率。

  • Haar特征的应用

Haar特征是一种用于目标检测的特征描述方法。它可以对图像中的目标物体进行较为精确的识别和定位。Haar特征是通过计算图像中不同位置的像素值之和来获取的,可以分为基础特征、组合特征和级联特征三种类型。Haar特征的优点在于特征提取速度快,且对光照、旋转、缩放等变换有一定的容忍度。

Haar特征在目标检测中的应用非常广泛,其中最具代表性的就是Viola-Jones人脸检测算法。该算法通过Haar特征的计算和Adaboost算法的训练,可以实现对人脸的快速检测和识别。

  • HOG特征的应用

HOG(Histogram of Oriented Gradients)特征是一种用于图像识别的特征描述方法。它通过计算图像中每个像素点的梯度方向和梯度大小来构建直方图,然后将直方图作为图像的特征向量。HOG特征具有旋转不变性和光照不变性等特点,可以有效地应用于目标检测和识别中。

HOG特征在目标检测中的应用非常广泛,如人脸检测、车辆检测等。其中,最具代表性的是Dalal和Triggs提出的基于HOG特征的行人检测算法。该算法通过提取图像中的HOG特征,并结合SVM分类器进行训练和识别,可以实现对行人的快速检测和识别。

  • LBP特征的应用

LBP(Local Binary Pattern,局部二值模式)是一种常见的纹理特征描述子。LBP描述子可以对图像纹理特征进行编码,并具有旋转不变性、灰度不变性和计算效率高等优点,因此在很多计算机视觉任务中得到广泛应用。

与Haar特征和HOG特征相比,LBP特征描述子更加简单,通常可以在不需要GPU加速的情况下进行实时计算,因此在一些计算资源有限的场景下也得到了广泛应用。

LBP算法可以用于人脸识别、纹理分类、物体识别等任务。在人脸识别任务中,LBP算法通常用于提取人脸图像的纹理特征,通过比较不同人脸图像的LBP特征来进行人脸识别。

LBP效果实在不好
LBP效果实在不好

LBP算法的人脸检测准确率相对于现在的先进方法非常低。实际中我们使用其他更先进的算法来提高准确率,比如基于深度学习的人脸检测算法,如MTCNN、RetinaFace、CenterFace等。这些算法在准确率方面有着较大的提升,并且在实际应用中表现良好。

传统目标检测算法

传统目标检测算法之一是Viola-Jones算法,也称为Haar-cascade检测器。该算法是基于Haar特征和级联分类器的。

看一个例子:

代码语言:javascript
复制
import cv2

# 读入图像
img = cv2.imread('ldh.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 加载Haar-cascade分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 使用分类器检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

# 遍历每个人脸并在图像中绘制矩形
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.putText(img, 'Liu Dehua', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们首先将图像转换为灰度图像,然后使用OpenCV的CascadeClassifier类加载Haar-cascade分类器。然后,我们使用detectMultiScale函数来检测人脸,该函数返回每个检测到的人脸的矩形框的坐标。最后,我们使用rectangle函数在图像中绘制矩形,并使用putText函数添加文本“Liu Dehua”在矩形上方。

需要注意的是,由于Haar-cascade检测器的准确性相对较低,因此可能会检测到一些错误的结果或遗漏一些真实的人脸。如果需要更高的准确性和性能,请考虑使用更先进的目标检测算法,如基于深度学习的算法(例如YOLO、Faster R-CNN等)。

深度学习目标检测算法

深度学习目标检测算法在近年来取得了巨大的成功,尤其是一些基于深度学习的算法,如YOLO、Faster R-CNN等,已经成为了目标检测领域的经典算法。这些算法的主要思路是使用深度神经网络来对图像进行特征提取和分类,然后使用一些回归算法来对目标的位置进行预测。

其中,YOLO(You Only Look Once)算法是一种基于深度卷积神经网络的目标检测算法,其主要思路是将整张图像作为一个整体来进行目标检测,同时预测每个目标的类别、位置和置信度等信息,其优点是速度快、效果好,适用于实时目标检测等场景。

而Faster R-CNN则是一种基于区域提取的目标检测算法,其主要思路是使用一个卷积神经网络来提取图像的特征,然后通过一个RPN(Region Proposal Network)网络来生成候选区域,最后通过一个分类器和回归器对每个候选区域进行分类和位置回归,以得到最终的目标检测结果。相比于YOLO算法,Faster R-CNN的检测精度更高,但速度稍慢。

除了YOLO和Faster R-CNN之外,还有一些其他的深度学习目标检测算法,如SSD(Single Shot MultiBox Detector)、RetinaNet、Mask R-CNN等,它们都具有各自的优缺点,并且在不同的应用场景下表现也不同。

以下部分是扩展部分,大概了解即可:

深度神经网络是一种基于人工神经网络(Artificial Neural Network)设计的一类神经网络,其特点是具有多层的神经元结构,通常包含输入层、输出层和多个中间层。这些中间层被称为“隐藏层”,因为它们的输出不会直接对外部环境进行响应。深度神经网络的每一层都可以包含多个神经元,每个神经元都将输入信号加权后通过一个非线性激活函数进行输出。 深度神经网络的设计灵感来源于人脑神经元的结构和工作方式。通过模拟神经元之间的相互作用,深度神经网络可以通过从数据中学习表示来自动地识别特征和模式。深度神经网络在计算机视觉、自然语言处理、语音识别等领域得到了广泛应用,尤其是在目标检测、图像分类和语音识别等方面表现出了极高的准确率。 卷积神经网络(Convolutional Neural Network,CNN)是一种常用于图像、视频、音频等信号处理和分析的神经网络。与传统神经网络不同,CNN 在每个层次上使用卷积操作,以有效提取输入数据的特征,从而能够有效地对图像进行处理和分类。 卷积神经网络通常由卷积层、池化层、全连接层、激活函数等组成。其中,卷积层是卷积神经网络的核心,它利用卷积操作从输入数据中提取特征信息。池化层用于缩小卷积层的输出,从而减少网络的参数数量。全连接层在 CNN 中主要用于分类任务,将特征映射到具体的分类标签上。激活函数则用于增强网络的非线性特性,使得 CNN 能够更好地适应数据的复杂性和多样性。 卷积神经网络在图像分类、目标检测、语音识别、自然语言处理等领域具有广泛应用。例如,经典的 CNN 模型 AlexNet 在 ImageNet 数据集上的表现优异,使得深度学习在图像识别领域大放异彩。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第三章 目标检测
    • 目标检测基础知识
      • 基于传统机器学习的目标检测算法
        • Haar、HOG、LBP等特征的应用
          • 传统目标检测算法
            • 深度学习目标检测算法
            相关产品与服务
            人脸识别
            腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档