首页 > 其他分享 >5.1 目标检测基本概念和YOLOv3设计思想

5.1 目标检测基本概念和YOLOv3设计思想

时间:2024-07-15 11:01:57浏览次数:17  
标签:候选 5.1 plt YOLOv3 检测 物体 Anchor 区域 基本概念

5.1 目标检测基本概念和YOLOv3设计思想

对计算机而言,能够“看到”的是图像被编码之后的数字,但它很难理解高层语义概念,比如图像或者视频帧中出现的目标是人还是物体,更无法定位目标出现在图像中哪个区域。目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框,标示出每个目标的位置,如图1所示。

图1:图像分类和目标检测示意图。(a)是图像分类任务,只需识别出这是一张斑马的图片。(b)是目标检测任务,不仅要识别出这是一张斑马的图片,还要标出图中斑马的位置。

5.1.1目标检测发展历程

在上一节中我们学习了图像分类处理基本流程,先使用卷积神经网络提取图像特征,然后再用这些特征预测分类概率,最后选出概率最大的类别,即为当前图片的类别,流程如图2所示。

图2:图像分类流程示意图

但对于目标检测问题,按照图2的流程则行不通。因为在图像分类任务中,对整张图提取特征的过程中体现出不同目标之间的区别,最终也就没法分别标示出每个物体所在的位置。

为了解决这个问题,结合图片分类任务取得的成功经验,我们可以将目标检测任务进行拆分。假设我们现在有某种方式可以在输入图片上生成一系列可能包含物体的区域,这些区域称为候选区域,在一张图上可以生成很多个候选区域。然后对每个候选区域,可以把它单独当成一幅图像来看待,使用图像分类模型对它进行分类,看它属于哪个类别或者背景(即不包含任何物体的类别)。

上一节我们学过如何解决图像分类任务,使用卷积神经网络对一幅图像进行分类不再是一件困难的事情。那么,现在问题的关键就是如何产生候选区域?比如我们可以使用穷举法来产生候选区域,如图3所示。

图3:候选区域

A为图像上的某个像素点,B为A右下方另外一个像素点,A、B两点可以确定一个矩形框,记作AB。

  • 如图3(a)所示:A在图片左上角位置,B遍历除A之外的所有位置,生成矩形框A1B1, …, A1Bn, …
  • 如图3(b)所示:A在图片中间某个位置,B遍历A右下方所有位置,生成矩形框AkB1, …, AkBn, …

当A遍历图像上所有像素点,B则遍历它右下方所有的像素点,最终生成的矩形框集合{AiBj}将会包含图像上所有可以选择的区域

研究员开始思考,是否可以应用传统图像算法先产生候选区域,然后再用卷积神经网络对这些区域进行分类?只要我们对每个候选区域的分类足够的准确,则一定能找到跟实际物体足够接近的区域来。穷举法也许能得到正确的预测结果,但其计算量也是非常巨大的,其所生成的总候选区域数目约为W^2*H^2/4,假设H=W=100,总数将会达到2.5×10^7个,如此多的候选区域使得这种方法几乎没有什么实用性。但是通过这种方式,我们可以看出,假设分类任务完成的足够完美,从理论上来讲检测任务也是可以解决的,亟待解决的问题是如何设计出合适的方法来产生候选区域。

需要关注两点,一个是产生候选区域的方法,另一个是提升候选区域分类效率。目标检测算法就是解决这类问题的,图4给出了基于深度学习的目标检测算法,主要分为Anchor-Based和Anchor-Free,其中Anchor-Based方法又可以分为两阶段检测算法和单阶段检测算法。

图4:目标检测算法

其中,Anchor(锚框)指人为预先设定好比例的一组候选框集合。

Anchor-Based使用Anchor提取候选目标框,然后在特征图上的每一个点,对Anchor进行分类和回归。两阶段检测算法先使用Anchor在图像上产生候选区域,划分前景和背景,再对候选区域进行分类并预测目标物体位置。典型的两阶段检测算法是R-CNN系列(Fast R-CNN、Faster R-CNN等),经典的Faster R-CNN通过RPN(Region Proposal Network)学习候选区域(Region Propposal, RP),再对候选区域进行分类和回归,输出最终目标框和类别。

