目标检测基本知识

news2024/11/15 21:50:27

目标检测

  • 一、目标检测
  • 二、常用的评价指标
    • 2.1 IOU
    • 2.2 NMS(非极大值抑制)
  • 三、R-CNN网络基础
    • 3.1 Overfeat模型
    • 3.2 RCNN模型
    • 3.3FastRCNN模型
  • 四、Faster-RCNN网络
    • 4.1 网络工作流程
  • 五、yolo系列
    • 5.1 yoloV3
  • 六、SSD算法

一、目标检测

目标检测的任务是找出图像中所有感兴趣的目标,并确定它们的类别和位置。

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

  1. 极坐标表示:(xmin, ymin, xmax, ymax)
  • xmin,ymin:x,y坐标的最小值
  • xmin,ymin:x,y坐标的最大值
  1. 中心点坐标:(x_center,y_center,w, h)
  • x_center,y_center:目标检测框的中心点坐标
  • w,h:目标检测框的宽、高

目标检测算法主要分为两类:

  • Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归,two-stage的方法优势在于准确率度高;
  • One-stage方法:如YOLO系列方法,主要思路就是均匀地在图片上不同位置进行密集采样,采样时使用不同尺度和长宽比box,然后利用CNN提取特征后直接进行分类和回归,整个过程只需要一步,所以优势在于速度快。

二、常用的评价指标

2.1 IOU

I O U = 两个矩形框相交的面积 两个矩形框相并的面积 IOU={两个矩形框相交的面积 \over 两个矩形框相并的面积} IOU=两个矩形框相并的面积两个矩形框相交的面积
一般可以设置当IOU的值大于0.5的时候,则可认为检测到目标物体。

实现方法:

import numpy as np
def IOU(box1,box2,wh=False):
    if wh==False:
        # 使用极坐标表示,直接获取两个bbox的坐标
        xmin1,ymin1,xmax1,ymax1=box1
        xmin2,ymin2,xmax2,ymax2=box2
    else:
        # 获取两个bbox的极坐标表示形式
        xmin1,ymin1 = int(box1[0] - box1[2]/2.0,box1[1] - box1[3]/2.0)
        xmax1,ymax1 = int(box1[0] + box1[2]/2.0,box1[1] + box1[3]/2.0)
        xmin2,ymin2 = int(box2[0] - box2[2]/2.0,box2[1] - box2[3]/2.0)
        xmax2,ymax2 = int(box2[0] + box2[2]/2.0,box2[1] + box2[3]/2.0)
    # 获取矩形框交集对应的左上角和右下角的坐标
    xx1 = np.max([xmin1,xmin2])
    yy1 = np.max([ymin1,ymin2])
    xx2 = np.min([xmax1,xmax2])
    yy2 = np.min([ymax1,ymax2])
    # 计算两个矩形框面积
    area1 = (xmax1 - xmin1) * (ymax1 - ymin1)
    area2 = (xmax2 - xmin2) * (ymax2 - ymin2)
    # 计算交集面积
    if xx2 <= xx1 or yy2 <= yy1:
        inter_area = 0
    else:
        inter_area = (xx2-xx1)*(yy2-yy1)
    # 计算两个矩形相并的面积
    uion_area = area1 + area2 - inter_area
    # IOU
    IOU = inter_area / (uion_area+1e-6)
    return IOU
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 真实框 预测框
true_box = [120,35,270,260]
pre_box = [60,70,290,240]
img = plt.imread('./dog.jpg')
fig = plt.imshow(img)
fig.axes.add_patch(plt.Rectangle((true_box[0],true_box[1]),true_box[2]-true_box[0],true_box[3]-true_box[1],edgecolor='blue',fill=False,linewidth=2))
fig.axes.add_patch(plt.Rectangle((pre_box[0],pre_box[1]),pre_box[2]-pre_box[0],pre_box[3]-pre_box[1],edgecolor='red',fill=False,linewidth=2))

在这里插入图片描述

IOU(true_box,pre_box)

在这里插入图片描述

2.2 NMS(非极大值抑制)

非极大值抑制,顾名思义就是抑制不是极大值的元素。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。 NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D重建、目标识别以及纹理分析等 。

在目标检测中,NMS的目的就是要去除冗余的检测框,保留最好的一个。

