深度学习-卷积神经网络-目标检测-52

1. 什么是目标检测?

找出图片中感兴趣的物体,并精确的进行分类 并标定物体的位置

目标检测中 能检测出来的物体 取决于当前任务数据集中需要检测哪些物体。
假设我们需要检测的是5种动物(牛羊猪狗猫),那么模型是不会检测出书籍,鸭子的

检测:

输出:

经典的数据集:
PASCAL VOC数据集包含10000张带有边界框的数据

MS COCO数据集
微软出资标注的数据集

2. 输出评价IoU

IoU(Intersection over Union)

Intersection over Union是一种测量在特定数据集中检测相应物体准确度的一个标准


Ground Truth是人工标定的 物体区域

Proposal和gt求的得score > 0.5 就可以被认为一个不错的结果了

selective search demo

import cv2


img = cv2.imread('crow.jpg')

# 创建selective search segmentation对象
ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()

# 输入图像
ss.setBaseImage(img)

# 设置模式为高质量模式
# ss.switchToSelectiveSearchQuality()
ss.switchToSelectiveSearchFast()

# 运行算法
print('before run ss')
rects = ss.process()
print('end run ss, rects: %s' % len(rects))

# 显示前100个候选框
for i, rect in enumerate(rects[:100]):
    x, y, w, h = rect
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果
cv2.imshow("Selective Search", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 目标检测算法 R-CNNN

R-CNN的全称是Region-CNN, 第一个成功将深度学习应用到目标检测上的算法,
传统的目标检测算法:
传统的目标检测方法大多以图像识别为基础。 一般可以在图片上使用穷举法选出所有物体可能出现的区域框,对这些区域框提取特征并使用图像识别方法分类, 得到所有分类成功的区域后,通过非极大值抑制(Non-maximumsuppression)输出结果。

R-CNN遵循传统目标检测的思路,同样采用提取框,对每个框提取特征、图像分类、 非极大值抑制四个步骤进行目标检测。只不过在提取特征这一步,将传统的特征换成了深度卷积网络提取的特征。

提取候选框使用的算法:
选择搜索方法是最为熟知的图像bouding boxes提取算法,由Koen
E.A于2011年提出,
原理:
图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes候选边界框。首先,对输入图像进行分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框,Selective Search策略其实是借助了层次聚类的思想将层次聚类的思想应用到区域的合并上面

R-CNN算法的过程:

对于一张图片,R-CNN基于selective search方法大约生成2000个候选区域,然后每个候选区域被resize成固定大小(warped扭曲/变形),并送入一个CNN模型中,最后得到一个特征向量。然后这个特征向量被送入一个多类别SVM分类器中,预测出候选区域中所含物体的属于每个类的概率值。每个类别训练一个SVM分类器,从特征向量中推断其属于该类别的概率大小。为了提升定位准确性,R-CNN最后又训练了一个边界框回归模型,通过边框回归模型对框的准确位置进行修正。

问题:

4. SPP-net

spatial pyramind pooling空间金字塔池化,
SPP-Net是一种可以不用考虑图像大小,输出图像固定长度网络结构,并且可以做到在图像变形情况下表现稳定。SPP-net的效果已经在不同的数据集上面得到验证,速度上比R-CNN快24-102倍。在ImageNet 2014的比赛中,此方法检测中第二,分类中第三。

对region of interest进行空间金字塔池化输出特征
对region of interest进行金字塔池化: 66 33 22 11 拉成一维的拼接

之前,所有的神经网络都是需要输入固定尺寸的图片,比如224224(ImageNet)、3232(LenNet)、96*96等。这样对于我们希望检测各种大小的图片的时候,需要经过crop,或者warp等一系列操作,这都在一定程度上导致图片信息的丢失和变形,限制了识别精确度,

从生理学角度出发,人眼看到一个图片时,大脑会首先认为这是一个整体,而不会进行crop和warp,所以更有可能的是,我们的大脑通过搜集一些浅层的信息,在更深层才识别出这些物体的类别,

SPP-Net对这些网络中存在的缺点进行了改进,基本思想是,输入整张图像,提取出整张图像的特征图,(一张图片只进行一次卷积的计算 输出特征图,这个特征图与原图具有相同的尺寸)
然后利用空间关系从整张图像的特征图中,在spatial pyramid pooling layer提取各个region proposal的特征。

region proposal (region of interest)候选框的提取 也是需要借助select search方法 然后再空间上 隐射到 卷积后的特征图上,

对这些特征图上的region proposal 进行spatial pyramid pooling,输出固定长度的(66+33+22+11) 特征向量

一个正常的深度网络由两部分组成,卷积部分和全连接部分,要求输入图像需要固定size的原因并不是卷积部分而是全连接部分。所以SPP层就作用在最后一层卷积之后,SPP层的输出就是固定大小。

SPP-net不仅允许测试的时候输入不同大小的图片,训练的时候也允许输入不同大小的图片,通过不同尺度的图片同时可以防止overfit。

相比于R-CNN提取2000个proposal,SPP-net只需要将整个图扔进去获取特征,这样操作速度提升了100倍左右

5. Fast R-CNN


流程:
将整张图片传入CNN网络得到特征图;
使用选择搜索算法得到候选区域;
RoI pooling 层被应用到所有候选区域,得到固定尺寸的特征,以传入全连接层;
softmax层用在全连接层上用于输出每个区域的类别,除了softmax层之外,线性回归层也被并行用于输出预测类别的边界框坐标。

什么是RoI pooling?

RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w * h) 的矩形框

