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

目标检测基本知识

计算机视觉和图像处理

  1. Tensorflow入门
  2. 深度神经网络
  3. 图像分类
  4. 目标检测
  5. 图像分割

    目标检测

    • 一、目标检测
    • 二、常用的评价指标
      • 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.kler.cn/a/317867.html

相关文章:

  • 【面试题】发起一次网络请求,当请求>=1s,立马中断
  • Qt 和 WPF(Windows Presentation Foundation)
  • C#发票识别、发票查验接口集成、电子发票(航空运输电子行程单)
  • JQuery封装的ajax
  • request爬虫库的小坑
  • Linux 进程线程间通信总结
  • 线性dp 总结详解
  • Vue3:$refs和$parent实现组件通信
  • 【树莓派】python3程序获取CPU和GPU温度
  • 无人机之战斗机的详解!
  • 单片机学到什么程度才可以去工作?
  • WebGL纹理与材质
  • 【C++二叉树】236.二叉树的最近公共祖先
  • 使用three.js+vue3完成无人机上下运动
  • 汽车售后诊断ECU参数分析
  • 寄宿制学校自闭症教育:为每个孩子创造奇迹
  • spring boot项目对接人大金仓
  • 线性代数学习笔记~
  • 初识JavaScript
  • 【图像压缩与重构】基于BP神经网络
  • 新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)
  • python request库的使用
  • 深度学习领域相关的专业术语(附带音标解释)
  • EtherCAT转Profient协议网关简述
  • MySQL函数及存储过程
  • 视频制作软件哪个好?前十名推荐!