# 非极大抑制过程
# bboxes 同类别候选框坐标,confidence_score同类别候选框分数,threshold iou阈值
def nms(bboxes,confidence_score,threshold):
    # 容错处理
    if len(bboxes)==0:
        return [],[]
    # 类型转换
    # bboxes是使用极坐标
    bboxes = np.array(bboxes)
    score = np.array(confidence_score)
    # 获取左上角和右下角坐标
    x1 = bboxes[:,0]
    y1 = bboxes[:,1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    # 计算面积
    areas = (x2-x1)*(y2-y1)
    # NMS
    picked_boxes = []
    picked_score = []
    # 排序,得到索引顺序
    order = np.argsort(score)
    while order.size>0:
        # 获取score最大的索引
        index = order[-1]
        # 保留下来
        picked_boxes.append(bboxes[index])
        picked_score.append(score[index])
        # 计算当前得分最高的框与剩余框的交集边界坐标
        x11 = np.maximum(x1[index],x1[order[:-1]])
        y11 = np.maximum(y1[index],y1[order[:-1]])
        x22 = np.minimum(x2[index],x2[order[:-1]])
        y22 = np.minimum(y2[index],y2[order[:-1]])
        # 计算相交面积,不重叠时面积为0
        w = np.maximum(0,x22-x11)
        h = np.maximum(0,y22-y11)
        inter_area = w*h
        # 计算IOU
        iou = inter_area/(areas[index]+areas[order[:-1]]-inter_area)
        # 删除冗余框,找到所有IOU小于阈值的框的索引
        keep_boxes = np.where(iou<threshold)
        # 保留剩余的框
        order = order[keep_boxes]
    return picked_boxes,picked_score
bounding = [(187,82,337,317),(150,67,305,282),(246,121,368,304)]
confidence_score = [0.9,0.65,0.8]
threshold = 0.5
box,score = nms(bounding,confidence_score,threshold)
box,score

在这里插入图片描述

三、R-CNN网络基础

3.1 Overfeat模型

Overfeat方法使用滑动窗口进行目标检测,也就是使用滑动窗口和神经网络来检测目标。滑动窗口使用固定宽度和高度的矩形区域,在图像上"滑动",并将扫描结果送入到神经网络中进行分类和回归。
这种方法类似一种暴力穷举的方式,会消耗大量计算力,并且由于窗口大小问题可能会造成效果不准确。

3.2 RCNN模型

RCNN使用候选区域方法创建目标检测的区域来完成目标检测的任务。

步骤:

  1. 候选区域生成:使用选择性搜索(Selective Search)的方法找出图
    片中可能存在目标的侯选区域
  2. CNN网络提取特征:选取预训练卷积神经网络(AlexNet或VGG)
    用于进行特征提取。
  3. 目标分类:训练支持向量机(SVM)来辨别目标物体和背景,对每个类别,都要训练一个二元SVM。
  4. 目标定位:训练一个线性回归模型,为每个辨识到的物体生成更精确
    的边界框。

3.3FastRCNN模型

步骤:

  1. 候选区域生成:使用选择性搜索(Selective Search)的方法找出图片中可能存在目标的侯选区域,只需要候选区域的位置信息
  2. CNN网络特征提取:将整张图像输入到CNN网络中,得到整副图的特征图,并将上一步获取的候选区域位置从原图映射到该特征图上
  3. ROIPooling: 对于每个特征图上候选框,RoI pooling层从特征图中提取固定长度的特征向量每个特征向量被送入一系列全连接(fc)层中。
  4. 目标检测:分两部分完成,一个输出各类别加上1个背景类别的Softmax概率估计,另一个为各类别的每一个类别输出四个实数值,来确定目标的位置信息。

四、Faster-RCNN网络

4.1 网络工作流程

FasterRCNN的工作流程:

  1. 特征提取:将整个图像缩放至固定的大小输入到CNN网络中进行特征提取,得到特征图。
  2. 候选区域提取:输入特征图,使用区域生成网络RPN,产生一些列的候选区域
  3. ROIPooling: 与Fast RCNN网络中一样,使用最大池化固定候选区域的尺寸,送入后续网络中进行处理
  4. 目标分类和回归:与Fast RCNN网络中一样,使用两个同级层:K+1个类别的SoftMax分类层和边框的回归层,来完成目标的分类和回归。

pass 不会Faster-RCNN网络的实现

五、yolo系列

YOLO(You Only Look Once)是一种实时目标检测系统。它将目标检测框架重新设计为一个回归问题,直接从图像像素回归到边界框及其类别概率。与其他一些目标检测方法不同,如R-CNN或Fast R-CNN,它们通过生成候选区域来工作,YOLO使用单个神经网络来预测对象的位置和类别,从而使其在处理速度方面具有显著优势。

5.1 yoloV3

  1. yoloV3的多尺度检测方法
    在YOLOv3中采用FPN结构来提高对应多尺度目标检测的精度,当前的feature map利用“未来”层的信息,将低阶特征与高阶特征进行融合,提升检测精度。
  2. yoloV3模型的网络结构
    以Darknet-53为基础,借鉴残差网络ResNet的思想,在网络中加入了残差模块,利于解决深层次网络的梯度问题
    整个v3结构里面,没有池化层和全连接层,只有卷积层
    网络的下采样是通过设置卷积中stride=2来达到的
  3. yoloV3模型先验框设计的方法
    采用K-means聚类得到先验框的尺寸,为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。
  4. yoloV3模型为什么适用于多标签的目标分类
    预测对象类别时不使用softmax,而是使用logistic的输出进行预测
  5. yoloV3模型的输入输出
    对于416×416×3的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13×13×3 + 26×26×3 + 52×52×3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。

六、SSD算法

SSD算法的全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。

SSD的多尺度特征图的网络中SSD提取了6个不同特征图进行目标检测。

SSD是YOLO V1出来后,YOLO V2出来前的一款One-stage目标检测器。SSD用到了多尺度的特征图,在之后的YOLO V3的darknet53中,也是用到了多尺度特征图的思想。较浅层的特征图上,每个cell的感受野不是很大,所以适合检测较小的物体,而在较深的特征图上,每个cell的感受野就比较大了,适合检测较大的物体。
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

SOMEIP_ETS_112: SD_Empty_Option

测试目的&#xff1a; 验证DUT能够拒绝长度为0的IPv4选项的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个IPv4选项长度为0的SubscribeEventgroup消息时&#xff0c;能够正…

不同编程语言如何统计代码执行时间

在软件开发过程中&#xff0c;统计代码执行时间是一个非常有用的工具&#xff0c;可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法&#xff0c;并详细解释每一步的…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

数据结构(7.3_2)——平衡二叉树

平衡二叉树&#xff0c;简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1. 结点的平衡因子左子树高-右子树高 //平衡二叉树结点 typedef struct AVLNode {int key;//数据域int blalance;//平衡因子struct AVLNode* lchild, * rchild; }AVLNode,*AVLTree; …

中秋:明月寄相思,灯笼映团圆

文章目录 前言项目概述实现步骤创建基础 HTML 结构添加动态背景和月亮创建 SVG 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋&#xff0c;这里先祝大家节日快乐&#xff01;&#x1f386;&#x1f386;&#x1f386; 在这篇博客中&…

ChatGPT有三个快捷指令和三个模式,你知道吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸&#xff0c;我们沿b边(左边)的中点与右上顶点的边折叠&#xff0c;求左上顶点在折叠以后离下边的距离&#xff1f; 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例&#xff0c;为两个整数1≤a,b≤1000。…

​FullCalendar:强大的JavaScript事件日历

​FullCalendar&#xff1a;强大的JavaScript事件日历 如果你想让项目的日历功能像你周末一样灵活又强大&#xff0c;那么 FullCalendar 就是你的不二选择&#xff01;本文将带你了解这款高效的 JavaScript 日历库的亮点与使用方式。 软件简介 FullCalendar 是一个用 JavaScri…

PMP--一模--解题--101-110

文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时&#xff0c;项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生&#xff0c;可能给最终的可交付成果带来重要…

CSS——网格布局(display: grid)之上篇

CSS——网格布局&#xff08;display: grid&#xff09; 前面介绍了弹性布局&#xff0c;今天我们介绍一下网格布局。 什么是网格布局 CSS网格布局&#xff08;CSS Grid Layout&#xff09;是一种用于创建复杂网页布局的系统&#xff0c;它允许开发者以二维系统&#xff08;…

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉&#xff0c;明日愁来明日愁 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3f…

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)

