每日算法:目标检测算法

昨天贪玩了没有学。                                                                                         --wudibooo

0 简介

目标检测算法分为两类

两步走:先进行区域推荐,而后进行目标分类

                R-CNN、SPP-net、Fast R-CNN、Faster R-CRNN

端到端:用一个网络一部到位

                YOLO、SSD

 第一个:两个输出,一个用于分类,一个用于做盒子定位 

         分类:全连接层输出n分类,用Crossentropy来优化

        盒子定位:其实就是数值回归,全连接层输出四个值(x , y , h, w),计算bbox预测点和真实点之间的差距,用MSE来优化

BBOX的名字:真实值ground-truth bounding box,   预测值  predice bounding box


        一开始我们解决目标检测问题的想法是,先用一个bbox把物体画出来,然后输入进CNN中提取图片特征,再将输出分别输入进一个类别分类器和bbox回归器中,来进行类别的预测和bbox的拟合。

        但是在设计时我们只能固定bbox的大小,而且一次只能输出一个物体,为了解决这个问题,就提出了over-feat模型,一种非常暴力的方法。

        首先要提前设定K个不同大小的滑动窗口,每个窗口提取M个图片,总共可得到K *M 个图片,从左到右,从上到下不断扫描,这样就可以得到不同的物体,再把此作为后续的输入,方法是可行的,但是看得出计算量非常大。

        为解决如何更好的选取我们需要的区域,就出现了下面许多优秀的算法。


1 R-CNN算法

        R-CNN(Region with CNN feature)算法是目标检测里面常用的一种算法,主要包含3个部分,候选区域的选择,CNN特征提取,分类和bbox的回归。

每日算法:目标检测算法_第1张图片 模型结构


1.1候选区域的选择

 候选区域叫法:ROI,region proposed, anchor 

       ROI(region of instere),为了解决over-feat那种选区域的方式,在RCNN中,提出了一种SS(SelectiveSearch)算法,具体步骤如下:

  • 首先将每个像素作为一组,生成一个区域集合S;
  • 计算出S中的子集之间的相似度,将相似度;
  • 将相识度最高的子集进行合并,形成新的子集R;
  • 计算新的子集R和S中剩下的子集之间的相似度;
  • 重复第3个步骤,只到最后生成新的R时,S中没有子集了;
    每日算法:目标检测算法_第2张图片 SS效果

        在RCNN的paper中,利用了这种方法,从一张图片上提取出约2000个候选区域,因为这个是要作为后面CNN层的输入,大小要固定,所有要将所有的候选区域进行Crop/Warp缩放paper使用的是VGG,所有缩放成224*224大小的图片。


1.2 CNN特征提取

        对前面提取到的候选区域进行特征提取,具体就自己去看一些CNN网络,论文使用了VGG,输入为2000*224*244。


1.3 分类和BBox的回归

        先讲分类,原文使用的是SVM支持向量机(不太了解可以看看我之前的笔记,点这里)来对图片做分类,一共有20个类别,使用了OVR的方法,每个SVM都对该类别进行一次判断,得到一个概率值,这样20个就得到一个【2000*20】的矩阵,2000代表2000个候选区域,20个类别。

        Bbox的回归,一般使用NMS(非最大抑制)的方法,就选出最佳个框框,如下步骤:

  • 对所有的候选区域2000个进行一次概率筛选,阈值设置为0.5,小于的都扔掉;
  • 处理剩下的候选区域
    • 假如真实物体有2(N)个,候选框有5(P)个,计算N中每个物体和所有P之间的交并比IoU,得到P中每一个N的最高交并比的那个;
    • 每一轮只能处理一个物体,所以要处理两轮,比如下图两个车,我们就先选择计算左边那辆的IoU,选出最好的(A),在计算右边那辆,留下(B);

      每日算法:目标检测算法_第3张图片

        这里就结束了?不够。


 1.4 修正候选区域

        SS给的框框使我们一开始设定好的,不够完美,与真实的bbox还有点差距,在RCNN中就提出了一个bbox regressor,在bbox regressor中,会对预测bbox 【x ,y ,h ,w 】和真实的bbox【x ,y ,h ,w 】进行线性回归。

每日算法:目标检测算法_第4张图片

         anchor是NMS方法最后得到的框框,也是我们叫的bbox,先对这个anchor乘上w进行一次变化得到pred,再计算pred和GT之间的loss,再不断优化。


1.5 平均准确率mean average accuracy

         IoU:就是图像的交集 / 并集,用来评价bbox的。

每日算法:目标检测算法_第5张图片


        MAP:定义为多个分类任务的AP平均值,评价分类预测的,步骤如下:

  • 对于其中一个类别C,将算法输出的所有C类别的预测框,按SVM给的分数排序。
  • 设定不同的k值,选择top k个预测框,计算FP和TP,计算precision和AP
    • 举例:一共10个预测框,我们k = 5,就选了前5个,按照我们下面提到的样本标记方法进行标记,然后得到FP和TP,FP(预测为正样本,实际是负样本),TP(预测为正样本,实际是也是正样本),再计算precision,我们在令k= 6 ,k=4,k=7,这样求出AP
  • 将所有类别的AP求和在取平均就是MAP。

1.6 训练过程

标记样本:

  • 用SS方法对每个训练样本选取2000个候选区域,对每个region proposed都与ground truth计算IOU,设置阈值对样本进行标记,大于阈值的就标记为该类别的正样本,小于阈值的就标记为该类别的负样本。
  • 正样本,反样本的标记主要是用来训练SVM的。
  • 不是所有的候选区域都会拿去训练,分批次,一次32正,96负。保证正负样本比例1:3,总2000张。

训练特征提取器CNN:

  • 对候选区域进行大小调整【2000*224*224】,统一大小后输入CNN中提取特征,模型可以使用预训练过的。
  • 将样本输入进行训练, 修改全连接最后一层,1000个类别输出,改为C+1个类别输出(其中C是真实需要预测的类别个数,1是背景类)。

训练SVM分类器:

  • 将CNN的全连接层前的最后一层输出【2000*4096】作为输入,进行分类器的训练,
  • 针对每个类别训练一个SVM的二分类器,举例:狗的SVM分类器,输入维度是[2000 ∗ 4096] ,输出为[2000 * 1],target还是之前第一步标记是否属于该类别狗。
  • 有20个类别,就训练20个SVM,得到输出[ 2000*20] 。

训练bbox regressor:

  • 将CNN的全连接层前的最后一层输出【2000*4096】作为输入,进行bbox regressor器的训练,输出为[2000*4] (x,y,h,w)
  • 对所有候选框进行一次筛选,与GT的IOU最大的留下,大于设置IOU阈值的留下,只训练这些,target是GT,一般用MSE计算loss,每一个类别都要训练一个。
  • 最后训练修补的权重W

​​​​​​​

图例:转载

每日算法:目标检测算法_第6张图片


1.7 预测过程

  1. 用SS方法选取2000个region proposed。
  2. 特征提取。
  3. SVM分类器进行预测评分。
  4. 采用NMS来进行过滤,得到每个物体最大的region proposed。
  5. 修补bbox。

1.8 不足

        计算量还是很大,而且候选区域的要进行crop和wrap,可能会丢失信息。

        

 写到这里我感觉太费时间,以后直接贴链接

你可能感兴趣的:(算法,python,计算机视觉,深度学习)