目标检测简介-程序员宅基地

技术标签: 计算机视觉  目标检测  深度学习  

一.简介

目标检测的任务是找出图像中所有感兴趣的物体,确定它们的类别和位置。常见的基础任务分为三类:

  • 分类:判断图片或视频里面包含什么类别的目标
  • 定位:定位目标在图片中的位置
  • 检测:分类+定位,定位出这个目标的位置并判断出类别
  • 分割:分为实例分割和场景分割,判断每一个像素属于哪个

目标定位中,通常只有一个或数量固定的目标,而目标检测中出现的目标,种类和数量都不是固定的。因此目标检测比目标定位具有更大的挑战。与图像分类相比,目标检测不仅要识别图像中物体的类别,还要找到目标的位置,用矩形边界框来框选目标。目标检测方法分为两阶段目标检测单阶段目标检测方法。

1.目标检测核心问题

目标检测不仅要识别出图像的元素,还要用矩形框把目标框出来,一个图片上往往不止一个目标,并且还存在以下一些问题:

  • 目标可能出现在图像的任意位置
  • 目标可能有各种不同的大小
  • 目标可能有不同的形状

2.目标检测任务

获取图片中物体的类别和位置,即分类与定位。

物体位置,有两种表示方式:

  • (x,y,w,h):x,y是物体的中心点位置,w,h是中心点到物体宽高边界的距离。该方法叫做Bounding Box(bbox)

  • xmin,ymin,xmax,ymax:物体位置的左上角、右下角坐标

两种Bounding Box的名称:

  • Ground-Truth bounding box:图片当中真实标记的框
  • Predicted bounding box:预测时标记的框

二.评估指标

区域是从图像上截取的有可能包含目标的像素区域集合,边界框(Bounding Box)是指包含目标的矩形框。

1.IOU交并比

IOU(Intersection Over Union)用来衡量两个区域之间的重叠度,是从目标的位置角度进行考量。IOU的值为[0, 1],值越大表示目标预测越准确。

B g t B_{gt} Bgt 表示物体在图片中的真值边界框, B p B_p Bp 为模型预测的边界框,则IOU可表示为:
I O U = a r e a ( B p ∩ B g t ) a r e a ( B p ∪ B g t ) IOU=\frac{area(B_{p}\cap B_{gt})}{area(B_{p}\cup B_{gt})} IOU=area(BpBgt)area(BpBgt)
图像化表示为:

IOU代码实现:

import cv2
import numpy as np
'''
坐标轴方向
   ------X
  |
  |
  |
  Y
点的坐标 [x0,x1,x2,x3]
x0,x1----
  |      |
  |      |
  |      |
  -----x2,x3
'''

def iou_score(A,B):
    # 获取交集部分左上角LU点和右下角RD点的坐标
    # A,B哪个框的左上角坐标大,哪个就是LU
    # A,B哪个框的右下角坐标小,哪个就是RD
    LU_x = max(A[0],B[0])
    LU_y = max(A[1],B[1])
    RD_x = min(A[2],B[2])
    RD_y = min(A[3],B[3])
    # 计算交集部分的面积
    insertArea = max(0,RD_x-LU_x+1) * max(0,RD_y-LU_y+1)
    # 计算并集部分的面积
    aArea = (A[2]-A[0]+1)*(A[3]-A[1]+1)
    bArea = (B[2]-B[0]+1)*(B[3]-B[1]+1)
    unionArea = aArea+bArea-insertArea

    iou = insertArea/unionArea/1.0
    return iou


img = (np.ones((512,512,3))*255).astype(np.uint8)


A = [50,50,300,300]
B = [60,60,310,310]

cv2.rectangle(img,(A[0],A[1]),(A[2],A[3]),(0,255,0),5)
cv2.rectangle(img,(B[0],B[1]),(B[2],B[3]),(0,0,255),5)

iou = iou_score(A,B)
font = cv2.FONT_ITALIC
font_loc = (int((max(A[0],B[0])+min(A[2],B[2]))/2),int((max(A[1],B[1])+min(A[3],B[3]))/2))
cv2.putText(img,'IOU = %.2f'%iou, font_loc, font,0.9,(0,0,0),3)

cv2.imshow('image',img)
cv2.waitKey()
cv2.destroyAllWindows()

2.分类模型评估指标

假设有一个二分类模型,分类结果如下:

真实模型
True False
预测模型 Positive TP FP
Negative FN TN

T:True F:False P:Positive N:Negative

T、F代表该样本是否被正确分类,P、N代表该样本被预测为正样本还是负样本