训练:

FAST R-CNN 与 SPP-NET改进

  1. SPP 换成了 Rol Pooling
  2. 分类器 SVM 换成 softmax 多分类

6. Faster R-CNN


虽然SPPnet 和 Fast R-CNN相比于R-CNN减少了这些检测网络的运行时间,但是区域提议(region proposal)算法(SS)的计算过程浪费了大部分时间

卷积(conv)网络生成的特征图可用于生成区域提议,因此作者提出了基于卷积神经网络特征图的区域提议网络 RPN(Region Proposal Networks)
这不仅使得感兴趣区域提取的时间大大降低,而且感兴趣区域的质量也大大提高,进而检测效果更随之有了很大的进步

Faster R-CNN仅仅在Fast R-CNN的基础上改进了感兴趣区域提取环节

Faster R-CNN 是将 RPN 和 Fast R-CNN 将两个模块结合在一起而形成的统一的目标检测网络,第一个模块用于生成感兴趣区域,第二个模块用于判断目标种类并进行边框回归,因此也成为两阶段目标检测网络。网络运行的具体步骤如下:
将图像输入到预训练好的特征提取网络得到一个特征图。
RPN网络会根据特征图生成一系列可能包含待检测物体的建议区域。
根据第二步的提议区域在特征图中截取相应的特征,最后得到物体的种类并进行锚框的修正。

RPN(Region Proposal Networks)
(R-CNN、Fast R-CNN) 使用选择性搜索 (SS) 算法生成感兴趣区域,区域提议网络 (RPN) 的非常小的卷积网络代替了 SS,以生成感兴趣的区域
同时为了处理纵横比的变化,Faster R-CNN 引入了锚框的概念,用于缩放 ROI。 在性能方面,Faster R-CNN 比 R-CNN 快 250 倍,每张图像的测试时间从 50 秒减少到仅 0.2 秒。

总结:

  1. R-CNN 区域-卷积
    ss算法输出2k个region proposal 原图上切出对应的位置 都输入卷积 -- resize -- 分类+框位置

  2. SPP-net
    ss算法输出2k个region proposal先不用 原图进行一次卷积后的feature_map上 切出对应位置 -->SPP(多个尺寸不同的核) 输出固定的长度特征--分类+框位置

  3. FAST R-CNN
    SPP-net的基础上 :
    SPP池化 换成 Iol Pool
    分类器由SVM换成softmax

  4. TASTer R-CNN
    ss算法输出2k个输出候选框换成RPN

如何标记正负例:
和每一个gt的重叠比例IoU最大的那个bbox是正例(一张图会有很多gt)
对于任意的bbox和任意gt的IoU的比例大于0.7就是正例
对于任意的bbox和任意gt的IoU的比例小于0.3就是负例
其他的则舍弃不用


Lambda控制更重视回归还是分类
Pi是真实的类别标签0或1,对于回归是负例就不加调整损失了
一张图片有很多个anchor,用i来表示index第几个
早期实现及公开的代码中,λ=10,cls项的归一化值为mini-batch的大小,即Ncls=256,reg项的归一化值为anchor位置的数量,即Nreg~2,400,这样cls和reg项差不多是等权重的
对于回归是负例就不加调整损失了,所以只有正例的才去算回归
X预测出来的,Xa候选框的,X
是真实的框的

训练:
每一次训练只拿一张图像
每一张图像进来都缩放,使得短的边是600个像素点
从候选框里过滤出来256个框,找128个正样本,找128个负样本,如果正样本不够,就用负样本
关于过滤,越界的框就不要了,60409=20000.除掉越界的大概6000个,但是使用模型的时候,越界的框是clip一下后还是要的
6000个框还是会重叠在一起,使用NMS非极大值抑制,对于6000 个候选框如果IoU的比例大于0.7就需要判断保留谁?使用分类的
score看一下谁大就保留谁NMS之后大概2000个,然后取一个Top-N

NMS
非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大概率分别为A、B、C、D、E、F
从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我
们保留下来的第二个矩形框
就这样一直重复,找到所有被保留下来的矩形框

代码实现:

mAP:

补充:

7. YOLO

posted @ 2024-02-29 23:58  jack-chen666  阅读(25)  评论(0编辑  收藏  举报