基于先产生候选区域再检测的两阶段模型通常具有较优的精度,但是预测速度较慢。

此外,Anchor-Based还有一些单阶段模型,这类模型在产生候选区域的同时即可预测出物体类别和位置,不需要分成两阶段来完成检测任务。

典型的单阶段算法是YOLO系列(YOLOV2、YOLOv3、YOLOv4、PP-YOLO、PP-YOLOV2等)。单阶段算法摒弃两阶段算法中的RPN产生候选区域这一步骤,将候选区域和检测两个阶段合二为一,使得网络结构更加简单,检测速度快。

但是Anchor-Based方法在实际应用中存在一些缺点,比如:手工设计Anchor需要考虑Anchor的数量、尺寸(长宽比);在特征图上像素点密集滑动会生成的检测框会存在大量负样本区域,就需要考虑正负样本不均衡的问题;Anchor的设计导致网络超参数变多,模型学习比较困难;更换不同的数据集需要重新调整Anchor。因此研究者提出了Anchor-Free方法,不再使用预先设定Anchor,通常通过预测目标的中心或角点,对目标进行检测。包含基于中心区域预测的方法(FCOS、CenterNet等)和基于多关键点联合表达的方法(CorNert、RepPoints等)。Anchor-Free算法不再需要设计Anchor,模型更为简单,减少模型耗时,但是精度也比Anchor-Based方法精度低。

三类算法的对比如下图所示:

图5:目标检测算法对比

5.1.2 目标检测基础概念

在介绍目标检测算法之前,先介绍一些跟检测相关的基本概念,包括边界框、锚框、交并比、非极大值抑制等。

5.1.2.1 边界框(Bounding Box,BBox)

检测任务需要同时预测物体的类别和位置,因此需要引入一些跟位置相关的概念。通常使用边界框(bounding box,bbox)来表示物体的位置,边界框是正好能包含物体的矩形框,如图6所示,图中3个人分别对应3个边界框。

图6:边界框

通常有两种格式来表示边界框的位置:

在检测任务中,训练数据集的标签里会给出目标物体真实边界框所对应的(x1,y1,x2,y2),这样的边界框也被称为真实框(ground truth box),如图5所示,图中画出了3个人像所对应的真实框。模型会对目标物体可能出现的位置进行预测,由模型预测出的边界框则称为预测框(prediction box)。


注意:

  1. 在阅读代码时,请注意使用的是哪一种格式的表示方式。
  2. 图片坐标的原点在左上角, x轴向右为正方向, y轴向下为正方向。

要完成一项检测任务,我们通常希望模型能够根据输入的图片,输出一些预测的边界框,以及边界框中所包含的物体的类别或者说属于某个类别的概率,例如这种格式:[L,P,x1,y1,x2,y2],其中L是类别标签,P是物体属于该类别的概率。一张输入图片可能会产生多个预测框,本章的核心是学习如何完成这项任务。

5.1.2.2 锚框(Anchor box)

锚框与物体边界框不同,是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。在下图中,以像素点[300, 500]为中心可以使用下面的程序生成3个框,如运行如下代码结果图中蓝色框所示,其中锚框A1跟人像区域非常接近。

In [2]

# 画图展示如何绘制边界框和锚框
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.patches as patches
from matplotlib.image import imread
import math

# 定义画矩形框的程序    
def draw_rectangle(currentAxis, bbox, edgecolor = 'k', facecolor = 'y', fill=False, linestyle='-'):
    # currentAxis,坐标轴,通过plt.gca()获取
    # bbox,边界框,包含四个数值的list, [x1, y1, x2, y2]
    # edgecolor,边框线条颜色
    # facecolor,填充颜色
    # fill, 是否填充
    # linestype,边框线型
    # patches.Rectangle需要传入左上角坐标、矩形区域的宽度、高度等参数
    rect=patches.Rectangle((bbox[0], bbox[1]), bbox[2]-bbox[0]+1, bbox[3]-bbox[1]+1, linewidth=1,
                           edgecolor=edgecolor,facecolor=facecolor,fill=fill, linestyle=linestyle)
    currentAxis.add_patch(rect)
    