TP(True Positives):样本为正样本,被预测为正样本,预测对了

TN(True Negatives):样本为负样本,被预测为负样本,预测对了

FP(False Positives):样本为负样本,被预测为正样本,预测错了

FN(False Negatives):样本为正样本,被预测为负样本,预测错了

分类模型最常用评估指标有以下4个,它们的值都在0-1之间,越大越好。

(1).准确率accuracy

表示所有预测结果中预测正确的结果占比。该指标适合数据均衡的情况下使用,在数据不均衡的情况下,该指标并不合适,此时应考虑精确率和召回率。
a c c u r a c y = T P + T N T P + T N + F N + F P accuracy=\frac{TP+TN}{TP+TN+FN+FP} accuracy=TP+TN+FN+FPTP+TN

(2).召回率recall

表示模型找到正例的能力,正样本被预测为正样本的数量 与 真实所有正样本的数量 之比。
r e c a l l = T P T P + F N recall=\frac{TP}{TP+FN} recall=TP+FNTP

(3).精确率precision

表示模型对于正例的判断能力,正样本被预测为正样本的数量 与 分类器认为是正样本的数量 之比。
p r e c i s i o n = T P T P + F P precision=\frac{TP}{TP+FP} precision=TP+FPTP

(4).F值

F = ( α 2 + 1 ) ∗ P ∗ R α 2 ∗ P + R F=\frac{(\alpha^2+1)*P*R}{\alpha^2*P+R} F=α2P+R(α2+1)PR

F值综合了P和R,可用于综合评价分类结果的质量,当 α = 1 \alpha=1 α=1时,被称为F1值。

(5).ROC和AUC

ROC(Receiver Operating Characteristics)和AUC(Area Under The Curve)是检查任何分类模型的最重要的评价指标之一,也可以写成AUROC(接收器工作特性下的面积)。AUC-ROC曲线是在不同阈值下分类问题的一种性能度量。ROC是概率曲线,AUC表示可分性的程度或度量。它告诉我们模型在多大程度上能够区分类别。AUC越高越好。RPC曲线用TPR(True Positive Rate)与FPR(False Positive Rate)绘制,具体步骤如下:

  • 假设共有N个样本
  • 模型对样本进行分类预测以后,每个样本都会得到一个置信度score
  • 将样本按照score降序排列
  • 计算每个样本的TP、TN、FP、FN
  • 计算每个样本的TPR和FPR

T P R = R e c a l l = T P T P + F N TPR=Recall=\frac{TP}{TP+FN} TPR=Recall=TP+FNTP

F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP
在这里插入图片描述

说明:

  • 横轴 FPR:FPR越大,预测正类中实际负类越多。

  • 纵轴 TPR:TPR越大,预测正类中实际正类越多。

  • 理想目标:TPR=1,FPR=0,即图中(0,1)点,故ROC曲线越靠拢(0,1)点,越偏离45度对角线越好。

  • 曲线面积即为AUC的值,介于0.1到1之间。

AUC计算工具:
sklearn.metrics.roc_auc_score(labels,preds,multi_class='ovo')
    multi_class 表示对类别不平衡是否敏感,'ovr'比较敏感,'ovo'不敏感

3.AP值

AP(Average Percision)表示平均精度,指的是所有图片内的具体某一类的PR曲线下的面积。具体计算方式如下:

  • 假设共有N个样本,其中有M个正样本
  • 模型对样本进行分类预测以后,每个样本都会得到一个置信度score
  • 将样本按照score降序排列
  • 对于每个recall的值,取该recall阈值时top-n所对应的最大精确率precision
  • 此时获得M对(recall, precision)值,根据这些值绘制曲线,取名为PR曲线
  • PR曲线的面积即为该类的AP值

示例

假设现有10张图像来进行目标检测,每张图像都有事先标记好的GT,每张图像上类别和目标可以有多个,不过AP是指所有图像中具体的某一类PR面积。10张图片都是动物图像,现在我们只关注猫这一类,10张图像上共有12只真实的猫。经过算法预测,每张图像都会得到相应的猫的预测框和置信度。将10张图像根据置信度降序进行排列(得分为0的剔除),再计算出每张图像的TP、FP、FN,得到了如下的结果:

ImgID Score TP FP FN
2 0.9 1 0 0
10 0.8 1 0 0
5 0.8 1 0 0
9 0.7 1 0 0
7 0.7 0 1 0
4 0.7 1 0 0
3 0.6 1 0 0
1 0.6 0 1 0
8 0.5 0 1 0
2 0.4 0 1 0

