目标检测介绍

前言

在深度学习出现之前,传统的目标检测方法大概分为区域选择(滑窗)、特征提取(SIFT、HOG等)、分类器(SVM、Adaboost等)三个部分,其主要问题有两方面:一方面滑窗选择策略没有针对性、时间复杂度高,窗口冗余;另一方面手工设计的特征鲁棒性较差。自深度学习出现之后,目标检测取得了巨大的突破,最瞩目的两个方向有:1 以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等);2 以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等)。本篇将对目标检测进行总体介绍。

目标检测

从图像识别的任务说起
这里有一个图像任务:
既要把图中的物体识别出来,又要用方框框出它的位置。

 

上面的任务用专业的说法就是:图像识别+定位
图像识别(classification):
输入:图片
输出:物体的类别
评估方法:准确率

定位(localization):
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU ) 

这里出现了专业的概念:IOU

上图IOU的计算:IOU_W = x1+w1+w2-x4,IOU_H = y2+h1+h2-y3,IOU_rate = (IOU_W*IOU_H)/(wight1*height1+wight2*height2-IOU_W*IOU_H)

IOU代码实现:

import numpy as np
def IOU(box1,box2):
    width1 = np.abs(box1[2] - box1[0])
    height1 = np.abs(box1[3] - box1[1])
    width2 = np.abs(box2[2] - box2[0])
    height2 = np.abs(box2[3] - box2[1])
    x_min = min(box1[0],box1[2],box2[0],box2[2])
    x_max = max(box1[0],box1[2],box2[0],box2[2])
    y_min = min(box1[1],box1[3],box2[1],box2[3])
    y_max = max(box1[1],box1[3],box2[1],box2[3])
    iou_width = x_min + width1 + width2 - x_max
    iou_height = y_min + height1 + height2 - y_max
    if iou_height <=0 or iou_width <=0:
        iou_rate = 0
    else:
        iou_rate = (iou_height * iou_width)/(width1*height1+width2*height2-iou_height * iou_width)
    return iou_rate
#(x1,y1,x2,y2)
box1 = [0,0,2,1]
box2 = [0,0,1,2]
print(IOU(box1,box2))

 

卷积神经网络CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务了,我们只需要添加一些额外的功能来完成定位任务即可。

定位的问题的解决思路有哪些?
思路一:看做回归问题
看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。



步骤1:
  • 先解决简单问题, 搭一个识别图像的神经网络

 

步骤2:
  • 在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)
  • 成为classification + regression模式


步骤3:
  • Regression那个部分用欧氏距离损失
  • 使用SGD训练

步骤4:
  • 预测阶段把2个头部拼上
  • 完成不同的功能

思路二:取图像窗口
  • 还是刚才的classification + regression思路
  • 咱们取不同的大小的“框”
  • 让框出现在不同的位置,得出这个框的判定得分
  • 取得分最高的那个框
左上角的黑框:得分0.5

右上角的黑框:得分0.75

左下角的黑框:得分0.6

右下角的黑框:得分0.8

根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

疑惑:框要取多大?
取不同的框,依次从左上角扫到右下角。非常粗暴啊。

总结一下思路:
对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。

物体检测(Object Detection)
当图像有很多物体怎么办的?难度可是一下暴增啊。

那任务就变成了:多物体识别+定位多个物体
那把这个任务看做分类问题?

看成分类问题有何不妥?
  • 你需要找很多位置, 给很多个不同大小的框
  • 你还需要对框内的图像分类
  • 当然, 如果你的GPU很强大, 恩, 那加油做吧…

看做classification, 有没有办法优化下?我可不想试那么多框那么多位置啊!
有人想到一个好方法:
找出可能含有物体的框(也就是候选框,比如选1000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举的所有框了。



大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。
以下是各种选定候选框的方法的性能对比。

下节将要介绍基于候选框的R-CNN

参考资料:

http://lanbing510.info/2017/08/24/RCNN-FastRCNN-FasterRCNN.html

https://blog.csdn.net/weixin_41923961/article/details/80113669

https://blog.csdn.net/yangzishiw/article/details/84760273

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值