plt.figure(figsize=(10, 10))

filename = '/home/aistudio/work/images/section3/000000086956.jpg'
im = imread(filename)
plt.imshow(im)

# 使用xyxy格式表示物体真实框
bbox1 = [214.29, 325.03, 399.82, 631.37]
bbox2 = [40.93, 141.1, 226.99, 515.73]
bbox3 = [247.2, 131.62, 480.0, 639.32]

currentAxis=plt.gca()

draw_rectangle(currentAxis, bbox1, edgecolor='r')
draw_rectangle(currentAxis, bbox2, edgecolor='r')
draw_rectangle(currentAxis, bbox3,edgecolor='r')

# 绘制锚框
def draw_anchor_box(center, length, scales, ratios, img_height, img_width):
    """
    以center为中心,产生一系列锚框
    其中length指定了一个基准的长度
    scales是包含多种尺寸比例的list
    ratios是包含多种长宽比的list
    img_height和img_width是图片的尺寸,生成的锚框范围不能超出图片尺寸之外
    """
    bboxes = []
    for scale in scales:
        for ratio in ratios:
            h = length*scale*math.sqrt(ratio)
            w = length*scale/math.sqrt(ratio) 
            x1 = max(center[0] - w/2., 0.)
            y1 = max(center[1] - h/2., 0.)
            x2 = min(center[0] + w/2. - 1.0, img_width - 1.0)
            y2 = min(center[1] + h/2. - 1.0, img_height - 1.0)
            print(center[0], center[1], w, h)
            bboxes.append([x1, y1, x2, y2])

    for bbox in bboxes:
        draw_rectangle(currentAxis, bbox, edgecolor = 'b')

img_height = im.shape[0]
img_width = im.shape[1]        
draw_anchor_box([300., 500.], 100., [2.0], [0.5, 1.0, 2.0], img_height, img_width)


################# 以下为添加文字说明和箭头###############################

plt.text(285, 285, 'G1', color='red', fontsize=20)
plt.arrow(300, 288, 30, 40, color='red', width=0.001, length_includes_head=True, \
         head_width=5, head_length=10, shape='full')

plt.text(190, 320, 'A1', color='blue', fontsize=20)
plt.arrow(200, 320, 30, 40, color='blue', width=0.001, length_includes_head=True, \
         head_width=5, head_length=10, shape='full')

plt.text(160, 370, 'A2', color='blue', fontsize=20)
plt.arrow(170, 370, 30, 40, color='blue', width=0.001, length_includes_head=True, \
         head_width=5, head_length=10, shape='full')

plt.text(115, 420, 'A3', color='blue', fontsize=20)
plt.arrow(127, 420, 30, 40, color='blue', width=0.001, length_includes_head=True, \
         head_width=5, head_length=10, shape='full')

#draw_anchor_box([200., 200.], 100., [2.0], [0.5, 1.0, 2.0])    
plt.show()

300.0 500.0 282.84271247461896 141.4213562373095

300.0 500.0 200.0 200.0

300.0 500.0 141.42135623730948 282.842712474619

<Figure size 720x720 with 1 Axes>

在目标检测任务中,通常会以某种规则在图片上生成一系列锚框,将这些锚框当成可能的候选区域。模型对这些候选区域是否包含物体进行预测,如果包含目标物体,则还需要进一步预测出物体所属的类别。还有更为重要的一点是,由于锚框位置是固定的,它不大可能刚好跟物体边界框重合,所以需要在锚框的基础上进行微调以形成能准确描述物体位置的预测框,模型需要预测出微调的幅度。在训练过程中,模型通过学习不断的调整参数,最终能学会如何判别出锚框所代表的候选区域是否包含物体,如果包含物体的话,物体属于哪个类别,以及物体边界框相对于锚框位置需要调整的幅度。

不同的模型往往有着不同的生成锚框的方式,在后面的内容中,会详细介绍YOLOv3算法里面产生锚框的规则,理解了它的设计方案,也很容易类推到其它模型上。

