当前位置: 首页 > news >正文

【CV 目标检测】①——目标检测概述

一、目标检测概述

1.目标检测

  • 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别(分类任务)和位置(回归任务)

  • 目标检测中能检测出来的物体取决于当前任务(数据集)需要检测的物体有哪些

  • 目标检测的位置信息一般有两种格式(以图片左上角为原点(0,0))

    • 极坐标表示:xmin, ymin, xmax, ymax分别代表x, y坐标的最小值,最大值(左上角坐标<右下角坐标)

      图像坐标系原点在左上角,把图像看作ndarray,行对应着y,列对应着x

    • 中心点坐标:x_center, y_center, w, h分别表示目标检测框的中心点坐标和目标检测框的宽,高

2.开源数据集

经典的目标检测数据集有两种,PASCAL VOC数据集MS COCO数据集

(1)PASCAL VOC数据集

PASCAL VOC是目标检测领域的经典数据集。PASCAL VOC包含约10000张带有边界框的图片用于训练和验证。PASCAL VOC数据集是目标检测问题的一个基准数据集,很多模型都是在此数据集上得到的,常用的是VOC2007和VOC2012两个版本的数据集,共20个类别,分别是:

  1. Person:person
  2. Animal:bird,cat,cow,horse,sheep
  3. Vehicle:aeroplane,bicycle,boat,bus,car,motorbike,train
  4. Indoor:bottle,chair,dining table,potted plant,soft,tv/monitor

下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/

目标位置信息 解释:

  • 0 不可用于分割
  • Frontal 物体在图片中的位置是 前面
  • Unspecified 正常拍摄 Right 物体位于右侧
  • 1 物体是截断的
  • 0 不是 难以识别的物体(若为1,则是人难以识别的物体)

(2)MS COCO数据集

  • 全称是Microsoft Common Objects in Context。COCO数据集是一个大型的丰富的物体检测,分割和字幕数据集。这个数据集以场景理解为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的分割进行位置的标定,图像包括91类目标,328000影像和2500000个label。目前为止目标检测的最大数据集,提供的类别有80类,超过33万张图片,其中20万张有标注,整个数据集中个体的数目超过150万个。
  • COCO数据集的标签文件标记了每个segmentation+bounding box的精确坐标。其精度均为小数点后两位,一个目标的标签示意如下:
  • COCO数据集的目标个数相对VOC数据集来说 要小一点
  • COCO数据集使用json文件标注目标
  • COCO数据集精细标注,即先 分割,然后再进行框选标注,总共标注了80个类别的目标

3.常用的评价指标

(1)IOU

在目标检测算法中,IOU(intersection over union,交并比)是目标检测算法中用来评价2个矩形框之间相似度的指标

IOU=两个矩形框相交的面积两个矩形框相并的面积IOU = \frac{两个矩形框相交的面积}{两个矩形框相并的面积}IOU=两个矩形框相并的面积两个矩形框相交的面积

  • IOU—>1,两个矩形框越相似;IOU—>0,两个矩形框越不相似。
  • 当IOU达到0.5,则检测效果还可以;当IOU达到0.7,则检测效果还不错。

实现方法:

def Iou(box1, box2, wh = False):if wh = False: # 使用极坐标表示xmin1, ymin1, xmax1, ymax1 = box1xmin2, ymin2, xmax2, ymax2 = box2else: # 使用中心点表示# 第一个框左上角坐标xmin1, ymin1 = int(box1[0] - box1[2]/2.0), int(box1[1] - box1[3]/2.0)# 第一个框右下角坐标xmax1, ymax1 = int(box1[0] + box1[2]/2.0), int(box1[1] + box1[3]/2.0)# 第二个框左上角坐标xmin2, ymin2 = int(box2[0] - box2[2]/2.0), int(box2[1] - box2[3]/2.0)# 第二个框右下角坐标xmax2, ymax2 = int(box2[0] + box2[2]/2.0), int(box2[1] + box2[3]/2.0)# 获取矩形框交集对应的左上角和右下角的坐标(intersection)xx1 = np.max([xmin1, xmin2])yy1 = np.max([ymin1, ymax2])xx2 = np.min([xmax1, xmax2])yy2 = np.min([ymax1, ymax2])# 计算两个矩形框的面积area1 = (xmax1 - xmin1)*(ymax1 - ymin1)area2 = (xmax2 - xmin2)*(ymax2 - ymin2)# 计算交集面积inter_area = (np.max([0, xx2 - xx1]))*(np.max([0, yy2 - yy1])) # 若xx2 - xx1小于0,则使最终结果等于0# 计算交并比iou = inter_area / (area1 + area2 - inter_area + 1e-6)return iou

