一文看懂目标检测:从传统方法到深度学习的跨越

在计算机视觉的世界里,目标检测堪称一项 “神秘又关键” 的技术。大神 Ross Girshick 在 R-CNN 中直言,目标检测的性能近年来增长趋于平缓。这背后究竟藏着怎样的技术难题与突破?今天就带大家一探究竟!

在这里插入图片描述

一、目标检测是什么?

简单来说,目标检测就是让计算机在一张图片或一段视频里,找到我们想要的目标,不仅要精准定位目标的位置,用包围框圈出来,遇到多种类目标的场景,还得确定每个目标的类别。

和图像分类、图像分割比起来,目标检测的任务更艰巨。图像分类只需判断图片里有什么;图像分割要精确到每个像素,划分出目标区域;而目标检测既要找出目标在哪,又要判断目标是什么。

对人类来说,在图片里找个物体轻而易举,但对计算机而言,这可是个 “超级难题”!计算机看到的图像,不过是一堆复杂的多维数组,难以直接提取出高层语义信息。而且目标在图像中的位置千变万化,形态也会因视角、尺度、光照、遮挡等因素改变,再加上复杂多变的背景干扰,都让目标检测变得异常困难。就像人脸识别,哪怕一个人戴上眼镜、换了发型,人眼也能轻松认出,但计算机可能就 “犯迷糊” 了。

二、传统有监督目标检测的 “秘密武器”

传统的有监督目标检测,就像一场精密的 “技术接力赛”,主要分为训练和测试两大环节。

1. 训练环节:打造 “火眼金睛”

构建训练样本数据集:这一步就像收集 “教学素材”,需要大量的正样本(包含目标的图像)和负样本(不包含目标的图像)。这些样本可以是图像块,也可以是完整图像配上标注好的包围框。比如要训练一个检测猫的模型,就得收集各种猫咪的图片,同时也要准备大量没有猫的图片作为负样本。

提取图像特征:把收集到的样本图像,转化成计算机能理解的高维特征向量。这就好比把图像 “翻译” 成计算机熟悉的 “语言”,让计算机能从这些特征中识别目标。

训练分类器:利用正负样本的特征,构建一个判别函数。通过不断训练,在高维特征空间中形成一个超平面或曲面,用来区分目标和背景。当新的图像特征输入时,分类器就能判断它是不是我们要找的目标。

2. 测试环节:开启 “搜索模式”

获得区域建议:这是目标检测的第一步,常用的方法有滑动窗口和基于对象性的方法。

滑动窗口:就像用一个 “扫描框”,从图像的左上角开始,以固定的尺寸和步长,一格一格地在图像上滑动,每滑动一次就得到一个区域建议。这种方法简单快速,但缺点也很明显,窗口大小固定,容易把目标 “切” 得支离破碎,而且没有考虑对象性。

基于对象性:这种方法能提取出包含完整对象的区域建议,保证目标的完整性,但需要额外的计算,而且不同区域建议的尺寸差异大,需要进一步统一处理。

提取区域特征:对得到的区域建议,提取相应的特征,为后续分类做准备。

分类:把提取的特征输入训练好的分类器,判断每个区域建议里是否包含目标,以及目标的类别。

后处理(NMS):经过初步检测,结果中往往存在大量冗余的区域建议,这时候就需要非极大值抑制(NMS)来 “清理战场”。NMS 会按照类别预测得分对目标区域进行排序,先选择得分最高的区域,然后删除与该区域重叠度大于设定阈值的其他区域,重复这个过程,直到所有区域都处理完毕。比如在车辆检测中,经过 NMS 处理,就能去除重复的车辆检测框,得到准确的结果。

这里附上 numpy 版 NMS 及 IoU(交并比)计算代码,方便大家深入研究:

NMS计算代码

import numpy as np

def nms(dets, thresh):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]

    return keep

IoU计算代码


```python

```python
def iou(box1, box2):
    x1_min, y1_min, x1_max, y1_max = box1[:4]
    x2_min, y2_min, x2_max, y2_max = box2[:4]

    xA = max(x1_min, x2_min)
    yA = max(y1_min, y2_min)
    xB = min(x1_max, x2_max)
    yB = min(y1_max, y2_max)

    inter_area = max(0, xB - xA + 1) * max(0, yB - yA + 1)
    box1_area = (x1_max - x1_min + 1) * (y1_max - y1_min + 1)
    box2_area = (x2_max - x2_min + 1) * (y2_max - y2_min + 1)

    iou = inter_area / float(box1_area + box2_area - inter_area)
    return iou

三、深度学习的 “登场”

近年来,深度学习在图像分类任务中大放异彩,取得了惊人的成绩。但在目标检测领域,由于既要定位又要分类,难度更高,一直是个 “硬骨头”。直到 R-CNN 的出现,才正式开启了深度学习用于目标检测的新时代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI赋能

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值