目标检测介绍
前言
在深度学习出现之前,传统的目标检测方法大概分为区域选择(滑窗)、特征提取(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.****.net/weixin_41923961/article/details/80113669