示例:

import matplotlib.pyplot as plt
import matplotlib.patches as patches # 绘制矩形框
# 真实框和预测框
True_bbox, predict_bbox = [100, 35, 398, 400], [40, 150, 355, 398]
# bbox是bounding box的缩写
img = plt.imread('dog.jepg')
fig = plt.imshow(img)
# 将边界框(左上x,左上y,右下x,右下y)格式转换成为matplotlib格式:((左上x,左上y),宽,高)
# 真实框绘制
fig.axes.add_patch(plt.Rectangle(xy = (True_bbox[0], True_bbox[1]), width = True_bbox[2] - True_bbox[0], height = True_bbox[3] - True_bbox[1], fill = False, edgecolor = 'blue',linewidth = 2)
)
# 预测框绘制
fig.axes.add_patch(plt.Rectangle(xy = (predict_bbox[0], predict_bbox[1]), width = predict_bbox[2] - predict_bbox[0], height = predict_bbox[3] - predict_bbox[1], fill = False, edgecolor = 'red',linewidth = 2)
)# 计算iou
Iou(True_bbox, predict_bbox)

(2)mAP(Mean Average Precision)

目标检测问题中的每个图片都可能包含一些不同类别的物体,需要评估模型的物体分类和定位性能(只有物体分类:准确率;只有定位性能:IOU)。因此,用于图像分类问题的标准指标precision不能直接应用于此

A、mAP计算方法

TP,FP,FN,TN

  • True Positive(TP):IOUIOUIOUIOUthresholdIOU_{threshold}IOUthreshold一般取0.5)的检测框数量(同一Ground Truth 只计算一次)
  • False Positive(FP):IOU≤IOUthresholdIOU \le IOU_{threshold}IOUIOUthreshold的检测框的数量,或者检测到同一个GT的多余检测框的数量
  • False Negative(FN):没有检测到的GT数量
  • True Negative(TN):在MAP评价指标中不会使用到

查准率,查全率

  • 查准率(Precision):TPTP+FP\frac{TP}{TP+FP}TP+FPTP
  • 查全率(Recall):TPTP+FN\frac{TP}{TP+FN}TP+FNTP

P-R曲线

查准率和查全率两者绘制的曲线即为P-R曲线

AP(average precision)

AP是PR曲线下的面积

mAP

mAP是多个分类任务的AP的平均值

B、mAP计算示例

其中all detections代表所有预测框的数量,all ground truths代表所有GT的数量

Precision=TPTP+FP=TPalldetectionsPrecision = \frac{TP}{TP+FP}=\frac{TP}{all\,detections}Precision=TP+FPTP=alldetectionsTP

Recall=TPTP+FN=TPallgroundtruthsRecall = \frac{TP}{TP+FN} = \frac{TP}{all\,ground\,truths}Recall=TP+FNTP=allgroundtruthsTP

AP是计算某一类P-R曲线下的面积,mAP则是计算所有类别P-R曲线下面积的平均值

解释:

  • 当一个GT有多个预测边框时,则认为其中IOU最大的并且IOU≥0.3IOU \ge 0.3IOU0.3的标记为TP,其余的均标记为FP
  • IOU—>1,则预测边框与GT越相似;反之,则越不相似

先计算出P-R曲线上各个点的坐标(注意:需要根据置信度从大到小排序所有的预测框)

  • ACC TP:从第一个检测结果到当前行的所有 TP 的总和,用于计算累积的精确率(Precision)和召回率(Recall)
  • ACC FP:从第一个检测结果到当前行的所有 FP 的总和,同样用于计算累积的精确率和召回率

然后就可以绘制出P-R曲线