标签:候选,5.1,plt,YOLOv3,检测,物体,Anchor,区域,基本概念
From: https://blog.csdn.net/m0_67184231/article/details/140389174

相关文章

  • 监狱AI视频分析监控算法方案 YOLOv3
    监狱AI视频分析监控算法方案可以对现场人员行为及物体状态进行实时分析识别,监狱AI视频分析监控算法方案对监控画面中特殊区域入侵监测、睡岗脱岗监测、越界监测、人员异常徘徊监测、视频骤变监测、攀高识别、跌倒检测、夜间起床识别、打架斗殴检测、异常速度监测、遗留物监测等......
  • 5.1编写ansibleplaybook批量安装二进制
    本节重点介绍:ansibleplaybook编写rsyslog和logrotateservice_deployyaml的编写配置机器直接的ssh免密码登录节点主机名host解析节点主机名写入hostsecho"192.168.3.200prome-master01">>/etc/hostsecho"192.168.3.201prome-node01">>/etc/hosts......
  • Git 的基本概念和使用方式
    Git是一种分布式版本控制系统,它被广泛应用于软件开发和其他需要版本控制的领域。Git由LinusTorvalds在2005年创建,最初是为了帮助管理Linux内核的源代码。Git的设计旨在提供高性能、数据完整性以及支持非线性开发流程的能力。Git的基本概念仓库(Repository):Git仓......
  • WCP知识管理系统-免费版(v5.1.9)
    5.1.9版本(最新)下载地址登录官网查看功能描述CP知识分享平台V5.1.9版本的更新日志,包含了bug修复、性能优化和新功能的介绍。以下是具体细节:1.**Bug修复**:-在纯图片模式下,点击图片后现在会展示原图而非缩略图。-帮助主题下的首页缩放后,不再显示下方的大块黑边......
  • Git 的基本概念和使用方式
    Git是一个版本控制系统,它可以跟踪和管理代码的修改历史。下面是Git的一些基本概念和使用方式的解释:仓库(Repository):Git仓库是存储代码的地方。可以在本地计算机上创建一个本地仓库,也可以在代码托管平台(如GitHub、Bitbucket)上创建一个远程仓库。仓库可以包含代码及其历史记录。......
  • Python爬虫(1-4)-基本概念、六个读取方法、下载(源代码、图片、视频 )、user-agent反爬
    Python爬虫一、爬虫相关概念介绍1.什么是互联网爬虫如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据解释1:通过一个程序,根据URL进行爬取网页,获取有用信息解释2:使用程序模拟浏览器,去向服......
  • 性能测试的基本概念
    性能测试:不再像功能测试一样单纯的找Bug,而是去找性能指标。转变思维:在做功能测试、自动化测试时,我们基本都是依托界面进行测试,也称GUI测试,我们的目的就是为了跑通功能、程序,并成功找到Bug。但在做性能测试时,我们大部分是headless模式(所谓的:无头,无界面模式),目的不再是单纯......
  • 无名管道间父进程与子进程间的通信(含管道基本概念与特点)
    管道1.管道概念2.本质内核缓冲区伪文件-不会占用磁盘空间3.特点两部分:读端,写端,对应两个文件描述符数据写端流入,读端流出操作管理的进程被摧毁后,管道自动被释放管道默认是阻塞的4.管道的原理内部实现方式:队列环形队列:先进先出缓冲区大小默认为4k大小会根据实际情况做......
  • 5.1 构建发布工具集成
    安装完成后,配置管理工具安装并配置gityum-yinstallgit 编辑git环境变量为/usr/bin/git安装并配置mavenwgethttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar-xvfapache-maven-3.6.3-bin.tar.gzm......
  • 高空作业安全绳穿戴识别系统 YOLOv3
    高空作业安全绳穿戴识别系统利用作业现场已有的摄像头,高空作业安全绳穿戴识别系统通过计算机视觉+视频ai分析技术,对高空作业人员进行实时监测。当高空作业安全绳穿戴识别系统检测出相关人员在高空作业未佩戴安全绳时,系统立即预警提醒,并把报警记录储存在服务器数据库中,同步将信......