(同一张图像上可能有多个猫,所以会出现同一张图像多个置信度得分的情况)

进一步计算精确率和召回率如下:

ImgID Precision Recall Max Precision for any Recall
2 1/(1+0)=1 1/12=0.083 1
10 2/(2+0)=1 2/12=0.167 1
5 3/(3+0)=1 3/12=0.250 1
9 4/(4+0)=1 4/12=0333
7 4/(4+1)=0.8 4/12=0.333 1
4 5/(5+1)=0.833 5/12=0.417 0.833
3 6/(6+1)=0.857 6/12=0.5 0.857
1 6/(6+2)=0.75 6/12=0.5
8 6/(6+3)=0.667 6/12=0.5
2 6/(6+4)=0.6 6/12=0.5

绘制PR曲线:
在这里插入图片描述

A P = ( 0.333 − 0 ) ∗ 1 + ( 0.5 − 0.333 ) ∗ 0.857 = 0.476 AP = (0.333-0)*1+(0.5-0.333)*0.857=0.476 AP=(0.3330)1+(0.50.333)0.857=0.476

4.mAP平均精确率

mAP(mean average precision)是目标检测中度量识别精度的指标,是从分类准确与否的角度进行考量。多个类别目标检测中,每一个类别都可以根据查全率(即召回率)和查准率(即精确率)绘制P-R曲线,横坐标为查全率,纵坐标为查准率,AP值就是该曲线下的面积,而mAP就是多个类别AP的平均值。假如在上面AP的示例中,除了猫,还有狗、老虎等共C类目标,那么mAP的值的公式为:
m A P = ∑ i = 1 C A P i C mAP=\frac{\sum_{i=1}^{C}AP_i}{C} mAP=Ci=1CAPi

三.算法分类

1.两阶段目标检测方法

两阶段目标检测是基于候选区域的检测方法,采用“粗检测+精修”的流程,第一步是从图像中提取深度特征并计算候选区域,第二步是对每个候选区域进行定位(包括分类和回归)。虽然该系列检测精度较高,但在速度上较差。

(1).R-CNN

  2013年以前,目标检测大都基于手工提取特征的方法,人们大多通过在低层特征表达的基础上,构建复杂的模型及多模型集成来缓慢地提升检测精度。当CNN在2012年的ILSVRC图像分类项目上大放异彩时,人们发现CNN能够学习鲁棒性非常强且具有一定表达能力的特征表示,于是在2014年,Girshick等人提出了**R-CNN:区域卷积神经网络目标检测(regions with CNN features)**模型。自此目标检测的研究速度前所未有的提升。

  R-CNN首先在图像中选取候选区域,接着将每个候选区域送入CNN来提取特征,使用SVM将得到的特征分类,最后进行边界框的回归预测。它的优点在于将深度学习引入了目标检测,并将 Pascal VOC 2007数据集上的mAP由之前最好的35.1%提升到66.0%。缺点在于当R-CNN将候选区域送入CNN时,卷积层后全连接层的输入尺寸和输出尺寸是固定的,因此CNN也需要固定的输入尺寸,这就导致输入图像的大小不能任意调节。此外,由于候选区域可能经常重叠,将每个候选区域都送了CNN的方法会造成大量的重复计算。

(2).SPP -Net

  针对R-CNN的缺点,何凯明等人在2014年提出了SPP-Net:空间金字塔池化网络(spatial pyramid pooling networks),SPP层的每个池化过滤器都会根据输入的内容调整自身的大小,而SPP层的输出尺寸是固定的,这样就解决了图像大小不能调节的问题。同时SPP-Net只对原图进行一系列卷积操作,从而得到整幅图的特征图,然后找到每个候选框在特征图上的映射区域,将此区域作为每个候选框的卷积特征并输入SPP层和之后的层,节省了大量的计算时间。

(3).Fast R-CNN

2015年,Girshick等人在R-CNN的基础上提出了进阶版的Fast R-CNN,它使用与SPP层类似的感兴趣区域RoI池化层,通过将提取特征之后的分类步骤和边界框回归步骤添加到深度网络中进行同步训练。

与R-CNN的多阶段训练相比,Fast R-CNN的训练更加简洁、省时、省空间。Fast R-CNN的训练速度是R-CNN的9倍,检测速度是R-CNN 的200倍,并将 Pascal VOC 2007数据集上的mAP由之前的66.0%提升至70.0%。虽然Fast R-CNN在速度和精度上都有显著提升,但它需要事先使用外部算法来提取目标候选框。