得到P-R曲线之后就可以计算AP(P-R曲线下的面积),有两种方法:

  • 在VOC2010以前,只需要选取当Recall≥0,0.1,0.2,…,1Recall \ge 0, 0.1, 0.2,\dots,1Recall0,0.1,0.2,,1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值,取11个点[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1][0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1][0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]的插值所得

得到一个类别的AP结果如下:

AP=111∑r∈0,0.1,0.2,⋯,1ρinterp(r)AP = \frac{1}{11}\sum_{r \in 0, 0.1,0.2, \cdots, 1} \rho_{interp}(r)AP=111r0,0.1,0.2,,1ρinterp(r)

AP=111(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0)AP = \frac{1}{11}(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0)AP=111(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0)
AP=26.84%AP = 26.84\%AP=26.84%

要计算mAP,就把所有类别的mAP计算出来,然后取平均即可

  • 在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取大于等于这些Recall值时对应的Precision最大值,如下图所示:

然后就可以计算PR曲线下面积作为AP值:

AP=A1+A2+A3+A4AP = A_1+A_2+A_3+A_4AP=A1+A2+A3+A4

A1=(0.0666−0)×1=0.0666A_1 = (0.0666-0)\times1= 0.0666A1=(0.06660)×1=0.0666

A2=(0.1333−0.0666)×0.6666=0.04446222A_2 =(0.1333-0.0666)\times0.6666 = 0.04446222A2=(0.13330.0666)×0.6666=0.04446222

A3=(0.4−0.1333)×0.4285=0.11428095A_3 = (0.4-0.1333)\times0.4285 = 0.11428095A3=(0.40.1333)×0.4285=0.11428095

A4=(0.4666−0.4)×0.3043=0.02026638A_4 = (0.4666-0.4)\times0.3043=0.02026638A4=(0.46660.4)×0.3043=0.02026638

AP=0.0666+0.04446222+0.11428095+0.02026638AP = 0.0666+0.04446222+0.11428095+0.02026638AP=0.0666+0.04446222+0.11428095+0.02026638

AP=0.24560955AP = 0.24560955AP=0.24560955

AP=24.56%AP = 24.56\%AP=24.56%

http://www.lryc.cn/news/617422.html

相关文章:

  • 【Oracle】如何使用DBCA工具删除数据库?
  • 低延迟RTSP|RTMP视频链路在AI驱动无人机与机器人操控中的架构实践与性能优化
  • 排序与查找,简略版
  • 简单清晰的讲解一下RNN神经网络
  • 常用设计模式系列(十九)- 状态模式
  • EI检索-学术会议 | 人工智能、虚拟现实、可视化
  • 揭开内容分发网络(CDN)的神秘面纱:互联网的隐形加速器
  • 武汉火影数字|VR大空间是什么?如何打造VR大空间项目
  • 【线性基】 P3857 [TJOI2008] 彩灯|省选-
  • 第16届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年10月20日真题
  • 【14-模型训练细节】
  • 基于Android的小区车辆管理系统
  • 让AI应用开发更简单——蚂蚁集团推出企业级AI集成解决方案
  • 论文中PDF的公式如何提取-公式提取
  • 闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计
  • 覆盖近 1.5 万个物种,谷歌 DeepMind 发布 Perch 2.0,刷新生物声学分类检测 SOTA
  • 国内 Mac 开启 Apple Intelligence 教程
  • 【C++】哈希表的实现(unordered_map和unordered_set的底层)
  • Redis实现排行榜
  • 2025年渗透测试面试题总结-14(题目+回答)
  • 【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
  • 简单的身份验证中间件Tinyauth
  • 如何使用 Watchtower 实现定时更新 docker 中的镜像并自动更新容器(附 schedule 的参数详细解释)
  • 京东商品评论API秘籍!轻松获取商品评论数据
  • Go 语言三大核心数据结构深度解析:数组、切片(Slice)与映射(Map)
  • 【JSON】通俗易懂的JSON介绍
  • LangChain 框架 Parser 讲解
  • Spring Framework源码解析——InitializingBean
  • 基于数据结构用java实现二叉树的排序器
  • 零基础AI编程开发微信小程序赚流量主广告实战