新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖&#xff08;缺点&#xff1a;浪费CPU资源&#xff…

1.使用 IDEA 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 IDEA 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&…

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)

一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一&#xff0c;空用来控制网页的行为的 xml是一种标记语言&#xff0c;是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…

Fastjson反序列化漏洞——JNDI注入

一.前言 之前使用反序列化和序列化时写入的到文件里面的&#xff0c;真实环境中&#xff0c;也是这样吗&#xff1f; 当然不是了&#xff0c;通过二进制&#xff0c;字节流数据进行的。 为什么会有JNDI&#xff1f; 由于http和ftp传输消耗资源仍然很大&#xff0c;就有了JRM…

macOS Sequoia发布:Apple又给我们带来了什么惊喜?

今天是个激动人心的日子,尤其是对于Mac用户来说,因为Apple正式发布了全新的操作系统——macOS Sequoia。作为一款专为Mac设备设计的操作系统,Sequoia不仅仅是简单的升级,它承载了Apple在系统体验上的巨大飞跃。听到这个消息,你可能会好奇,Apple这次又会带来什么样的创新?…

【Python】高效图像处理库:pyvips

月亮慢慢变圆&#xff0c;日子慢慢变甜。 在图像处理领域&#xff0c;pyvips 是一个轻量级且高效的库&#xff0c;适合处理大规模图像、实现高性能的操作。相较于其他常见的图像处理库如 PIL 或 OpenCV&#xff0c;pyvips 以其低内存占用和出色的速度脱颖而出。本文将介绍 pyv…

2024年全国大学生数学建模竞赛B题生产过程中的决策问题分析

目录 引言 问题 1&#xff1a;抽样检测方案设计 问题 2&#xff1a;生产过程中的决策 决策阶段划分 决策方案 结果 问题 3&#xff1a;多道工序和零配件的决策 生产流程 决策过程 问题 4&#xff1a;基于抽样检测的重新决策 动态调整次品率 结论 引言 在2024年全国…