(4).Faster R-CNN

在Fast R-CNN被提出不久后,Shaoqing Ren等人很快提出了Faster R-CNN模型,将提取目标候选框的步骤整合到深度网络中,Faster R-CNN是第一个真正意义上的端到端的深度学习目标检测算法,也是第一个准实时的深度学习目标检测算法,并将 Pascal VOC 2007数据集上的mAP由之前的70.0%提升至78.8%。

Faster R-CNN最大的创新在于设计了RPN:区域候选网络(region proposal network)。在2016年,Jifeng Dai等人提出了R-FCN:基于区域的全卷积网络(region based fully convolutional networks)模型,引入位置敏感的RoI池化,从而进一步提高检测的精度。

2.单阶段目标检测方法

为了使目标检测满足实时性要求,人们提出了单阶段目标检测方法,在该种方法中,不再采用“粗检测+精修”的流程,而采用“锚点+修正”的方法。这类方法只进行一次前馈网络计算,速度非常快,能达到实时效果。

(1).YOLO

2015年,Joseph和Girshick等人提出了一个仅通过一次前向传导的目标检测**YOLO(you only look once)**模型。它的优点是速度达到了45帧每秒,但缺点是网络能够检测的目标数量固定、小目标检测效果较差。

(2).SSD

Wei Liu等人在2015提出了SSD方法,该方法吸收了YOLO的快速检测思想,结合力Faster R-CNN的优点,并改善了多尺寸目标的处理方式。由于不同卷积层所包含特征的尺寸不同,SSD可以通过综合多个卷积层的检测结果来检测不同尺寸的目标。SSD使用3x3的卷积取代YOLO中的全连接层,对不同尺寸和长宽比的 default box 进行目标分类与边界框回归。SSD速度达到了58帧每秒,以及接近Faster R-CNN 的检测性能。

(3).FPN

2016年年底,Tsung-Yi Lin等人提出了FPN:特征金字塔(feature pyramid networks),FPN既可以和单阶段目标检测方法融合,也可以和两阶段目标检测方法融合。之前的特征检测方法大都是取语义信息丰富的高层卷积特征来做预测,但高层特征会导致损失一些细节信息,而且目标位置不够明确。FPN融合多层特征,综合高层、低分辨率、强语义信息及低层、高分辨率、弱语义信息,提高了网络对小目标检测的处理能力。FPN与SSD一样可以在不同的层中独立进行预测, 但多了一个上采样的过程,这使得高层特征能与低层特征融合。

(4).YOLO v2

同样在2016年年底,YOLO推出了升级版YOLO v2。在YOLO v2中,每个卷积层后添加了批标准化,提高了收敛速度,同时去掉了网络中的全连接层。

(5).RetinaNet

虽然单阶段目标检测方法在检测速度上明显高于两阶段目标检测方法,但在检测精度上,单阶段方法一直略逊于两阶段方法。Tsung-Yi Lin等人认为其原因是,单阶段方法会面临极端不平衡的目标–背景数据分布,两阶段方法可以通过候选区域过滤掉大部分背景区域,但单阶段方法需要直接面对类别的不平衡。Tsung-Yi Lin等人在2017年提出了RetianNet检测模型,通过改进经典的交叉熵损失函数,提出了聚焦损失(focal loss)函数,降低了网络训练过程中简单背景样本的学习权重。该模型可以实现对困难样本的“聚焦”和对网络学习能力的重新分配,从而使简单单阶段目标检测模型的检测速度和精度全面超过了两阶段目标检测模型。

(6).RefineDet

2017年年底,Shifeng Zhang等人提出了RefineDet模型。该模型针对SSD中存在的不平衡目标–背景数据分布问题,结合两阶段目标检测方法中过滤背景区域的优点,提出了ARM:锚框改进模型(anchor refinement module)和目标检测模块ODM:目标检测模块(object detection module)以及同于串联二者的TCB:转换连接模块(transfer connection block)

(7).YOLO v3

2018年年初,YOLO v3版本出现,用多个独立的分类器代替softmax函数,用类似金字塔网络的方法进行多尺寸预测。在此之前,各中目标检测算法都被一个问题困扰–如何检测两个距离很近的物体。绝大多数模型会将传入的数据调整到一个更低的分辨率,对这种情况给出一个目标框。YOLO v3用sigmoid函数代替softmax函数主要考虑的因素就是 softmax函数给每个边界框分配一个类别,而使用多个独立的分类器可以针对同一个边界框预测多个类别。

(8).更多YOLO版本

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_63462829/article/details/128719792

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search